코드 코딩 난독화 : 가상머신 랭귀지(JavaVM, CLR ms, Python)의 필수 덕목

난독화

위키백과, 우리 모두의 백과사전.

코드 난독화는 프로그래밍 언어로 작성된 코드에 대해 읽기 어렵게 만드는 작업이다. 대표적인 사용 예로는 프로그램에서 사용된 아이디어나 알고리즘 등을 숨기는 것 등이 있다. 코드 난독화 과정을 거친 코드를 특정 기준에 의해 심사하는 대회도 있다.

 

목차

  [숨기기

 

개요[원본 편집]

코드 난독화는 프로그램 코드의 일부 또는 전체를 변경하는 방법 중 하나로, 코드의 가독성을 낮춰 역공학에 대한 대비책을 제공한다. 난독화를 적용하는 범위에 따라 소스 코드 난독화와 바이너리 난독화로 나눌 수 있다.[1] 또한, 난독화의 목적에 따라 각각 기술의 무단복제와 불법으로 침입하려는 프로그램을 방지하는 것으로 나뉘기도 한다.[2]

원리[원본 편집]

 치환 암호 문서를 참고하십시오.

  • 필요 이상으로 복잡한, 또는 아무 것도 하지 않는 코드를 작성한다.
  • 관련이 없는 여러 함수들을 뒤섞는다.
  • 데이터를 알아보기 힘들게 인코딩한다.

만드는 방법[원본 편집]

다음과 같은 소수인지를 판별하는 액션스크립트 3 소스에 있는 isPrime 함수를 난독화 시켜보자.

//난독화 할 함수.
function isPrime(n:int):Boolean{
	var r:int = 0;
	while(r*r<=n)r++;
	r--;//r은 [n의 제곱근]임.
	if(n==r) return false;//n이 0 또는 1
	if(n<4) return true;
	if(n%2==0 || n%3==0 || n%r==0){
		return false;
	}
	for(var i:int = 6;i<r;i+=6){
		if(n%(i-1)==0) return n==i-1;
		if(n%(i+1)==0) return n==i+1;
	}
	return true;
}

//함수 테스트
var num:int = 0;
for(var i:int=0;i<=100000;i++){
	if(isPrime(i)) num++;
}
trace(num);//9592(π(100000))이 출력된다.

for를 while로 바꾸고, 특별한 변수를 쓴다.[원본 편집]

  • for 문을 while 문으로 바꾼다.
  • 만약 for 문이 두 번 이상 중첩되었을 경우, 아래와 같이 특별한 변수를 쓴다.
int i,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
printf("%d*%d=%d\n",i+1,j+1,(i+1)*(j+1));

위 C 코드를

int k=0;
int i(0),j(0);
while(k<9*9){
	i=k/9;j=k%9;
	printf("%d*%d=%d\n",i+1,j+1,(i+1)*(j+1));
	k++;
}

이렇게 바꾼다.

그 결과, 첫 번째의 액션스크립트 코드는 다음과 같이 바뀐다. (함수 부분만)

function isPrime(n:int):Boolean{
	var r:int = 0;
	while(r*r<=n)r++;
	r--;
	if(n==r) return false;
	if(n<4) return true;
	if(n%2==0 || n%3==0 || n%r==0){
		return false;
	}
	var i:int=6;
	while(i<r){
		if(n%(i-1)==0) return n==i-1;
		if(n%(i+1)==0) return n==i+1;
		i+=6;
	}
	return true;
}

순환문을 재귀 함수로 바꾼다.[원본 편집]

모둔 순환문은 재귀 함수로 바꿀 수 있다. 함수의 인자로 함수 내부에 쓰이는 변수를 추가하고, 재귀적으로 호출을 시키는 방식이다.

while문의 조건을 if문으로 바꾸는 식으로 순환문을 다음과 같이 재귀 함수로 바꿀 수 있다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

function isPrime(n:int, r:int=0, i:int=6):Boolean{
	if((r+1)*(r+1)<=n) return isPrime(n, r+1, i);
	else if(n==r) return false;
	else if(n<4) return true;
	else if(n%2==0 || n%3==0 || n%r==0) return false;
	else if(i<r)
		if(n%(i-1)==0) return n==i-1;
		else if(n%(i+1)==0) return n==i+1;
		else return  isPrime(n, r, i+6);
	else return true;
}

이 방식에서 생기는 문제는, 수많은 함수 호출로 인해 속도가 매우 느려진다는 것이다.

구조를 난독화하고, 변수 이름을 의미없게 짓는다.[원본 편집]

if(A) B; else if(C) D; else E;

같은 if-else 문을 ?: 조건 연산자를 이용하여

A?B:C?D:E;

로 바꿀 수 있다.

변수 이름을 무작위로 (예: int rabbitNum = 0;을 int m = 0;으로 바꿈) 지어서 코드를 더욱 난독화 시킬 수 있다.

function isPrime(a:int, b:int=0, c:int=6):Boolean{
	return (b+1)*(b+1)<=a?isPrime(a, b+1, c):
	a==b?false:
	a<4?true:
	a%2==0 || a%3==0 || a%b==0?false:
	c<b?a%(c-1)==0?a==c-1:a%(c+1)==0?a==c+1:isPrime(a, b, c+6):true;
}

내부 변수를 없앤다.[원본 편집]

만약 내부 변수가 쓰인다면, 그것을 다른 것으로 치환한다.

예 : 다음 C 코드를 다음과 같이 바꾼다.

double divide(int a, int b){
double c = a/(double)b;
return c;
}

c를 a/(double)b로 치환한다.

double divide(int a, int b){
return a/(double)b;
}

이름을 다시 한번 난독화한다.[원본 편집]

함수 이름과 변수 이름을 바꾼다. 여기에서는 변수 이름을 _, __, ___으로 바꾸고, 함수 이름을 ____으로 바꿨다.

function ____(_:int, __:int=0, ___:int=6):Boolean{
	return (__+1)*(__+1)<=_?____(_, __+1, ___):
	_==__?false:
	_<4?true:
	_%2==0 || _%3==0 || _%__==0?false:
	___<__?_%(___-1)==0?_==___-1:_%(___+1)==0?_==___+1:____(_, __, ___+6):true;
}

리터럴을 없앤다.[원본 편집]

리터럴을 함수 인자로 넘겨주는 방법을 쓸 수도 있고, 살짝 위험하기는 하지만, 1을 a/a와 같이 다른 변수로 치환시키는 방법을 쓸 수도 있다.

비록 권장하는 방법은 아니지만, 여기에서는 후자의 방법을 쓰겠다.

function ____(_:int, __:int=0, ___:int=6):Boolean{
	return (__+___/___)*(__+___/___)<=_?____(_, __+___/___, ___):
	_==__?_-_:
	_<___-(__+_+__-_)/__?_/_:
	_%(__/__+_/_)==_-_ || _%(__*___/(__+__))==__-__ || _%__==___-___?___/___-_/_:
	___<__?_%(___-_/_)==__/__-___/___?_==___-__/__:_%(___+___/___)==__+_-__-_?
	_==___+___/___:____(_, __, ___+(__*___*(_+_+_)+__*_*___+(__+__)*___*_)/_/__/___):_;
}

스페이스, 탭 등을 없앤다.[원본 편집]

여기에서는 한 줄로 적으면 너무 길어지므로, 적당히 줄바꿈을 하였다.

function ____(_:int,__:int=0,___:int=6):Boolean{return(__+___/___)*(__+___/___)<=_?____(_,__+___/___,___):_==__?_-_:
_<___-(__+_+__-_)/__?_/_:_%(__/__+_/_)==_-_||_%(__*___/(__+__))==__-__||_%__==___-___?___/___-_/_:___<__?
_%(___-_/_)==__/__-___/___?_==___-__/__:_%(___+___/___)==__+_-__-_?_==___+___/___:
____(_,__,___+(__*___*(_+_+_)+__*_*___+(__+__)*___*_)/_/__/___):_}

최종 결과[원본 편집]

function ____(_:int,__:int=0,___:int=6):Boolean{return(__+___/___)*(__+___/___)<=_?____(_,__+___/___,___):_==__?_-_:
_<___-(__+_+__-_)/__?_/_:_%(__/__+_/_)==_-_||_%(__*___/(__+__))==__-__||_%__==___-___?___/___-_/_:___<__?
_%(___-_/_)==__/__-___/___?_==___-__/__:_%(___+___/___)==__+_-__-_?_==___+___/___:
____(_,__,___+(__*___*(_+_+_)+__*_*___+(__+__)*___*_)/_/__/___):_}

//함수 테스트
var num:int = 0;
for(var i:int=0;i<=100000;i++){
	if(____(i))num++;
}
trace(num);//9592

사용 예[원본 편집]

  • 자바스크립트 코드의 용량을 줄이는 데 쓰는 Packer는, 또한 자바스크립트를 읽기 어렵게 하는 데 쓰인다.

각주[원본 편집]

  1. 이동↑ 마이크로소프트웨어(2007.12월) 서광열의 프로그래밍 언어 이야기, 코드 난독화
  2. 이동↑ 보안공학연구논문지(Journal of Security Engineering), Vol. 5, No. 2, May 2008 이병용, 최용수. Obfuscation 기술의 현황 및 분석과 향후 개발 방향

[출처] https://ko.wikipedia.org/wiki/%EB%82%9C%EB%8F%85%ED%99%94

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 침투테스트(취약점검점검, 모의해킹) 문의 / 답변 졸리운_곰 2017.12.10 28360
217 중고서점 알라딘의 예치금 노렸다! 계정정보 무차별 로그인 시도 file 졸리운_곰 2017.08.24 220
216 자꾸만 터지는 S3 사고! 이에 인공지능으로 대비한 AWS! file 졸리운_곰 2017.08.15 160
215 LG전자 서비스센터 초유의 마비 사태! “랜섬웨어 감염 맞다” file 졸리운_곰 2017.08.15 197
214 워너크라이 확산 막아냈던 개발자, 악성 코드 제작 혐의 기소 file 졸리운_곰 2017.08.05 150
213 2사분기 디도스 요약 : 두 가지 신기록과 협박형 공격 file 졸리운_곰 2017.08.03 139
212 산업 시스템 노리는 멀웨어 분석해주는 무료 툴 공개 file 졸리운_곰 2017.08.02 147
211 '픽셀'로만 존재했던 이 여인, 세상을 홀리고 지난 2월 사라져 file 졸리운_곰 2017.08.01 195
210 2017년 블랙햇을 통해 보는 보안 취약점 트렌드 file 졸리운_곰 2017.07.29 226
209 대한민국을 공격하는 3대 위협그룹 ‘라자루스·블루노로프·안다리엘’ file 졸리운_곰 2017.07.27 132
208 제2의 인터넷나야나 막으려면...‘쇼단’ 올라간 IT 인프라 정보 비공개화 file 졸리운_곰 2017.07.02 140
» 코드 코딩 난독화 : 가상머신 랭귀지(JavaVM, CLR ms, Python)의 필수 덕목 file 졸리운_곰 2017.07.01 414
206 코드 인젝션 졸리운_곰 2017.07.01 300
205 Windows Memory Hacking Libraries file 졸리운_곰 2017.07.01 428
204 Memory Hacking Library List 졸리운_곰 2017.07.01 7037
203 워너크라이 킬 스위치, 사실 분석 방해 장치였을까? file 졸리운_곰 2017.05.20 179
202 MS, 사이버공격 美정부 탓…"NSA서 털린 코드가 공격에 쓰여" file 졸리운_곰 2017.05.15 94
201 [카드뉴스] CVE, CVE... 대체 무엇일까요? file 졸리운_곰 2017.05.13 166
200 [주말판] 돈 없는 중소기업 위한 무료 정보보안·데이터 툴 30 file 졸리운_곰 2017.05.13 161
199 세계 70여개국서 사상최대 해킹 공격…병원·기업 업무 마비 졸리운_곰 2017.05.13 150
198 효과적인 시큐어 코딩 적용을 위한 팁 file 졸리운_곰 2017.05.07 190
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED