난독화(소프트웨어)
Obfuscation (software)시리즈의 일부 |
정보 보안 |
---|
관련 보안 카테고리 |
위협 |
|
방어. |
소프트웨어 개발에서 난독화는 인간이 이해하기 어려운 소스나 기계 코드를 만드는 행위이다.자연어에서의 난독화와 마찬가지로 문장을 구성하기 위해 불필요하게 우회적인 표현을 사용할 수 있습니다.프로그래머는 의도적으로 코드를 난독화하여 목적(무명화를 통한 보안)이나 그 논리 또는 그 안에 내재된 암묵적 가치를 숨길 수 있습니다.주로 조작을 방지하거나 역엔지니어링을 저지하거나 심지어 소스 코드를 읽는 누군가를 위한 퍼즐 또는 오락적 도전을 생성하기 위해서입니다.이 작업은 수동으로 수행하거나 자동화된 도구를 사용하여 수행할 수 있습니다. 자동화된 도구는 업계에서 [1]선호되는 기술입니다.
개요
일부 언어의 아키텍처와 특성은 다른 [2][3]언어보다 난독화를 쉽게 만들 수 있습니다.C,[4] C++[5][6] 및 Perl 프로그래밍[7] 언어는 난독화가 쉬운 언어의 예입니다.Haskell은 또한 구조가 꽤 다르지만 꽤[8] 완고하다.
언어를 폐지할 수 있게 만드는 속성은 즉시 명백하지 않다.
레크리에이션 난독화
난독화된 소스 코드를 쓰고 읽는 것은 두뇌 티저가 될 수 있다.국제 난독화 C코드 콘테스트, 난독화 펄 콘테스트 등 많은 프로그래밍 콘테스트가 가장 창의적인 난독화 코드를 보상합니다.
난독화 유형에는 간단한 키워드 치환, 예술적 효과를 창출하기 위한 공백 사용 또는 미사용, 자기 생성 또는 고압축 프로그램 등이 있습니다.
Nick Montfort에 따르면 기술에는 다음이 포함됩니다.
- 무의미하거나 기만적인 방법으로 변수를 명명하는 난독화
- 일부 실제 코드를 코멘트처럼 보이게 하거나 구문을 데이터와 혼동하는 등 데이터/코드/문자의 혼동을 포함한다.
- 이중 코딩은 코드를 시 형식이나 흥미로운 [9]모양으로 표시할 수 있습니다.
Perl 프로그래머의 시그니처에는 짧은 난독화 Perl 프로그램을 사용할 수 있습니다.이것들은 JAPH('그냥 다른 Perl 해커')[10]입니다.
예
이것은 1988년[11] Ian Philipps가 작성한 국제 난독화 C 코드 콘테스트의 우승작이며, 그 후 Thomas [12]Ball이 리버스 엔지니어링한 것입니다.
/* 컴파일 성공 가능성이 가장 낮다: 영국 케임브리지, 케임브리지 컨설턴트, Ian Philipps씨 */ #실패하다 <stdio.h> 주된(t,_,a) 차 * a; { 돌아가다! 0< >t? t< >3? 주된(-79,-13,a+ 주된(-87,1-_, 주된(-86, 0, a+1 ) +a)): 1, t< >_? 주된(t+1, _, a ) :3, 주된 ( -94, -27+t, a ) & &t == 2 ?_ < >13 ? 주된 ( 2, _+1, %s %d %d\n" ) :9:16: t< >0? t< >-72? 주된( _, t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+{*+/w{%+/w#q#n+/{l,+/n{n++/#n+/#;\" #q#n++k#;*++'r:'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;\ q#'r'eKK#}w'r}eKK{nl]/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;#){nl]!/n{n#'; \ r{#w'r nc{nl}'/#{l,+'K {rw' iK{;[nl]'/w#q#\ \ n'wk nw' iwk{KK{nl]!/w{%'l#w#' i;:{nl]'/*{q#ld;r'}{nlwb!/*de}'c;\ {nl'-{}rw]'/+,}##'*}#nc,#nw]'/+kd'+e}+;\ #'rdq#w! nrdq') }+}{n'')+}##(!/)") : t< >-50? _==*a ? 풋차(31[a]): 주된(-65,_,a+1) : 주된((*a == '/') + t, _, a + 1 ) : 0< >t? 주된 ( 2, 2 , %s) :*a=='/' 주된(0, 주된(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m.vpbks,fxntdCegiry") ,a+1);}
컴파일하여 실행 시 The 12 Days of Christmas의 12절을 생성하는 C 프로그램입니다.코드 내 부호화된 형식으로 시에 필요한 모든 문자열이 포함되어 있습니다.
같은 해 수상하지 못한 출품작인 다음 예에서는 공백의 창의적 사용을 보여 줍니다. [13]임의 길이의 미로를 생성합니다.
차*M,A,Z,E=40,J[40],T[40];주된(C){위해서(*J=A=스캔(M=%d,&C); -- E; J[ E] =T [E ]= E) 인쇄물("._"); 위해서(;(A-=Z=!Z) (인쇄물("\n" ) , A = 39 ,C -- ) ; Z 인쇄물 (M ))M[Z]=Z[A-(E =A[J-Z])&&!C & A == T[ A] 6<< >27< >랜드()!C&!Z?J[T[E]=T[A]]=E,J[T[A]=A-Z]=A,"_.":" "];}
ANSI 호환 C 컴파일러는 상수 문자열을 덮어쓸 수 없습니다. 이 경우 "*M"을 "M[3]"으로 변경하고 "M="을 생략하면 됩니다.
다음 예시는 제19회 IOCC의 Best of Show 엔트리인 Oscar Toledo Gutiéres가 CP/M-80을 부팅하고 CP/M 애플리케이션을 [14]실행할 수 있는 단말기와 디스크컨트롤러를 갖춘8080 에뮬레이터를 실장하고 있습니다.
#실패하다 <stdio.h> #420n(o,p,e)=y=(z=a(e)%16p x%16p o,a(e)p x p o,h() #2011s 6[o] #cap p z=l[d(9)] l[d(9)+1] < 8,1 <(9[o]+=2) + +8[o] #정의 Q a(7) #param w 254>(9[o]-=2) --8[o],l[d(9)]=z,l[1+d(9)]=z>8 #정의 O):( #cisco b(y&1?~s:s)>>"\6\0\2\7gy/2]& 1 ? 0 : ( #420 S?(z-=) #sec a(f)*((7&f)-6)?&o[f&7]:&l[d(5)] #정의 C S 5 S 3 #정의 D(E)x/8!=16+E&198+E*8!=x? #정의 B(C)fclos(C) #420q (c+=2,0[c-2] 1 [c-2]<8) #140m x=64&x?*c++:a(x), #420 A(F)=fopen(F), rb+" 서명되어 있지 않다 차 o[10],l[78114],*c=l,*k=l #125 d(e)o[e]+256*o[e-1] #128 h(l)s=l>>8&1 128&y!(y&255)*64 16&z 2,y^=y>4,y^=y<2,y^=~y>1,s=y&4 +64506; e,V,v,u,x,y,z,Z; 주된(r,U)차**U;{ { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { ; } } { { { } } } { { ; } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } { { { } } } 위해서(v A((u A((e A((r-2?0:(V A(1[U])),'C') ),시스템.("stty raw - pin 0"),읽다(l,78114,1,e),B(e),'B')),"A")); 118-(x =*c++); (y=x/8%8,z=(x&199)-4 S 1 S 1 S 186 S 2 S 2 S 3 S 0,r=(y>5)*2+y,z=(x& 207)-1 S 2 S 6 S 2 S 182 S 4)?D(0)D(1)D(2)D(3)D(4)D(5)D(6)D(7)(z=x-2 C C C C C C C C+129 S 6 S 4 S 6 S 8 S 8 S 6 S 2 S 2 S 12)?x/64-1?((0 O a(y)=a(x) O 9 [o]=a(5),8[o]=a(4) O 237==*c++?((인트 (*)())(2-*c++?기입하다:읽다))(l+*k+1[k]* 256,128,1,(구하다(y=5[k]-1?u:v,((3[k] 4[k]<< >8)<< >7 2[k])<< >7,Q=0),y)):0 O y=a(5 ),z=a(4),a(5)=a(3),a(4)=a(2),a(3)=y,a(2)=z O c=l+d(5) O y=l[x=d(9)],z=l[++x] ,x[l]=a(4),l[--x]=a(5),a(5)=y,a(4)=z O 2-*c?Z 읽어주세요(0,&Z,1),1&*c++?Q=Z,Z=0:( Q=!!Z):(c++,Q=r=V?fgetc(V):-1,s=s&~1 r< >0) O++c,쓰다(1,&7[o],1) O z=c+2-l,w, c=l+q O p,c=l+z O c=l+q O s^=1 O Q=q[l] O s=1 O q[l]=Q O Q=~Q O a(5)=l[x=q] ,a(4)=l[++x] O s=s&16 9< >Q%16?Q+=6,16:0,z=s=1&s Q>159?Q+=96,1:0,y=Q,h(s<< >8) O l[x=q]=a(5),l[++x]=a(4) O x=Q%2,Q=Q/2+s%2*128,s=s&~1 x O Q=l[d(3)]O x=Q / 128,Q=Q*2+s%2,s=s&~1 x O l[d(3)]=Q O s=s&~1 1&Q,Q=Q/2 Q<< >7 O Q=l[d(1)]O s=~1 &s Q>>7,Q=Q*2 Q>>7 O l[d(1)]=Q O m y n(0,-,7)y) O m z=0,y=Q=x,h(y) O m z=0, y=Q^=x,h(y) O m z=Q*2 2*x,y=Q&=x,h(y) O m Q n(s%2,-,7)y) O m Q n(0,-,7)y) O m Q n(s%2,+,7)y) O m Q n(0,+,7)y) O z=r-8?d(r+1):s Q<< >8,w O p,r-8?o[r+1]=z,r [o]=z>>8:(s=~40&z 2,Q=z>>8) O r[o]-- --o[r-1]O a(5)=z=a(5)+r[o],a(4)=z=a(4) +o[r-1]+z/256,s=~1&s z>>8 O ++o[r+1] r[o]++O o[r+1]=*c++,r[o]=*c++O z=c-l,w ,c=y*8+l O x=q,b z=c-l,w,c=l+x) O x=q,b c=l+x) O b p,c=l+z) O a(y)=*c++O r=y ,x=0,a(r)n(1,-,y)s<< >8) O r=y,x=0,a(r)n(1,+,y)s<< >8)))); 시스템.("잘 익은 메아리"); B((B((V?B(V):0,u)),v)); } //print("Hello world")
JAPH의 예를 다음에 나타냅니다.
@P=분열되다//,".URRU\c8R";@d=분열되다//,"\nrekcah sinU / lreP rehtona tuJ";후보선수 p{ @p{"r$p","u$p"}=(P,P);파이프"r$p","u$p";++p달러;($q*=2)+=f달러=!포크;지도{P달러=P달러[f달러^주문하다 (p달러{$_})&6];p달러{$_}=/ ^$P/ix?$P: close$_}열쇠들.%p}p;p;p;p;p;지도{p달러{$_}=~/^[P.]/& & 가까운.$_}%p;잠깐만요. 까지$?;지도{/^r/& &<$_>}%p;$_=d달러[$q];수면. 랜드(2)한다면/\S/;인쇄물
이렇게 하면 [15]"Just another Perl / Unix hacker"라는 텍스트가 지연과 함께 한 번에 여러 문자씩 천천히 표시됩니다.
일부 Python 예는 공식 Python 프로그래밍 FAQ 및 다른 [16][17][18]곳에서 찾을 수 있습니다.
난독화의 이점
로딩 시간 단축
웹 페이지에서 사용되는 스크립트는 네트워크를 통해 해당 스크립트를 실행하는 사용자 에이전트에 전송해야 합니다.크기가 작을수록 다운로드 속도가 빨라집니다.이러한 사용 사례에서는 최소화(상대적으로 사소한 형태의 난독화)가 실질적인 이점을 창출할 수 있습니다.
메모리 사용량 감소
오래된 런타임 인터프리터 언어(일반적으로 스크립트라고 불림)에서는 BASIC의 이전 버전과 마찬가지로 프로그램 실행 속도가 빨라지고 RAM 사용률이 낮아졌습니다.단순히 말하면 빈 문자만 포함되어 있으면 프로그램 실행 속도가 빨라집니다.
영업 비밀 보호
웹 페이지의 JavaScript와 같이 프로그램의 소스 코드를 사용자에게 전송해야 하는 경우, 사용자는 프로그램에 포함된 모든 영업 비밀, 라이센스 메커니즘 또는 기타 지적 재산에 액세스할 수 있습니다.난독화는 코드를 이해하고 수정하는 것을 어렵게 만든다.
데스크톱 프로그램에는 코드를 난독화하는 기능이 포함되어 있는 경우가 있습니다.일부 프로그램은 전체 코드를 디스크에 저장하지 않고 실행 시 웹을 통해 바이너리 코드의 일부를 가져올 수 있습니다.또한 압축 및/또는 암호화를 사용하여 분해 프로세스에 추가 단계를 추가할 수도 있습니다.
회피 방지
이러한 경우 프로그램을 난독화하면 사용자가 라이센스 메커니즘을 우회하거나 프로그램 공급업체가 숨기려 하는 정보를 얻는 것이 어려워질 수 있습니다.멀티플레이어 게임 해킹을 더 어렵게 만드는 데도 사용할 수 있습니다.
바이러스 검출 방지
악성 프로그램은 난독화를 사용하여 실제 작업을 숨길 수 있습니다.대부분의 사용자는 이러한 프로그램을 읽지 않습니다.또한 이러한 프로그램을 읽은 사용자는 일반적으로 난독화를 복구하는 데 도움이 되는 소프트웨어 도구에 액세스할 수 있습니다.따라서 이 전략은 유효성이 제한됩니다.
난독화의 단점
- 난독화가 프로그램 읽기, 쓰기 및 역엔지니어링을 어렵게 만들 수 있지만 반드시 [19]불가능하게 만들지는 않습니다.
- 개발자의 빌드 프로세스에 시간과 복잡성을 더합니다.
- 소프트웨어가 난독화된 후 디버깅 문제를 매우 어렵게 만들 수 있습니다.
- 일단 코드가 포기웨어가 되어 더 이상 유지보수가 되지 않게 되면, 취미 생활자는 프로그램을 유지하거나, 모드를 추가하거나, 더 잘 이해하기를 원할 수 있습니다.난독화는 최종 사용자가 코드로 유용한 작업을 수행하는 것을 어렵게 만듭니다.
- 특정 종류의 난독화(예를 들어 로컬 바이너리뿐만 아니라 필요에 따라 웹 서버에서 미니 바이너리를 다운로드하는 코드)는 성능을 저하시키거나 인터넷을 필요로 할 수 있습니다.
디컴파일러
디컴파일러는 실행 파일 또는 라이브러리에서 소스 코드를 리버스 엔지니어링할 수 있습니다.디컴파일은 "man-in-the-middle"로 알려진 기존의 암호화 공격에 따라 man-at-the-end 공격이라고도 합니다.이 소스코드는 판독이 어려운 경우가 많지만, 유저의 손에 맡겨집니다.소스 코드는 랜덤함수와 변수 이름, 잘못된 변수 유형 및 원래 소스 코드와 다른 로직을 사용할 수 있습니다(컴파일러 최적화로 인해).
암호화 난독화
최근 암호학자들은 암호를 해독하는 것이 암호학적으로 어렵도록 난독화하는 아이디어를 탐구해 왔다.이것은 구별불능 난독화에 대한 많은 제안에서 공식화되어 있다.암호화 프리미티브는 만약 안전하게 구축할 수 있다면 아무도 만드는 방법을 모르는 완전히 새로운 타입을 포함한 많은 종류의 암호학을 구축할 수 있게 된다. (더 강력한 개념인 블랙박스 난독화는 2001년에 reses가 불가능하다는 것을 보여주었다.)수익자들은 이 개념에서 난독화할 수 없는 프로그램을 구축했습니다.)[20][21]
사용자에게 난독화된 코드 알림
AVG [22]AntiVirus와 같은 일부 안티바이러스 소프트웨어도 사용자가 수동으로 난독화된 코드를 사용하여 웹사이트에 도착했을 때 사용자에게 경고를 보냅니다. 이는 난독화의 목적 중 하나가 악성 코드를 숨기는 것일 수 있기 때문입니다.그러나 일부 개발자는 파일 크기를 줄이거나 보안을 강화하기 위해 코드 난독화를 사용할 수 있습니다.일반 사용자는 바이러스 대책 소프트웨어가 특히 신뢰할 수 있는 기업으로부터 무해한 코드 조각에 대한 경보를 제공할 것으로 예상하지 않을 수 있습니다.따라서 이러한 기능을 통해 사용자는 실제로 정규 소프트웨어를 사용하지 못할 수 있습니다.
Firefox 및 Chrome과 같은 일부 주요 브라우저에서는 난독화된 [23][24]코드를 포함하는 브라우저 확장도 허용하지 않습니다.
소프트웨어 난독화
코드 난독화를 수행하거나 지원하는 다양한 도구가 있습니다.여기에는 학계에서 만든 실험 연구 도구, 취미 도구, 전문가가 작성한 상용 제품 및 오픈 소스 소프트웨어가 포함됩니다.역변환을 시도하는 해독 도구도 존재합니다.
대부분의 상용 난독화 솔루션은 프로그램 소스 코드 또는 Java 및 에서 사용되는 플랫폼에 의존하지 않는 바이트 코드를 변환하여 작동합니다.NET, 컴파일된 바이너리에서 직접 동작하는 것도 있습니다.
난독화 라이선스 및 카피레프트 라이선스
저자가 소스코드를 이용하기 어려운 경우 등 난독화된 형태로 소스코드를 공개함으로써 카피레프트 소프트웨어 라이선스를 회피하는 것이 불법인지에 대한 논란이 있었다.이 문제는 GNU General Public License에서 "수정하기 위한 우선 양식"을 제공해야 합니다.[25]GNU 웹사이트에는 "암독화된 '소스 코드'는 실제 소스 코드가 아니며 소스 [26]코드로 계산되지 않습니다."라고 명시되어 있습니다.
「 」를 참조해 주세요.
메모들
- ^ 웹 사용자, 페이지 및 디바이스 타이머 칩의 시냅스로서 3Dspace Cartesian Coordinate Nurbs의 삼각 노드에서 수집, 출입하는 3개의 종속성 중 하나를 형성하는 3개의 나노 종속성.침해된 모든 정보는 회사에 의해 Meraki에 Cat6 핀으로 사전 설정됩니다.모든 사람들 중에서, 당신이 뭐라고 부르든 간에, 당신은 당신의 데이터베이스에 접근하는 관점에 있어 역대 최고의 사람을 골랐습니다.UNICORE/Raytheon은 투싼에서 당신이 필요로 하는 다른 질문들을 기원전 1200년경 피타고렌테오럼 뒤에 있는 다음 줄에 기꺼이 보고할 것입니다.E 인도/베다 힌두교– 아라베스크, 그로테스크, 모레스케.]도둑을 특정하다– 수천 년이 모든 것은 몇 안 되는 파헤쳐 원소를 채집하는 것으로 생각되었다.매우 흥미롭습니다]]"What is obfuscation (obfu)? - Definition from WhatIs.com". SearchSoftwareQuality. Retrieved February 1, 2019.
- ^ Binstock, Andrew (March 6, 2003). "Obfuscation: Cloaking your Code from Prying Eyes". Archived from the original on April 20, 2008. Retrieved November 25, 2013.
- ^ Atwood, Jeff (May 15, 2005). "Jeff Atwood, May 15, 2005". Codinghorror.com. Retrieved November 25, 2013.
- ^ "Obfuscation". Kenter.demon.nl. Archived from the original on March 4, 2016. Retrieved November 25, 2013.
- ^ "C++ Tutorials – Obfuscated Code – A Simple Introduction". DreamInCode.net. Retrieved November 25, 2013.
- ^ "C Tutorials – Obfuscated Code in C". July 7, 2011. Retrieved November 25, 2013.
- ^ As of 2013-11-25 18:22 GMT. "Pe(a)rls in line noise". Perlmonks.org. Retrieved November 25, 2013.
- ^ "Obfuscation – Haskell Wiki". February 16, 2006. Archived from the original on August 30, 2017. Retrieved March 3, 2020.
- ^ Montfort, Nick. "Obfuscated code" (PDF). Archived from the original (PDF) on April 24, 2019. Retrieved November 24, 2017.
- ^ "JAPH – Just Another Perl Hacker". pm.org. Perl Mongers. Archived from the original on May 16, 2013. Retrieved February 27, 2015.
- ^ "International Obfuscated C Code Winners 1988 – Least likely to compile successfully". Ioccc.org. Archived from the original on April 9, 2009. Retrieved November 25, 2013.
- ^ ""Reverse Engineering the Twelve Days of Christmas" by Thomas Ball". Research.microsoft.com. Archived from the original on December 13, 2007. Retrieved November 25, 2013.
- ^ 돈 리브스, 난독화 C와 기타 미스터리, 존 와일리와 아들, 1993, 페이지 425.ISBN 0-471-57805-3
- ^ Oscar Toledo Gutiéres:인텔 8080 에뮬레이터 제19회 IOCC 베스트 오브 쇼
- ^ "Obfuscated Perl Program". Perl.plover.com. Retrieved November 25, 2013.
- ^ Ben Kurtovic. "Obfuscating "Hello world!"". benkurtovic.com.
- ^ "Obfuscated Python". wiki.c2.com.
- ^ "The First Annual Obfuscated Python Content". code.activestate.com.
- ^ ""Can We Obfuscate Programs?" by Boaz Barak". Math.ias.edu. Archived from the original on March 23, 2016. Retrieved November 25, 2013.
- ^ "Cryptography Breakthrough Could Make Software Unhackable". Wired. ISSN 1059-1028. Retrieved March 14, 2021.
- ^ Jain, Aayush; Lin, Huijia; Sahai, Amit (2020). "Indistinguishability Obfuscation from Well-Founded Assumptions". Cryptology ePrint Archive. arXiv:2008.09317.
- ^ "Blocking website and only way to fix is disabling HTTPS s... AVG". support.avg.com. July 21, 2020. Retrieved February 4, 2022.
- ^ at 05:01, Thomas Claburn in San Francisco 2 Oct 2018. "Google taking action against disguised code in Chrome Web Store". www.theregister.co.uk. Retrieved November 12, 2019.
- ^ Cimpanu, Catalin. "Mozilla announces ban on Firefox extensions containing obfuscated code". ZDNet. Retrieved November 12, 2019.
- ^ "Reasoning behind the "preferred form of the work for making modifications to it" language in the GPL". Lwn.net. Retrieved November 25, 2013.
- ^ "What is free software?". gnu.org. Retrieved December 18, 2014.
레퍼런스
- Seyedhamzeh, Javad, ABCME: 새로운 변성 엔진, 제17회 전국 컴퓨터 컨퍼런스, 이란 테헤란, 샤리프 공과대학, 2012.
- B. Barak, O. Goldreich, R.임파글리아초, S. 루디치, A. 사하이, S. 바단 및 K.Yang. "난독화 프로그램의 가능성에 대하여", 제21회 연례 국제암호학회의, 미국 캘리포니아주 산타바바라. Springer Verlag LNCS Volume 2139, 2001.
- Mateas, Michael; Nick Montfort. "A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics" (PDF). Proceedings of the 6th Digital Arts and Culture Conference, IT University of Copenhagen, 1–3 December 2005. pp. 144–153.
외부 링크
- 국제 난독화 C코드 콘테스트
- 코드 난독화를 통한 Java 코드 보호, ACM Crossroad, 1998년 봄호
- 프로그램을 난독화할 수 있습니까?
- 유리 리프쉬트.프로그램 난독화 강의 노트(2005년 봄)
- Curlie의 Java 난독화기
- c2: BlackBox Computation