오토핫키로 만들어진 프로그램을 리버싱 해보자(소스코드 추출)

프로그래밍/Reversing 2018.01.13 댓글 Plorence

안녕하세요.

 오늘은 오토핫키로 만들어진 프로그램을 리버싱 해볼까 합니다.

목표는 리소스 해커를 안쓰고 소스코드를 추출하는것입니다. 기본 제공 컴파일러로 했을때는 프로그램 리소스에 소스코드가 올라가 있어 리소스 해커 만으로도 쉽게 추출이 가능하지만,그러지 않고도 x64dbg를 이용하여 소스코드를 추출할 생각입니다.

오늘은 저번에 올린 "오토핫키 동작 원리"보다 부드럽게 진행 할 예정입니다. 제가 다시보니 딱딱 하더군요.

아무것도 모르시면 먼저 "http://plorence.kr/266"글을 읽어오시면 상당히 도움이 됩니다.

일단은.. Hello world! 라는 내용이 들어가 있는 메세지박스를 띄우는 프로그램을 만들었습니다. 저는 이 Hello world!를 출력하는 프로그램을 리버싱해서 소스코드를 얻고 싶습니다.(이미 제가 만들어서 실제로는 필요없고 가정하는겁니다.)

1.일단은 뭘 해야 하느냐?

전지전능하시고 킹갓엠페러제네럴충무공마제스티 이신 x64dbg님을 실행해야 합니다.(x64dbg는 설치되어있다는 가정하에 진행됩니다.)

x64dbg 실행하면 이렇게 뜨는데 저는 환경이 64비트라 그런지 64비트 디버거로 실행해야지 프로그램 로드가 가능하더군요.

파일 -> 열기(O)로 탐색기열고 프로그램 로드하면 이렇게 뜹니다. 그냥 봐서는 뭔 개소리인지 하나도 모르겠습니다.(실제로 저는 어셈블도 거의 모르고,디버거도 잘 다룰줄 모르며 관심만 있습니다.)

다행히도 저는 오토핫키의 동작 원리를 알고 있습니다. 동작 원리를 알고 있으니까 포스팅하고 여러분께 알려드렸겠죠. 설마 제가 모르는데 알려드렸겠습니까? 잡소리는 그만하고 시작해보겠습니다.

혹시 3줄요약이 필요하신분들 위하여 동작원리를 간단히 설명하겠습니다.

오토핫키 소스코드는 해당 프로그램의 RC DATA -> ">AUTOHOTKEY SCRIPT<"라는곳에 보관되어 있습니다.

그러니까 간단히 하면 RC DATA가 수납장의 형태고 ">AUTOHOTKEY SCRIPT<" 얘는 수납장에 1단,2단 이렇게 부여된 이름입니다. 나중에 어디다가 뒀는지 헷갈리지 않도록 이름을 부여한거랑 비슷하죠 (마치 변수처럼)

3줄 요약으로 하자면

1.오토핫키로 만들어진 프로그램은 >"AUTOHOTKEY SCRIPT"라는곳에 소스코드가 보관된다.

2.그래서 디버거든 뭐든 AUTOHOTKEY SCRIPT라는 서랍장을 열기만 하면 된다.

3.프로그램이 실행될때 AUTOHOTKEY SCRIPT 라는 서랍장을 열어 그것을 토대로 돌아간다.

매우 귀찮지만 디버거로 열겁니다.

일단 파란색 화살표를 클릭해 엔트리포인트인가 나올때까지 진행합니다. 보통은 한번 누르면 바로 걸립니다.

우클릭 -> 다음을 찾기 -> 현재 모듈 -> 문자열 참조를 클릭합니다. Autohotkey라는 문자열을 검색하여 좀 더 쉽게 이동할겁니다.

뜨면 Autohotkey라고 검색해봅시다. 그러면 서랍장의 이름인 ">AUTOHOTKEY SCRIPT<"가 떠요 얘 주소를 따라가면 우리가 그토록 원하던 소스코드를 획득이 가능합니다. 너무 쉬운거 아닌가요? 에바참치꽁치인듯(필자는 리버싱에 대해 거의 모른 상태에서 1시간이 걸렸습니다.)

오! 익숙한 함수들이 나왔습니다. FindResource,SizeofResource,LoadResource,LockResource 함수가 Call(호출)되고 있는게 보이실겁니다.

4개 다 서로 연관 되어 있는건 맞습니다만 어차피 소스코드만 볼꺼니까 LoadResource 함수만 보면 됩니다.

저기 빨간색으로 칠해져있는 부분 보이시나요? 2개가 되어있는데,아랫쪽에 체크하시면 됩니다.(브레이크 포인트는 동그라미를 클릭하면 빨간색으로 변경됩니다.)

브포를 건상태에서 제일 처음 클릭한 파란색 화살표를 클릭합니다. 그러니 빨간색에 걸리며 소스코드가 노출됩니다. 어때요 정말 쉽죠?

소스코드가 메모리에 뜬다는걸 알았으니 덤프에서 봅시다. 

덤프로 이동시켜 봤더니 소스코드가 그대로 보입니다. 난독화가 처리 되어있으면 암호화된 소스코드가 뜰수도 있구요. 그거는 컴파일러에 따라 달라지겠습니다.

지금까지 리소스 해커 안쓰고도 굳이..굳이! 디버거를 써가면서 소스코드를 뽑아냈습니다.

단순히 리버싱을 못하는 제가 과연 가능하나? 싶어서 시도 해본것 같고 순수 저의 재미를 위해 그리고 리소스해커로는 해봤지만 x64dbg는 어려워서 못하신분들에게 알려주는 내용이었습니다.(리버싱 할줄 몰라서 인터넷 검색해도 안나오길래 직접해봄.)

댓글