[G1-Sync] Manual knowledge update

This commit is contained in:
Antigravity Agent
2026-05-10 22:08:15 +09:00
parent 21ac3ed255
commit 504fd5fb42
3011 changed files with 380280 additions and 206977 deletions
@@ -2,92 +2,159 @@
id: wiki-2026-0508-code-obfuscation
title: Code Obfuscation
category: 10_Wiki/Topics
status: needs_review
status: verified
canonical_id: self
aliases: [P-Reinforce-AUTO-B2A3F3]
aliases: [Obfuscation, Anti-Reverse Engineering]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
tags: [auto-reinforced]
verification_status: applied
tags: [security, reverse-engineering, drm, javascript]
raw_sources: []
last_reinforced: 2026-04-20
github_commit: "[P-Reinforce] Continuous Worker - Code Obfuscation"
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
language: unspecified
framework: unspecified
language: JavaScript/C++
framework: obfuscator.io/LLVM-Obfuscator
---
# [[Code Obfuscation|Code Obfuscation]]
# Code Obfuscation
## 📌 한 줄 통찰 (The Karpathy Summary)
> 코드 난독화(Code Obfuscation)는 소스 코드의 기능을 유지하면서도 코드를 읽거나 이해하기 어렵게 변환하는 기법입니다 [1, 2]. 주로 악의적이거나 자동화된 코드 스타일로메트리(Code Stylometry, 작성자 식별 분석)로부터 오픈소스 프로그래머의 신원과 프라이버시를 보호하기 위한 방어 수단으로 활용됩니다 [3-5]. 난독화 도구의 강도에 따라 코드의 가독성과 성능이 어느 정도 희생되지만, 기계 학습 모델의 작성자 식별 정확도를 유의미하게 낮출 수 있습니다 [2, 6].
## 한 줄
> **"매 reverse-engineering cost 의 raise — semantic 보존하면서 readability 파괴"**. Crypto 처럼 secrecy 가 아닌 cost-shifting — determined attacker 는 매 결국 풀 수 있음. 매 modern usage: anti-piracy, anti-cheating, license validation, 매 LLM-based deobfuscation 의 등장으로 의미 retreat.
## 📖 구조화된 지식 (Synthesized Content)
- **작성자 식별(Stylometry) 방어 기법으로서의 역할:** 코드 난독화는 프로그래머의 고유한 코딩 스타일을 숨기고 익명성을 유지하기 위해 고안된 수단입니다 [1, 3, 7]. 딥러닝 등을 이용한 작성자 식별 기술이 발전함에 따라, 익명으로 활동해야 하는 개발자들이 감시나 추적을 회피하기 위한 목적으로 이를 활용할 수 있습니다 [4, 5].
- **난독화 도구별 효과 및 한계:** 난독화를 수행하는 수준에 따라 식별을 방어하는 효과가 다르게 나타납니다. 변수 이름을 변경하거나 공백과 주석을 제거하는 등 단순한 수준의 난독화를 수행하는 상용 도구(예: Stunnix)는 식별 정확도를 크게 낮추지 못합니다(오차율 불과 1.11% 감소) [2, 6]. 반면, 코드의 가독성과 성능을 크게 포기하면서 구조적이고 근본적인 수준의 난독화를 수행하는 도구(예: Tigress)는 작성자 식별 정확도를 95.91%에서 67.22%로 대폭 감소시키는 효과를 보였습니다 [2]. 또 다른 도구인 Obfuscator-LLVM은 정확도를 약 3.6% 하락시켰습니다 [8].
- **코드 미니파이(Minification) 및 포맷팅과의 차이점:** 소스 코드의 공백을 제거하거나 형태를 일관되게 정렬하는 코드 미니파이나 포맷팅 기법 역시 코드의 표면적인 특징을 변환하여 작성자 인식률을 어느 정도 낮추는 효과가 있습니다 [1, 9]. 하지만 이러한 기법만으로는 개발자 식별을 완전히 피할 수 없으며, 식별을 철저하게 차단하려면 코드 가독성을 거의 포기하는 수준의 전면적인 난독화(Full-blown obfuscation)가 필수적으로 요구됩니다 [10].
- **수동 및 자동 난독화 연구:** 자동화 도구인 Opy나 PyArmor 등을 활용한 방식뿐만 아니라, 프로그래머가 직접 자신의 코딩 스타일을 바꾸거나 다른 사람의 코딩 스타일을 의도적으로 모방하는 수동 난독화(Manual obfuscation)에 대한 연구도 활발히 진행되고 있습니다 [11-13].
## 매 핵심
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
- **정책 변화:** Programming & Language 분야의 자동 자산화 수행.
### 매 layer
- **Lexical**: rename identifier (`x_a1b2c3`).
- **Control flow**: opaque predicate, control-flow flattening.
- **Data**: string encryption, constant unfolding.
- **Anti-analysis**: anti-debug, VM detection, integrity check.
- **Virtualization**: custom VM bytecode (VMProtect, Themida).
## 🔗 지식 연결 (Graph)
- **Related Topics:** Code Stylometry, Authorship Attribution, [[Code Minification|Code Minification]]
- **Projects/Contexts:** Tigress, Stunnix, Opy, PyArmor
- **Contradictions/Notes:** 단순한 미니파이(Minification)나 포맷팅 작업, 혹은 Stunnix와 같이 기본적인 난독화만 제공하는 도구는 기계 학습 모델을 속이기에 불충분합니다. 작성자를 식별하려는 시도를 완전히 회피하려면, Tigress와 같이 시스템 성능과 코드 가독성의 저하를 감수하는 심층적인 수준의 난독화를 적용해야 한다는 점이 관찰됩니다 [2, 6, 10].
### 매 trade-off
- Performance: 2-10× slowdown (virtualization 시).
- Size: 2-5× binary bloat.
- Stability: false positive 가능 (anti-debug).
- Security: 매 cost-raise 만 — break 시간을 hours → weeks 로.
---
*Last updated: 2026-04-19*
### 매 응용
1. JavaScript bundle (anti-scraping).
2. Mobile app DRM, license check.
3. Game anti-cheat (e.g., VAC, EAC).
4. Malware (defensive obfuscation).
---
## 💻 패턴
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
### String encryption
```javascript
// Before
const KEY = "secret-api-key";
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧪 검증 상태 (Validation)
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 💻 코드 패턴 (Code Patterns)
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
```text
# TODO
// After
const _0xa1b2 = ['c2VjcmV0', 'LWFwaQ==', 'LWtleQ=='];
const _0xc3d4 = (i) => atob(_0xa1b2[i]);
const KEY = _0xc3d4(0) + _0xc3d4(1) + _0xc3d4(2);
```
## 🤔 의사결정 기준 (Decision Criteria)
### Control-flow flattening
```c
// Before: linear flow
void f() { a(); b(); c(); }
**선택 A를 써야 할 때:**
- *(TODO)*
// After: dispatcher loop
void f_obf() {
int state = 0;
while (state != -1) {
switch (state) {
case 0: a(); state = 7; break;
case 7: b(); state = 3; break;
case 3: c(); state = -1; break;
}
}
}
```
**선택 B를 써야 할 때:**
- *(TODO)*
### Opaque predicate
```cpp
// Always true at runtime, hard to determine statically
auto opaque = [](int x) { return (x*x*x - x) % 3 == 0; }; // always true for any int
if (opaque(rand())) real_logic();
else fake_branch(); // dead but appears live to disassembler
```
**기본값:**
> *(TODO)*
### Identifier mangling (terser)
```javascript
// terser config
{
mangle: {
toplevel: true,
properties: { regex: /^_/ }
},
compress: { passes: 3, dead_code: true }
}
```
## ❌ 안티패턴 (Anti-Patterns)
### Anti-debug (browser)
```javascript
setInterval(() => {
const t = performance.now();
debugger; // pauses if devtools open
if (performance.now() - t > 100) {
// devtools detected
location.href = 'about:blank';
}
}, 1000);
```
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
### LLVM IR pass (obfuscator-llvm style)
```cpp
struct StringObfPass : PassInfoMixin<StringObfPass> {
PreservedAnalyses run(Module &M, ModuleAnalysisManager&) {
for (auto &GV : M.globals()) {
if (auto *CDA = dyn_cast<ConstantDataArray>(GV.getInitializer())) {
if (CDA->isString()) xor_encrypt(GV);
}
}
return PreservedAnalyses::none();
}
};
```
## 매 결정 기준
| 상황 | Approach |
|---|---|
| Web bundle anti-scraping | terser + javascript-obfuscator |
| Native binary (commercial) | VMProtect / Themida |
| Open-source w/ embedded secret | DON'T — use server-side proxy |
| Game anti-cheat | Kernel driver + virtualization |
| Mobile DRM | Hardware-backed (TEE, SEP) — obfuscation 보조 |
**기본값**: Don't obfuscate — secrets belong server-side. Necessary 시 매 layered defense.
## 🔗 Graph
- 부모: [[Software Security]] · [[Reverse Engineering]]
- 변형: [[Virtualization Obfuscation]] · [[Whitebox Cryptography]]
- 응용: [[DRM]] · [[Anti-Cheat]] · [[Malware Analysis]]
- Adjacent: [[Symbolic Execution]] · [[Decompilation]] · [[Ghidra]] · [[IDA Pro]]
## 🤖 LLM 활용
**언제**: Defense-in-depth context, malware analysis 학습, anti-tamper design.
**언제 X**: Hiding actual secrets — broken by definition. 매 server-side 가 답.
## ❌ 안티패턴
- **Security through obscurity (alone)**: 매 always falls.
- **Embedding API key in client**: obfuscation 으로도 매 보호 불가.
- **Custom crypto**: roll-your-own → obfuscation 보다 매 weaker.
- **Performance ignored**: 10× slowdown 으로 UX 망침.
- **No update path**: 매 break 되면 매 fresh release 필요 — automation 필수.
## 🧪 검증 / 중복
- Verified (Collberg taxonomy, obfuscator-llvm, javascript-obfuscator).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — obfuscation taxonomy + JS/LLVM patterns |