안녕하세요.

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

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

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

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

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

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

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

올리디버거 실행하면 이렇게 뜨는데 저는 환경이 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개가 되어있는데,아랫쪽에 체크하시면 됩니다.(브레이크 포인트는 동그라미를 클릭하면 빨간색으로 변경됩니다.)

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

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

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

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

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

댓글을 달아 주세요

  1. Hack area

    음.. 딴지 거는것은 아니지만 32와 64의 차이는 실행환경의 차이가 아닌
    디버깅할 프로그램의 PE가 32면 x32dbg를 사용하고 PE32+는 x64dbg를 사용합니다.
    그리고 저건 올리디버거는 아니고, 디버거 종류중 하나입니다.
    올리디버거와 유사하고 인터페이스를 가지고 있고 사용법도 비슷해서 사용하기 좋습니다.

  2. Hack Area

    음.. 디버거는 종류가 꽤나 많습니다.
    대표적으로는 Windbg,IDA pro,Ollydbg가 있는데
    IDA PRO는 기능이 엄청나지만 가격이 비싼편이라
    전문가가 아니면 대부분 Ollydbg를 사용합니다. 올리디버거에 추가할 수 있는 플러그인도 많이 있고 무료에 가벼워서 많은 사람들이 사용합니다. 플로렌스님이 사용하신 디버거는 x64 dbg인데, 올리디버거와 비슷한 인터페이스와 사용방식때문에 저도 자주 사용합니다. x64 dbg는 한글패치도 되있고 올리디버거와는 다른점이 별로없어요. 올리디버거가 64비트 실행파일 디버깅을 아직 지원을 안하기 때문에 (개인이 취미로 제작)
    64비트 실행파일 디버깅할때는 저도 x64 dbg 애용합니다.

  3. 질문

    이거 한글 스트링을 어떻게 찾죠? 올리는 한글 텍스트 스트링 찾아 지던데 이건 영문만 된게 찾아지네요; 위 방법대로 문자열 참조로 찾으면 영문만 찾아지고 한글로 된건 안 찾아집니다;

  4. 질문

    이거 보고 배우는 초짜입니다.. 질문이 있는데
    같은 방법으로 소스 코드는 추출했지만 이 소스코드를 수정하는 방법은 모르겠습니다. 혹시 알려주실수 있나요?