본문 바로가기

My Study/Reversing

바이트코드 기반 언어 심볼 정보 포함 이유

아마 리버싱을 해보신 분들이라면 여러언어로 만들어진 프로그램들을 역분석 해 보았을 것입니다.

2가지 경우를 비교하겠습니다.
바이트코드 기반 언어로 만들어진 프로그램과 일반 C언어와 같은 언어로 만들어진 프로그램이 있습니다.

바이트코드 기반 언어, 자바 같은 언어가 바이트코드 기반 언어입니다. C언어로 짠 프로그램들은 자신 컴퓨터에선 잘 돌아갈지 몰라도 다른 사람 컴퓨터에서는 안돌아가는 경우도 많습니다. 그 이유는 컴퓨터의 플랫폼이 다르기 때문입니다.
하지만 바이트코드 기반 언어는 바로 프로그램 자체가 메모리에 올라가서 CPU에 의해 명령어가 해석되어지는게 아니라
Virtual Machine이라는 소프트웨어에를 거쳐서 프로그램이 실행되게 됩니다. 그렇기 때문에 플랫폼이 달라도 어느 컴퓨터에서든지 Virtual Machine만 깔려있다면 해당 프로그램을 돌릴 수 있는 것이지요. 요새 어떤 프로그램들을 실행시키려고 하다보면 JVM을 설치하라고 나올 것입니다.

일반 C언어는 소스코드를 짜 놓고 한번만 컴파일하면 실행파일이 생기게 됩니다. 그러면 그 실행파일을 어디에서든지.. 프로그램이 실행될 여건만 되면 실행이 될것입니다. 그렇기 때문에 함수 정보, 문자열 정보 등을 담고있는 심볼정보는 필요가 없을 것입니다. ( 역분석 툴로 열어보면 Assembly로 나타내짐 )


하지만 바이트코드 기반 언어실행 시마다 컴파일을 하게 됩니다.
즉, JIT( Just in time )컴파일링을 하게됩니다. 실행이 되는 순간에 동적으로 컴파일이 된다는 것입니다.
그렇기 때문에 자체적으로 심볼정보를 포함하고 있어야 컴파일이 되겠죠. ( 역분석 툴로 열어보면 IL언어로 나오게 됨 )


여기까지가 바이트코드 기반 언어 프로그램이 왜 심볼정보를 포함해야되는지에 대해 아셨을 것입니다.

하지만 한가지 더 보여줄건데 이러한 바이트코드 기반 언어는 디컴파일러 툴로 보게되면 소스코드가 거의 100% 복원이됩니다. 자체적으로 심볼정보를 포함하고 있기 때문이지요. 디컴파일러 툴로 봐보겠습니다.

위와 같이 소스코드가 복원이 되어버립니다.
만약 이대로 파일을 배포하게 되면.. 사람들이 소스코드를 쉽게 읽을 수 있겠지요..
그렇기 때문에 배포할때는 VS에서 지원하는 난독화 툴을 사용해 난독화를 시켜서 배포하는 방법을 써도 괜찮을꺼 같습니다.
아마 VS가 깔려있는 컴퓨터는 전부 이 툴이 있을 것입니다.

해당 툴 켜보겠습니다. ( VS를 키시고 켜야합니다. )

대충 사용법은 아실 것입니다. 입력 탭에와서 난독화 시킬 프로그램 추가시켜준 후 빌드에 가셔서 빌드하시면 됩니다.

난독화를 시켰고 이제 디컴파일러 툴로 다시 봐보겠습니다.

위에서 봤던 그 부분입니다. 난독화가 되어있죠. 변수명이나 함수명이 전부 의미없는 문자로 바뀌어버린 것을 볼 수 있습니다.
( 위 결과는 함수명과 매개변수 명만 바뀌었네요 .. ^^; 난독화 툴에서 옵션을 쫌 줘서 사용하면 더욱 효과적일꺼 같습니다. 
   전 아무런 옵션을 주지 않았어요 ㅜㅜ )

그리고 여기선 VS에 있는 난독화 툴을 사용했는데 배포할 때는 더욱 좋은 난독화 툴을 찾아서 난독화 시켜서 배포하시면 좋겠습니다. 자기가 만든 프로그램은 자기가 지켜야겠죠.. ^^

'My Study > Reversing' 카테고리의 다른 글

모달 윈도우 무력화  (0) 2010.04.15
IDA v5.2 -> IDA v5.5 원격 디버깅  (0) 2010.04.13
DLL Injection  (7) 2010.04.12
Anti Debuggering 우회 Plugin  (0) 2010.04.09
TLS Callback 안티 디버깅  (3) 2010.04.04