반응형

 

 

1. 소스 코드 (ver 1.0.2)

 

소스코드.zip
0.25MB

* 암호 : reversecore

< 릴리즈 히스토리 >

ver 1.0.2 - "44장 InjDll.exe - DLL 인젝션 전용 도구" InjDll.cpp 오류 수정 (20121110)

ver 1.0.1 - "33장 스텔스 프로세스" 프로젝트 소스 보기 오류 수정 (20121008)

ver 1.0.0 - 첫 릴리즈 (20120928) 

 

< 참고 >

 

* 모든 소스 코드는 MS Visual C++ Express 2010 으로 개발되었습니다.

* 소스 코드를 이용하여 빌드한 결과 파일은 사용자 환경에 따라 약간씩 달라질 수 있습니다.

* 책의 설명과 동일하게 디버깅 하기 위해서는 첨부한 예제 파일을 사용하시기 바랍니다. 

 

2. 실습 예제 파일 (ver 1.0.1)

 

* 2중 압축 되어 있습니다. (압축 풀면 실습예제.zip 이 생성됩니다. 이를 다시 압축 해제 해주세요.)

* 암호 : reversecore

 

< 릴리즈 히스토리 >

 

ver 1.0.1 - "1장 리버싱 스토리" 예제 변경 (20130401)

ver 1.0.0 - 첫 릴리즈 (20120928)

< 참고 >

* "실습예제.zip" 파일은 Anti-Virus 제품의 실시간 검사를 피하기 위하여 2중 압축 되어 있습니다.

* "5부 - 64비트 & Windows Kernel 6" 의 실습 예제 파일을 실습 하기 위해서는 Windows XP/Vista/7 64bit 환경이 필요합니다.

* 5부를 제외한 나머지 모든 실습 예제 파일은 MS Windows XP SP3 32bit & Windows 7 32bit 에서 테스트 되었습니다.

* 만약 64bit 환경에서 실습을 진행하기 위해서는 다음 포스팅에 나타난 방법을 참고하시기 바랍니다.

 

    64bit 환경에서 OllyDbg 사용할 수 있는 방법

* 중요!!!

일부 Anti-Virus 제품에서 실습 예제 파일의 일부가 악성 파일로 진단될 수 있습니다.

그 이유는 예제에서 사용된 기법들이 기존의 악성 파일에서 사용된 기법과 동일하기 때문에 AV 휴리스틱 엔진에서 그 부분을 탐지하여 악성 파일로 잘 못 진단할 수 있기 때문입니다.

 

전혀 악성 파일이 아니므로 아래 설명을 잘 읽어 보시고 실습해 보시기 바랍니다.

 

1) UPack 패커와 UPack 으로 패킹된 실습 예제가 진단될 수 있습니다.

이는 패커 자체가 PE 헤더를 심하게 훼손시켜서 Black 리스트에 포함되었고, 또한 몇 년전에 많은 악성 코드들이 UPack 으로 실행압축 되었기 때문에 이젠 대부분의 AV 에서 UPack 자체만으로도 악성 파일로 진단해 버립니다.

그렇다고 UPack 자체와 이걸로 패킹된 실습 예제가 악성 파일은 아닙니다. 

다만 리버싱 기술 설명을 위해 AV 업계의 권고사항을 따르지 않은것 뿐입니다.

PE 파일 설명에 UPack 만큼 좋은 예제가 드물기 때문에 이런 불편함에도 예제로 사용하였습니다.

 

2) '고급 리버싱', '안티 디버깅' 예제 일부가 악성 파일로 진단될 수 있습니다.

이 예제 파일 역시 악성 파일에서 사용되는 것과 동일한 기법을 사용했기 때문에 AV 휴리스틱 엔진에서 그 부분을 탐지한 것입니다.

실습 파일 자체는 아무런 악성 행위를 하지 않는 정상 파일입니다.

3) 시간이 지난 후에 멀쩡한 예제 파일들이 악성으로 진단될 수 있습니다.
예제 파일이 퍼져서 AV 업체에 접수되어 자동 분류 시스템에 의해 만에 하나 '악성'으로 분류될 수도 있습니다.악성 파일에서 안티 디버깅에 사용되는 SEH, TLS Callback 기법을 구현하였기 때문입니다.이 기법 자체만으로는 아무런 악성 증상이 없습니다. 다만 AV 엔진의 휴리스틱 진단에서 이 부분을 탐지 할 가능성이 있다는 것이죠.

4) 그렇다면 진짜 악성 파일이란 어떤 것일까요?

사용자 몰래 시스템에 숨어 들어서, 자동으로 실행 되며, 개인 정보를 무단으로 수집하고, 수집한 정보를 외부로 유출하는 등의 악의적인 행위를 하는 파일들입니다. 

즉, 악성 파일이란 사용자에게 크던 작던 피해를 입히는 파일들을 말하는 것이죠.

실습 예제 파일들은 특정 리버싱 기법을 위해 만들어진 단순한 파일들 입니다. 악성 증상은 전혀 없습니다. ^^~

 

5) 실습 환경 PC 에서는 잠시 AV 제품의 "실시간 감시" 기능을 꺼두시기 바랍니다.

물론 실습을 마치셨다면 실시간 감시를 다시 켜주시는 것이 좋습니다.

 

6) Windows 7 에서 실습을 하시는 경우 UAC(User Access Control) 기능을 끄고 하시면 편리합니다.

 

 

혹시 다운로드가 잘 안되거나 AV 진단 관련하여 궁금하신 점은 이곳에 질문해 주세요~

 

감사합니다.

 

반응형
  1. 이전 댓글 더보기
  2. hacker3 2015.03.13 18:24

    리버싱 책 구입했는데 파일 어디서 다운받죠? 모조리 받고 싶어요

  3. maskey 2015.07.08 22:33

    안녕하세요 리버싱 핵심원리 구독자입니다.
    지금 윈도우 64비트 환경에서 올리디버거를 사용하고있습니다.

    문의드리는 내용은 제일 첫장 Hello World 부분에서 디버거에 exe를 올리면 책에서는 004011A0의 주소로 0040270C의 주소로 call 시키는 부분입니다.
    하지만 저가 할 떄는 처음부터 0042F55F JMP wmainCRTStartup 으로 EntryPoint가 잡혀있습니다.

    디버거는 ollydbg 2.01과 Immunnity dbg 1.85v 두 디버거 사용해도 똑같이 시작됩니다.

  4. 김요환 2015.07.24 04:32

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  5. 김요환 2015.07.24 04:32

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  6. 김요환 2015.07.24 04:32

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  7. 김요환 2015.07.24 04:32

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  8. 김요환 2015.07.24 04:33

    5부 64bit 37.2.1 예제 CreateFileA() 구조가 살짝 다릅니다.
    3번째 행 책 (PUSH ECX)
    dbg(SUB ESP 214) -> 메모리 할당
    그리고 4부 마지막 IE 제어는 아예 프로세스 디버깅하고 해봐도 같은 함수가 찾아 지지 않습니다. 하는 방법이 잘못된 것 갈까요?

  9. doctroy 2015.07.26 21:18

    안녕하세요 책을 보면서 공부를 하고 있는 독자입니다 다름이 아니라 윈도우 10에서 HOOKMAIN.EXE 파일을 실행하면 모든 프로그램에 키보드 입력이 되지 않네요...

  10. 치운 2016.02.25 18:16 신고

    책을 사서 예제파일 hello.exe를 OllyDbg로 열어봤는데 주소가 완전히 틀리네요.
    저는 노트북에 windows2008을 깔고 있습니다.
    책에 나오는 예제와 똑같은 주소가 보이려면 어떻게 해야합니까?
    저의 이메일은 kchambit@daum.net입니다. 꼭 알려주세요.

  11. 권흥태 2016.06.21 22:34 신고

    맘먹고 책을 사서 공부중인 학생입니다.
    c++파일 올리디버거로 똑같이 열어서 하고 있는데 책이랑 메모리 주소들이 자꾸 틀리네요..
    helloWold.exe파일도 그러 합니다. ㅠㅠ 정말 해결책을 알 고 싶어요 ㅠㅠ
    빠른 답변 부탁드립니다.
    dev-c++사용합니다. 32비트이구요

  12. 2018.01.29 22:42

    비밀댓글입니다

  13. 2018.02.21 18:09

    비밀댓글입니다

  14. 김범준 2018.03.08 14:53

    비밀번호가걸려잇어요 어떻개해야하나요

  15. 천호진 2019.01.19 03:41

    크롬 환경에서 실습 예제파일 티스토리는 보안 오류가 뜨고,
    드랍 박스는 url이 바뀐모양이네요

  16. 2020.12.05 22:41

    비밀댓글입니다

  17. 2020.12.10 18:57

    비밀댓글입니다

  18. 2020.12.15 00:14

    비밀댓글입니다

  19. 2020.12.26 19:45

    비밀댓글입니다

  20. 2020.12.28 16:04

    비밀댓글입니다

  21. tifet1264 2021.04.14 16:49

    감사합니다. 책과 함께 잘 쓰도록 하겠습니다.

반응형


"리버싱 핵심 원리" Errata (정오표)



* 36   [4쇄에서 수정됨]


간단히 MessageBoxW 함수의 RETN 명령까지 실행[Ctrl+F9]한 다음, RETN 명령도 실행[F7]하면, 리턴 주소 401014로 갈 수 있습니다.

=> MessageBoxW() 함수의 RETN 명령어에 BP 를 설치[F2]한 후 실행[F9]합니다. 도중에 메시지박스가 나타나면 [확인]을 선택합니다. 그리고 RETN 명령어에서 디버깅이 멈추면 StepInto[F7]/StepOut[F8] 명령으로 리턴 주소 401014로 갈 수 있습니다.



* 85   [2쇄에서 수정됨]


14장에서 EAX는 => 4장에서 EAX는



* 152   [2쇄에서 수정됨]


Line nunbers => Line numbers

바이트 of machine => Bytes of machine

마지막으로 IMAGE_FILE_HAEDER => 마지막으로 IMAGE_FILE_HEADER



* 157   [2쇄에서 수정됨]


빨간색으로 표시한 EXPORT => EXPORT



* 161   [2쇄에서 수정됨]


<코드 13.10>

Section is writeable => Section is writable



* 164   [4쇄에서 수정됨]


각각의 RVA를 계산해보세요 => 각각의 RAW(File Offset)를 계산해보세요



* 164   [2쇄에서 수정됨]


<그림 13.9>

<File> 에서 Section(".text") 생략됨



* 165   [4쇄에서 수정됨]


Q3. RVA = ABA8일 때 File Offset = ?

A2. 해당 RVA 값이 속해 있는 => A3. 해당 RVA 값이 속해 있는



* 170   [2쇄에서 수정됨]


<그림 13.11 IAT>

이 테이블은 PE 로더를 덮어씁니다. => 이 테이블은 PE 로더에 의해서 덮어써집니다.



* 178   [4쇄에서 수정됨]


표 13.8 notepad.exe 파일의 DataDirectory 배열  =>  표 13.8 kernel32.dll 파일의 DataDirectory 배열



* 178   [2쇄에서 수정됨]


<코드 13.14>

address of functino name string array => address of function name string array



* 179   [4쇄에서 수정됨]


<표 13.9 내부>

Ordinal 주소 배열 => Ordinal 배열



* 181   [2쇄에서 수정됨]


앞서 소개한 코드 13.15의 => 앞서 소개한 GetProcAddress() 동작 원리



* 182   [2쇄에서 수정됨]


RVA:4424 -> RVA:3824 => RVA:4424 -> RAW:3824



* 183   [2쇄에서 수정됨]


RVA:2654 -> RVA:1A54 => RVA:2654 -> RAW:1A54



* 188   [2쇄에서 수정됨]


1000d(400h)바이트라면 => 1000d(3E8h)바이트라면



* 200   [2쇄에서 수정됨]


그림 14.13은 => 그림 14.3은



* 201   [2쇄에서 수정됨]


실행되는 순간에 => 실행되는 순간에



* 207   [2쇄에서 수정됨]


EDI 레지스터가 가리키는 => EDX 레지스터가 가리키는



* 211   [2쇄에서 수정됨]


그림 15.4가 바로 OEP로 => 그림 15.9가 바로 OEP로 



* 215   [4쇄에서 수정됨]


<그림 16.1>  TEXT.EXE  => TEST.EXE





* 223   [4쇄에서 수정됨]


VirtualSize(1000) + Offset(420) = 1420(RVA)  =>  VirtualAddress(1000) + Offset(420) = 1420(RVA)



* 249   [4쇄에서 수정됨]


<그림 18.18>

01014000 => 01015000



* 253  (3쇄오류) [4쇄에서 수정됨]


3쇄에서 <그림 18.24> 이 완전 잘 못 되었습니다. 아래 그림이 정확합니다.




* 273   [4쇄에서 수정됨]


OEP(40120.)로 갑니다. => OEP(40121E)로 갑니다.


OR


OEP(40120E)로 갑니다. => OEP(40121E)로 갑니다.



* 277   [4쇄에서 수정됨]


<그림 20.13> 에서 "momory" => "memory"




* 281   [2쇄에서 수정됨]


JMP OEP(40120E) 명령을 => JMP OEP(40121E) 명령을



* 296   [4쇄에서 수정됨]


<코드 21.2> 내부의 KeyboardProc() 함수 내부 if ( nCode = 0 ) => if ( nCode >= 0 )



* 301   [4쇄에서 수정됨]


401006 주소에서 LoadLibrary(KeyHook.dl) => 401006 주소에서 LoadLibrary("KeyHook.dll")



* 322   [4쇄에서 수정됨]


메모리에 szDllName 크기만큼 => 메모리에 szDllPath 크기만큼 



* 384  [4쇄에서 수정됨]


그림 27.2 오류!


<그림 27.2 ThreadProc()>



* 422   [3쇄에서 수정됨]


ESI 레지스터는 그림 28.28에서 보다시피 => ESI 레지스터는 그림 28.31에서 보다시피



* 423   [3쇄에서 수정됨]


함수의 리턴 값은 EAX에 저장되므로 위 그림을 보면 => 함수의 리턴 값은 EAX에 저장되므로 그림 28.32을 보면 



* 502   [3쇄에서 수정됨]


보기 옵션을 'Integer Address'로 변경하면 => 보기 옵션을 'Long - Address'로 변경하면



* 523   [2쇄에서 수정됨]


XXXXXXXX = (DWORD)pfnNew - (DWORD)pfnOrg - 5 => // XXXXXXXX = (DWORD)pfnNew - (DWORD)pfnOrg - 5

dwAddress = (DWORD)pfnNew-(DWORD)pfnOrg 5 => dwAddress = (DWORD)pfnNew - (DWORD)pfnOrg - 5



* 573   [4쇄에서 수정됨]


NewInternetConnetcW() 함수의 코드 => NewInternetConnectW() 함수의 코드



* 615   [4쇄에서 수정됨]


<그림 38.1> 우측 하단의 "이 테이블은 PE 로더를 덮어씁니다." 설명이 잘못되었습니다.

"이 테이블은 PE 로더에 의해 덮어써집니다." 가 맞습니다.



* 647   [4쇄에서 수정됨]


<코드 45.1 ASLR.cpp>

#include "studio.h" => #include "stdio.h"



* 691   [2쇄에서 수정됨]


<코드 45.5 TlsTest.cpp>

#include windows.h => #include <windows.h>



* 772   [2쇄에서 수정됨]


Vol. 2B -> Vol 2C   (Intel Manual 이 업데이트 되었습니다.)





반응형

'리버싱 핵심 원리 > errata' 카테고리의 다른 글

"리버싱 핵심 원리" Errata (정오표)  (80) 2012.10.01
  1. 이전 댓글 더보기
  2. Scavenger 2013.01.05 15:12

    초판 1쇄입니다.

    322p에 "...szDllName 크기만큼 메모리를 할당한다" 의 주석 부분에서, szDllName이란 변수는 코드상에 없습니다. 아마 szDllPath 의 크기를 dwBufSize에 넣는 과정에서 소스 코드 수정이 있었고 해당 수정 부분이 주석엔 반영이 안된 것 같습니다..........

    확인부탁드립니다^^

    • reversecore 2013.01.12 01:08 신고

      안녕하세요.

      네, 말씀하신 부분이 맞습니다. szDllPath 라고 해야 정확합니다.

      errata 에 등록하도록 하겠습니다. ^^

      감사합니다.

  3. hkskyp 2013.01.07 03:40

    안녕하세요.

    초판 1쇄 p144 그림 13.2 부분에서 Section(".rsrc") Virtual Size가 8314로 되어 있는데 winxp sp3 에서 notepad.exe 는 8304로 나오던데 확인 부탁드립니다.

    • reversecore 2013.01.12 01:07 신고

      안녕하세요.

      네, 제 XP SP3 환경에서도 8304 입니다. ^^

      참고로 다른 환경에서는 다른 값이 나올 수 있습니다.

      감사합니다.

  4. 조영용 2013.01.23 09:34

    ImageBase의 정확한 개념설명은 p155에서 처음 나오는 것 같은데 찾아보기에서는 p215로 나와있네요. 개인적인 의견입니다.

    • reversecore 2013.01.27 21:03 신고

      안녕하세요.

      작업 과정에서의 실수(버그)네요.

      좋은 의견 감사합니다. ^^~

  5. Scavenger 2013.02.10 10:32

    초판 독자입니다.

    422p 에서 "ESI 레지스터는 그림 28.28에서 보다시피..." 에서, 다음과 같이 수정되어야 할 것 같습니다.

    그림 28.28 -> 그림 28.31

    감사합니다.

  6. MJ 2013.03.13 11:19

    안녕하세요
    2쇄판 독자입니다.

    P147 13.4그림 과 p148의 파일 옵셋 40~4D영역을 설명하는 부분이 맞지 않는것 같습니다.
    블로그에서 DOS stub 내용과 유사한대 그림에서 영역표시되는게 맞다고 보입니다.

    • reversecore 2013.04.01 22:11 신고

      안녕하세요.

      그림 13.4는 DOS Stub 전체를 보여주고 있는데요. 말씀하신대로 그 다음 페이지 debug 설명을 위해서 40~4D 영역의 코드를 선택해서 보여주면 더 좋을 뻔했네요~

      좋은 의견 감사합니다. ^^~

  7. ifelse 2013.04.26 11:27

    안녕하세요.

    546 페이지 언훅 소스에서
    VirtualProtect((LPVOIDpFunc,5,PAGE_EXCUTE_READWRITE,&dwOldProtect)
    첫번째 인자와 두번째인자를 (LPVOID)((DWORD)((pFunc)-5),7 이렇게 하는겟 맞지않나요?

    • reversecore 2014.06.05 11:02 신고

      안녕하세요.

      일단 함수 시작부터 5 바이트 패치하기 때문에 책의 코드에는 이상이 없습니다.

      감사합니다.

  8. icandoit 2013.04.29 19:24

    안녕하세요.
    혹시 164페이지 상단에 퀴즈라고 있는 부분에, RAW를 구하는 것이 아닌가요??
    근데 RVA를 계산해보라고 쓰여있어서...
    확인 부탁드릴게요~

  9. 불협 2013.08.01 16:19

    안녕하세요.
    초판 독자입니다.
    165페이지에 사소한 오타입니다. Q3의 답이 A2라고 나와있네요.

    그리고 179페이지의 표 13.9의 한글 의미가 모호한 것 같습니다.
    아무래도 전 페이지의 코드 13.14의 영문 주석을 번역하면서 생긴 오류인 듯 합니다.
    예를 들어 AddressOfNameOrdinals의 영문 주석은 address of ordinal array 인데, 표 13.9에서는 Ordinal 주소 배열이라고 나와있습니다. (address of ordinal) array 라고 해석하신 듯 한데, 오히려 address of (ordinal array), 즉 Ordinal 배열의 주소 라고 해석함이 옳지 않은가요?

    페이지 408의 그림28.12이 본문과 일치하지 않아요. 그 전페이지 본문에서는 401058주소에서 입력한다고 나온 반면 그림에서는 401061로 나와있습니다. 확인부탁드려요.

    • reversecore 2014.06.05 11:20 신고

      안녕하세요.

      네, 말씀하신 대로 A2 가 아니라 A3 가 맞습니다.

      그리고 표 13.9는 저도 고민을 했었는데요.
      다른것들은 'XXX 주소 배열의 주소' 식으로 복잡해 보여서 그냥 'XXX 주소 배열'로 처리하였구요.
      그런데 AddressOfNameOrdinals 의 경우는 말씀대로 'Ordinal 주소 배열' 보다는 그냥 '배열' 로 표현하는 것이 더 의미상으로 자연스럽고 간결해 보입니다.

      28.12 그림은 401058~401061 코드를 전부 입력완료한 화면입니다. (한줄씩 따라서 입력하시면 됩니다.)

      좋은 지적 감사합니다~~

  10. 크빗 2013.09.01 17:01 신고

    초판 1쇄 기준입니다. 왠지 정오표에 없어서요.
    573p 하단: NewInternetConnetcW() 함수의 코드 역시 -> NewInternetConnectW() 함수의 코드 역시
    615p 그림 38.1: 이 테이블은 PE로더를 덮어씁니다. -> PE로더가 이 테이블을 덮어씁니다.
    미뤄두면 올리는 걸 잊어버릴까봐 미리 올려요...

  11. 라라라 2013.11.28 19:42

    많은 분이 찾아주셨는데 검색해보니 없어서 알립니다.
    1. p.277에
    그림 20.13에 memory가 momory라고 되어있네요(2쇄)

    2. p.296에
    KeyBoardProc 콜백 함수에서 if문 안에 if(nCode = 0)으로 되어있는데
    책보고 코딩하다가 안되서 소스코드를 보니 if(nCode >= 0) 이네요(2쇄)

  12. Fx 2014.06.05 10:39

    3쇄 독자입니다.
    253페이지, 그림 18.24는 전혀 맞지 않는 그림입니다.
    이 사이트에라도 맞는 그림을 올려주시면 좋겠습니다.

    • reversecore 2014.06.07 23:15 신고

      안녕하세요.

      3쇄에서만 나타나는 오류네요. ㅜㅜ

      정확한 그림을 이곳에 올렸습니다.

      오류 발견 감사합니다.

  13. Fx 2014.06.05 10:44

    63페이지부터 스택설명이 나오는데,
    줄곧 'FILO(First In, Last Out)'라고 쓰고 있습니다.
    LIFO(Last In, First Out)이 맞지 않을까요?

    책 내용이 훌륭해서 오류를 고쳐나가면
    리버싱계의 입문서로는 추천서로 손꼽을 만한 책이 될 것 같습니다.
    기분나쁘게 받아들이지 마시고, 적극적으로 반영해주세요.

    • reversecore 2014.06.07 23:25 신고

      안녕하세요.

      LIFO 가 맞다고 말씀해주신 분들이 몇 분 계십니다.
      예전에 제가 배울때는 FILO, LIFO 둘 다 맞다고 배웠고, 다들 혼용해서 썼었는데요. ^^

      혹시 최근 교과서나 서적에서는 LIFO 로 통일(혹은 대세가) 되었나요?
      그랬다면 표준 용어를 따라 변경하는게 맞다고 봅니다.
      자문을 좀 구해보고 수정여부를 결정하겠습니다.

      아, 그리고 오류를 발견해주시면 너무 기쁘고 감사하게 생각한답니다. ^^ 바쁜 시간을 내주셔서 저와 출판사에 도움을 주신거잖아요~
      적극 반영하도록 하겠습니다.

      감사합니다.

  14. 어무이 2014.07.17 17:06

    3쇄 107페이지 Name 문자열 읽는 주소가 004002FB0 가 아닌지요? 이부분을 지나니까 Name 스트링 객체에 입력된 문자열이 저장되는 것이 확인됩니다.

    • reversecore 2014.11.30 08:37 신고

      Name 문자열객체는 [EBP-88] 이고요.
      Name 문자열 읽는 API 호출 주소는 402F98 입니다.
      책의 설명대로 [EBP-88] 주소를 메모리 창에 띄우신 후,
      402F98 주소의 CALL 명령을 실행하시면 [EBP-88] 메모리 영역에 값이 들어가는 걸 확인 할 수 있고요. 'Long - Address with ASCII dump' 보기 옵션으로 보면 입력된 Name 문자열이 보입니다.

      감사합니다.

  15. dd 2014.07.26 11:12

    p.223 VirtualSize(1000) + Offset(420) = 1420(RVA)
    에서
    VirtualSize가 아니라 VirtualAddress 입니다.

  16. 행인1 2014.08.07 17:58

    p.529 코드33.6 부분이 의아해서 올립니다.

    if(pCur->NextEntryOffset == 0)
    pPrev->NextEntryOffset = 0;
    else
    pPrev->NextEntryOffset += pCur->NextEntryOffset;

    다음과 같은 코드인데..

    if(pCur->NextEntryOffset != 0) <=(== 이게아니라 != 이거아닌가요?)
    현재의 조건에 맞는 프로세스의 다음프로세스를 가르키는 링크드리스트의 주소가 0이 아닐때(주소가 있을때) 이전 프로세스(prev->NextEntryOffset = 0) 으로 세팅되어야 하지 않나요?
    오탈자같아서요 한번 확인 부탁드리겠습니다으리!!

    • reversecore 2014.11.30 08:45 신고

      아, 그건요 코드 내용이 맞습니다.
      만약 숨기려는 프로세스가 연결리스트의 마지막 노드라면,
      이전의 노드를 마지막 노드로 설정하라는 뜻입니다.
      (그래야 마지막 노드가 숨겨지겠죠?)

      감사합니다.

  17. Backer 2014.08.09 03:47

    안녕하세요
    읽다가 오타 발견해서 알려드립니다.

    215페지에서
    그림 16.1을 보면 TEST.EXE프로쎄스에 A.DLL이 ...
    이렇게 되여있는데 TEST.EXE 를 TEXT.EXE라고 수정해야 하는것 아닌지...
    그림 16.1에는 TEXT.EXE로 되여있어서 말입니다.

    혹은 그림이 잘못되였을수도 있겠죠...
    확인 부탁드립니다.

    • reversecore 2014.11.30 09:07 신고

      편집과정에서 그림이 잘 못 되었네요~

      좋은 지적 감사합니다~~

  18. 행인1 2014.08.20 16:44

    p,998 에 401041 주소에서 14바이트 크기만큼 읽어들이는 명령입니다.
    와 같이 되어있는데요.
    디버거에서 표현된 14는 16진수 값이기 때문에 변환해서 20바이트 라고 표기되야 맞는것 같습니다
    확인부탁드려요
    이거외에 엄청많이 찾았는데 글쓰기 권한이 없다고 못올린다고해서 다패스했네요 ㅠㅠ

    • reversecore 2014.11.30 09:15 신고

      안녕하세요.

      16진수 표현을 그대로 적어서 많이 불편하셨군요.

      10진수로 변경해서 표현하면 또 그림/코드와 달라져서... 그건 그거대로 혼동이 오기 때문에 그냥 16으로 표기하고 있습니다.

      코드/그림/표 등에서 숫자를 표기할 때 별다른 설명이 없다면 16진수로 이해해 주시면 되겠습니다. 실제로 리버서들도 그렇게 의사소통을 한답니다.

      양해 부탁드리겠습니다~~

      감사합니다.

  19. 어무이 2014.09.02 11:39

    이승원님 오타 확인 좀 해주세요. 6월 이후로 확인을 안해주시네요.
    배우는 사람 입장에선 오타하나 때문에 몇시간씩 머리 싸메고 있답니다.

    • reversecore 2014.11.30 09:17 신고

      안녕하세요.

      불편을 드려서 죄송합니다.

      저 위에 댓글 올리신 분이시죠?
      답글 달았습니다.

      불편 드려서 죄송합니다~~~

  20. 하얀백숙 2015.02.03 22:01

    224p 에서
    따라서 RVA 1420은 VA AF1420이고, 그 주소에는 AF10C4라는 IAT주소가 ~~
    이렇게 되어있는데요. 223p 그림 16.8을 보면 AF1420에서 AF10C4주소가 저장되어있는것이 아니라 AF141E아닌가요?

    아니면 제가 잘못이해하는건가요 ㅠ

  21. 응? 2018.12.26 11:59

    4쇄본을 보고있는데요 321p에
    "ThreadProc()의 내용은 urlmon!URLDownloadToFile() API를 호출하여 네이버 사이트의 index.html 파일을 다운받습니다."
    이렇게 되어있는데요.
    여기서 urlmon!URLDownloadToFile() API가 아니라 URLDownloadToFile() API인거 아닌가요?

반응형

저도 오늘 갑자기 편집자님의 메일을 받고 알게 되었네요~ @@~

예약판매 페이지가 떴습니다. ^^


[리버싱 핵심 원리 : 악성 코드 분석가의 리버싱 이야기]

이승원 저

인사이트(Insight)





마음의 준비 없이 갑자기 전해 들은 소식이라... 저도 좀 놀랐습니다...

드디어 나오다니요... 지금 기분을 어떻게 말로 설명할 수 가 없네요~~~ ㅎㅎㅎ


관심 가져 주시고 응원해 주신 모든 분들께 감사드립니다. ^^~


반응형
  1. 이전 댓글 더보기
  2. saeglo 2012.09.20 18:48

    축하드립니다.
    이건 고민할 필요가 없네요.

  3. hookerz 2012.09.20 23:25

    정말 짜증납니다 이 책 때문에!!

    오늘 교보 문고를 다녀왔거든요 ㅠ_ㅠ

    현기증 날라구 한단 말이에요 어여 출간해 주세요!

    기대하고 있습니다 축하드려요

    • reversecore 2012.09.22 00:55 신고

      ㅎㅎㅎ 깜짝 놀랐네요~

      잠시만 기다려 주세요~

      감사합니다. ^^~

  4. Lr라 2012.09.22 14:01

    리버스코어님은 블로그말고 하시는곳 없나여? ..;;
    으앜.. 만약네이트온 하신다면.. 아이디좀 알려주세요~^^;
    저도 물론 리버스엔지니어링을 열심히(?) 하는 사람입니다 ㅎ
    많은 대화를 나눠보고싶네요! ㅎ

    • reversecore 2012.09.27 12:59 신고

      ㅎㅎ 메신저는 사용하지 않습니다.

      블로그에 질문 올려주시면 답변해드릴께요~

      감사합니다~ ^^

  5. AC 2012.09.22 23:41

    리버스코어형님 항상 블로그 하루에 몇번씩 들어오고 그러는데

    책 발매를 하신다니 당장 구매할 생각입니다!! 책내신거 축하드리고요

    책사서 사인받고싶습니다ㅋㅋㅋ

    어떻게 하면 사인 받을수 있을까요?

    • reversecore 2012.09.28 00:19 신고

      안녕하세요.

      사인을 원하시는 분들이 계신데요.
      원하시는 분들께는 전부 해드리고 싶습니다만, 물리적인 제약사항이 있어서 말이죠.

      혹시 원하신다면 아이패드 그림 앱으로 사인을 해서 이메일로 보내드릴 수 있습니다. 성함과 이메일 주소를 알려 주시기 바랍니다.

      감사합니다. ^^~

  6. 질문이요 2012.09.23 00:16

    리버싱핵심원리 라는 책 초보자가 입문하기에 괜찮나요?

    따로 배경지식 깔고 들어가야하는 과목이 있나요?

    • reversecore 2012.09.28 00:25 신고

      안녕하세요.

      음... 배경지식으로 말하자면 너무 많습니다~ ^^
      Assembly, C/C++, Debugger, PE File Format, Windows OS Internals, etc

      하나하나 만만치 않지요. 마스터를 목표로 하신다면 정말 오랜 시간이 걸리는 것들입니다.

      그래서 저는 배경지식과 리버싱을 따로 구분하지 않고, 모두 리버싱 과목에 포함된다고 생각합니다. 즉, 저런 것들을 공부하는 것이 곧 리버싱을 공부하는 것이라고 말이죠.

      리버싱 공부를 시작할 때의 어려움은 바로 '두려움' 입니다. 저런걸 언제 다 공부하나... 하는 두려움이요. 일단 블로그의 HelloWorld 를 따라 해보시고 조금 감을 잡아 보시기 바랍니다. 그렇게 천천히 하나씩 시도하는 것이 중요하다고 봅니다.

      감사합니다.

  7. Reverser Hyeok 2012.09.24 15:52

    드디어 책이 나왔군요... ㅎㅎ

    진짜 오래전부터 기다려왔었는데

    당장 구입하고 열공해야겠습니다 ^^

  8. j 2012.09.24 20:38

    예약구매했는데 오늘 추석지나서 발매예정이라는 문자가왔네요
    좀 느긋이 기다려야겠네요 ^^

  9. Saturn 2012.09.25 19:50

    예약 했습니다.!! ^^ 기대 하고 잘 보겠습니다.
    초보 입문자가~ ㅎㅎ

  10. 지나가다 2012.09.26 09:45

    혹시... 전자책으로 파실생각은 없으신건가요? ㅎㅎ
    drm 입힌걸로 해서 파시면 아이패드에서 편히 볼 것 같은데...;;

    • reversecore 2012.09.28 03:54 신고

      안녕하세요.

      저도 처음에 그 생각을 해봤습니다.
      실제로 아이패드로 원고 교정을 했고 말이죠.
      아마존에서 기술 서적 이북을 몇 권 사서 읽어도 봤죠.

      근데 기술서적은 아직 전자책보다 종이책이 편하더군요. ^^
      전자책은 검색에서 특히 불편합니다.

      기술서적은 한번 다 읽은 후에도 레퍼런스로 곁에 두고 자주 꺼내보게 되는데요...
      뭐 하나를 찾을 때 '그게 여기 어디쯤 본 내용 같은데?' 하고 종이책에서는 손때 묻은 그 페이지를 금방 찾겠는데, 전자책은 아직 검색이 불편해요.
      그 대신 전자책의 휴대성은 엄청난 강점이지요.

      조만간 전자책 소프트웨어가 더 발전하면 기술 서적들이 더 많이 이북으로 출간이 될 것으로 생각합니다.

      감사합니다.

  11. 델피언 2012.09.26 13:30

    항상 블로그에서 좋은 정보 얻어가던게
    너무 감사해서 바로 예약구매 했습니다 ㅎ

  12. 미친감자 2012.09.26 15:00

    축하드립니다.^^
    언제 싸인 받으로 가겠습니다.^^

  13. 익명 2012.09.27 00:06

    헉 블로그 글들이 왜사라지고있죠???ㅠ

    • reversecore 2012.09.28 00:55 신고

      안녕하세요.

      제가 조만간 공지를 올리려 했는데요.
      댓글로 먼저 알려드려야 겠네요~

      제 책 전체 분량의 50~60% 가량은 기존 블로그의 내용으로 채워져 있습니다. 기술 서적을 돈 주고 구매하시는 분들의 입장을 고려해서 일부 글을 내렸습니다.

      주로 비인기 글, 어려운 글, 여러 기술과 연관되는 글 등을 내렸습니다. 많은 분들께서 좋아해 주시고 도움을 받았다고 알려주신 HelloWorld, PE File Format, DLL Injection, API Hooking 등은 그대로 남겨 두었습니다.

      리버스코어 블로그는 더 새롭고 재밌는 컨텐츠로 채워 나갈 것입니다. 계속 재밌게 봐주세요~ ^^

      감사합니다.

  14. 담벼락 2012.09.27 11:22

    이게 바로 멘탈붕괴인가요.. 10월초에 온다는 책이 내일 온다는데기뻐해야되는데.. 추석이라 집에 내 려갈뿐이고, 배송지는 학교기숙사일뿐이고. ᅲ 일찍와도 볼 수 없는 이 불편한 진실

    • reversecore 2012.09.28 00:58 신고

      아, 그러시군요.

      더 잘 되었다고 생각해보시는건 어떨까요? 명절에 가족, 친지들과 더 좋은 시간을 보내실 수 있게 되었다고 말이죠. ^^~

      감사합니다.

  15. SuperSoul 2012.09.27 15:05

    책을 받았습니다. 역시 알찬 내용으로 가득하네요.
    그동안 블로그 내용을 많이 스크랩 해 뒀었는데, 이젠 이 책만 보면 되겠군요.

    책이 생각보다 두꺼워서 놀랬습니다.
    리버싱 책 중에 이렇게 두꺼운 책은 처음인 듯....
    하지만 내용을 어렵지 않게 해 주셔서 책장 넘어가기 어렵진 않네요.

    저는 이번에 새로 나온 강벽탁님 저서랑 동시에 구입했는데요,
    reversecore님 책을 기본서로 하고 강병탁님 저서를 그 다음에 보는게
    좋을 것 같다는 생각이 들었습니다. 겹치는 내용보다 상호 보완적 내용이 많아서 기쁩니다.

    아쉬운 점은, 예전에 여기서 받았던 InjDll64는
    실제론 64비트 환경에서 DLL 인젝션에 실패하는 경우가 많더군요.
    아직 인사이트북 블로그에 파일이나 소스를 못찾아 봤지만, 책 내용은 동일한 듯 하네요.
    EasyHook이나 Diviare같은 라이브러리는 성공하는 걸로 봐서, 뭔가 놓친 게 있다 싶습니다.

    하지만 전체적으로 이만한 리버싱책은 전무후무 했다고 생각합니다.
    다들 자기가 하고싶은 얘기만 하거나, 툴 사용법 혹은 기초 이론, 과거기술 소개 등에서
    끝마치면서 돌아오는 것 없는 메아리 같은 연습만 시키는 책들이 부지기수인데 비해,
    이 책은 실제로 많은 내용이, 말 그대로 '살아있네' 입니다.
    그것도 책 두게가 말해주는 상세한 설명까지 붙어서 살아있으니,
    아주 팔딱팔딱 하는 싱싱한 내용이 아닌가 합니다.
    좋은 책 내주셔서 감사드립니다.

    • reversecore 2012.09.28 00:59 신고

      헉? @@
      책을 벌써 받아보셨다고요?

      저도 아직 못받아 봤는데요.ㅜㅜ
      책에 대한 칭찬 감사드립니다~ ^^

      아, 저도 리버싱 입문서가 거의 동시에 출간되서 매우 기쁘게 생각합니다. 각 저자마다 자신이 잘하고 비중을 두는 부분이 다를것입니다. 그래서 독자들의 다양한 입맛에 맞는 입문서가 많이 출간되어야 한다고 생각합니다. ^^

      InjDll64의 문제로 보이는 부분이 있으시면 저에게도 알려주시면 감사하겠습니다. 그리고 예제 파일과 소스는 바로 오픈하였습니다~

      감사합니다.

  16. zina 2012.09.27 16:28

    이제야 봤네요. 지금 당장 구매했습니다. 수고하셨고 감사합니다.

  17. hare 2012.09.28 10:01

    기다리던!! ㅜㅡㅜ 목차만 봐도 내용들이 상상이 가는군요!ㅎ
    좋은책을 볼수 있게 해주셔서 정말 감사합니다!

  18. h4cktiz3n 2012.09.28 10:42

    책이 도착했네요
    추석전에 와서 다행이라고 생각하고 있습니다. 지루한 추석을
    흥미로운 책과 함께 하겠네요

    • reversecore 2012.10.06 02:20 신고

      안녕하세요~

      추석 잘 보내셨는지요?

      부디 책이 기대에 맞게 흥미로우셨기를 바랍니다.

      감사합니다.

  19. lheer 2012.10.02 18:50

    오늘 영등포 타임스퀘어 內 교보문고에서
    구입을 했어요.
    비닐포장이 되어있더군요.
    집에 도착하자마자
    비닐포장을 띁을까 하다가 참았어요 ^^

    나중에 천천히 볼려구요.ㅎ
    책을 소장한걸로 고수가 된 기분입니다.

    • reversecore 2012.10.06 02:19 신고

      안녕하세요~

      전 아직 오프라인 서점을 못 나가봤습니다.
      비닐 포장은 의외네요~ ^^

      감사합니다.

  20. niney 2012.10.08 17:21

    안녕하세요~! 블로그 글이 잘 되어있어
    책 사는거에 고민없이 사게됬습니다
    감사하고 수고하세요~!
    자주 들리겠습니다~!

  21. db_click 2012.10.13 14:00

    2년 가까이 기다린 것 같네요
    비록 눈팅만 하면서 기다렸지만..

    시간과 돈이 전혀 아깝지 않네요.
    책과 함께 행복한 시간 보낼게요 ~
    감사합니다.

    • reversecore 2012.10.14 23:34 신고

      안녕하세요.

      저만큼 오래 기다려 주셨네요~

      너무 좋은 말씀 감사합니다 .^^

반응형

어플리케이션 후킹(Application Hooking) 설계(디자인)에 대한 설명입니다. 후킹 방법을 결정하고, 검증하는 과정을 보여드립니다. 



후킹 방법 결정 - 무엇을? 어떻게? 후킹 할 것인가?


우리의 목표는 [HxD.exe 프로그램에서 PE 파일을 열었을 때 상태바의 "Offset: XXXX" 문자열에 "RVA: YYYY" 문자열을 추가하기]  입니다.


기존 어플리케이션에 어떤 기능을 추가(혹은 수정) 하려고 마음을 먹었다면 그 다음에는 구체적인 방법에 대해 고민을 해야 합니다. 즉, 후킹 설계 과정으로 들어가야 합니다.


윈도우즈 OS의 대표적인 후킹 기법은 "메시지 후킹(Message Hooking)""API 후킹(API Hooking)" 입니다. 둘 중에서 목표 달성에 더 적합하고 구현이 편리한 방법을 사용하는 것이 좋을 것입니다.


일반적으로는 메시지 후킹 기법이 더 간단하고 더 안전하다고 볼 수 있습니다. 대신 경우에 따라(특히 GUI 관련) 더 많은 고려사항이 필요한 경우가 있습니다. 따라서 실전에서는 후킹 설계 단계에서 메시지 후킹 방법이 더 편리할지 확인해 보는 것이 좋습니다.



메시지 후킹 기법 검증


우리 목표에 메시지 후킹 기법이 잘 어울릴지 검증해 보도록 하겠습니다. 


Windows OS 는 어플리케이션 윈도우의 GUI 처리 작업을 위해 윈도우 메시지를 이용합니다. HxD.exe 의 상태바도 일종의 윈도우입니다. 프로그램 내부에서 상태바에 특정 문자열을 쓰기 위해 관련된 윈도우 메시지를 전달할 것입니다. 


* 참고 


GUI 관련 API 를 호출하면 GUI 작업 처리를 할 수 있기 때문에 마치 윈도우 메시지를 사용하지 않고도 작업이 가능한 것처럼 생각될 수도 있습니다. 그러나 실제로는 API 내부에서 윈도우 메시지를 보내는 것입니다. 일반적인 GUI 작업은 메시지 기반으로 동작한다는 것을 기억하시기 바랍니다.


HxD.exe 의 상태바에 있는 "Offset: XXXX" 문자열이 변경될 때 상태바 윈도우 프로시저(Window Procedure)에서 처리하는 윈도우 메시지들을 확인해 보겠습니다. 먼저 HxD.exe 프로그램을 실행 하신 후 적당한 PE 파일을 열어 주세요.


그리고 윈도우 메시지를 모니터링 하기 위해 Spy++ 유틸리티를 실행합니다.



<그림 3 - Spy++ 실행화면>


* 참고


윈도우 메시지 확인에 있어서 Spy++ 은 최고의 유틸리티입니다. 기본 동작 원리는 윈도우 메시지 후킹입니다. 모니터링 대상 프로세스에 DLL 을 인젝션 시켜서 사용자가 원하는 메시지를 모니터링 합니다. Spy++ 은 Microsoft Visual Studio 패키지에 포함된 유틸리티 입니다. 


Spy++의 툴바에서 "Log Messages... (Ctrl+M)" 버튼을 선택합니다. (또는 "Spy - Log Messages..." 메뉴를 선택하셔도 됩니다.)



<그림 4 - Log Messages... (Ctrl+M) 툴바 버튼>


Message Options 다이알로그가 나타납니다.



<그림 5 - Message Options 다이알로그>


Windows 탭의 Finder Tool 을 이용할 것입니다. Finder Tool 아이콘을 마우스 버튼을 누른 채로 드래그 하면 마우스 포인터가 과녁 모양으로 바뀝니다. 이 과녁 모양의 마우스 포인터를 HxD 의 상태바 윈도우에 위치시킨 후 마우스 버튼에서 손을 떼면 Spy++ 의 타겟(Target) 윈도우로 설정됩니다. (과녁 모양의 마우스 포인터 밑에 있는 윈도우는 두꺼운 검은색 테두리가 생겨서 잘 알아 볼 수 있습니다.)



<그림 6 - Finder Tool 로 상태바 설정>


이제 Spy++ 의 Message Options 다이알로그의 "Selected Object" 섹션에 지금 선택된 HxD 의 상태바 윈도우에 대한 정보들이 표시됩니다.



<그림 7 - HxD 의 상태바 윈도우 정보>


각 정보들이 나타내는 의미는 <표 1>과 같습니다.


 항목

 의미

 

 Window

 윈도우 핸들

 001B0362

 Text

 윈도우 텍스트

 Offset: 0

 Class

 윈도우 클래스 이름

 TXmStatusBar

 Style

 윈도우 스타일

 54000100

 Rect

 윈도우 위치와 크기

 (15, 663)-(589, 684) 574x21

 Thread ID

 윈도우를 생성한 스레드 ID

 00000150

 Process ID

 윈도우가 속한 프로세스 ID

 00000F30


<표 1 - Selected Object 항목들의 의미>


* 참고


Spy++ 에서 보여주는 상태바 윈도우의 정보는 나중에 메시지 후킹을 구현할 때 좋은 참고자료가 됩니다.


윈도우 클래스 이름이 "TXmStatusBar" 인 걸로 봐서 윈도우 기본 상태바(StatusBar)를 서브클래싱(SubClassing) 한 것으로 추정됩니다. 그렇다면 기본 동작은 윈도우 기본 상태바와 비슷할 것이라고 예상해 봅니다.


Message Options 다이알로그의 [확인] 버튼을 선택하면 이제부터 Spy++ 은 HxD 의 상태바 메시지를 모니터링하기 시작 합니다. 시험 삼아서 마우스 포인터를 상태바 위에서 이리저리 이동해 보시기 바랍니다. Spy++ 화면에 마우스 관련 메시지가 많이 나타날 것입니다.



<그림 8 - 마우스 이동 메시지>


Spy++ 의 메시지 캡쳐 옵션을 디폴트인 'ALL' 로 설정하였기 때문에 상태바로 전달되는 모든 메시지가 표시되는 것입니다. 우리가 진짜 궁금한 내용은 상태바에 문자열이 써지는 순간에 어떤 메시지를 받느냐 하는 것입니다. 


Spy++ 툴바의 'Clear Log (Del)' 버튼을 선택하여 지금까지 쌓인 로그를 지워버립니다. 그리고 HxD.exe 의 메인 화면 내의 아무 부분을 마우스로 클릭하시기 바랍니다. 마우스가 선택한 파일의 옵셋을 상태바에 출력하기 위해 메시지가 전달될 것입니다.



<그림 9 - 문자열 출력 메시지>


HxD 메인 윈도우에서 마우스 클릭을 한번 하면 정확히 9개의 메시지 로그가 출력됩니다. (제가 보기 편하게 들여쓰기를 하였습니다.)


<00001> 001B0362 S message:0x040A [User-defined:WM_USER+10] wParam:00000000 lParam:0012FA84

<00002> 001B0362 R message:0x040A [User-defined:WM_USER+10] lResult:00000001


<00003> 001B0362 P WM_PAINT hdc:00000000


<00004> 001B0362 S message:0x0401 [User-defined:WM_USER+1] wParam:00000000 lParam:01A06768

<00005> 001B0362 S   WM_PAINT hdc:00000000

<00006> 001B0362 S     WM_ERASEBKGND hdc:33010BC2

<00007> 001B0362 R     WM_ERASEBKGND fErased:True

<00008> 001B0362 R   WM_PAINT

<00009> 001B0362 R message:0x0401 [User-defined:WM_USER+1] lResult:00000001


1번 로그의 메시지는 WM_USER(0x400)+A 이고 그 때의 lParam 값은 0012FA84 입니다. lParam 값이 마치 스택의 주소를 가리키는 것으로 추정됩니다. 그리고 4번 로그의 메시지는 WM_USER(0x400)+1 이고 lParam 값은 01A06768 입니다. 이 값 또한 메모리 주소를 표시한다고 추정해 볼 수 있겠습니다. 


마우스(또는 키보드)를 이용하여 HxD 메인 윈도우의 커서를 다른 옵셋으로 이동시키면 기본적으로 이와 동일한 9 개의 메시지 로그가 기록됩니다. 그리고 4 번째 로그의 lParam 값은 계속 바뀌는 것을 알 수 있습니다. (아마 동적 할당 메모리로 추정됩니다.)


따라서 상태바 윈도우는 사용자 정의 메시지인 WM_USER+1 또는 WM_USER+A 메시지를 받아서 lParam 이 가리키는 주소의 문자열을 상태바 윈도우에 쓴다고 추정해 볼 수 있겠습니다. 그 중에서도 4번 로그 메시지 WM_USER+1 을 받은 직후 WM_PAINT 와 WM_ERASEBKGND 메시지가 연속해서 나타나는 걸로 봐서는 WM_USER+1 메시지가 상태바 윈도우에 실제 값을 쓰라는 명령으로 보입니다.


디버거를 이용하여 lParam 이 가리키는 주소를 확인해보면 앞에서 추론한 내용이 맞는지 알 수 있겠지요.


* 참고


WM_PAINT 는 윈도우를 다시 그릴 때 발생되고, WM_ERASEBKGND 는 윈도우 배경을 지울 때 발생됩니다. WM_USER (0x400) 이후부터는 사용자 정의 메시지로서 프로그래머가 마음대로 지정해서 사용할 수 있습니다. 물론 메시지를 받는 윈도우 프로시저에서 사용자 정의 메시지를 잘 처리할 수 있도록 구현해야 합니다. 해당 메시지에 대한 더 자세한 설명은 MSDN 을 참고하시기 바랍니다.



디버깅


OllyDbg 를 실행하여 HxD.exe 프로세스에 Attach 시킵니다. 디버거는 ntdll.dll 메모리 영역의 System Break Point 위치에서 멈춥니다. 디버거를 실행[F9] 시켜 줍니다. 


윈도우 메시지를 디버깅 할 때는 주의사항이 있습니다. 그건 바로 디버기 프로세스(HxD.exe)의 윈도우를 가리면 안된다는 것입니다. 즉 OllyDbg 나 Spy++ 윈도우에 의해 HxD 윈도우가 가려졌다가 나타났다가 하게 되면 불필요한 로그가 Spy++ 에 쌓이게 됩니다. (물론 Spy++ 옵션을 고쳐서 모니터링 메시지를 필요한 것 만으로 제한해도 됩니다.) 


작업 편의상 각 윈도우들을 독립적으로 배치 시켜 주시기 바랍니다.



<그림 10 - 윈도우 배치>


다시 Spy++ 의 로그를 깨끗이 지우신 다음 마우스로 HxD 메인 윈도우 아무 곳이나 선택해 주세요. 제 경우에 Spy++ 의 WM_USER+1 로그의 lParam 주소는 01A0BA28 입니다. 



<그림 11 - 새로운 lParam 값>


이 주소를 OllyDbg 의 메모리 윈도우에서 검색해 보겠습니다.



<그림 12 - OllyDbg 에서 확인한 lParam 내용>


HxD 의 상태바에 나타난 것과 동일한 문자열이 ASCII 형태로 표시되어 있습니다. (이 경우에는 운좋게 예상과 잘 맞아서 쉽게 발견할 수 있었습니다.) 이 WM_USER+1 메시지를 후킹해서 lParam 이 가리키는 문자열("Offset: XXXX")을 읽은 후 RAW -> RVA 변환하여 표시해 주면 목표를 완수 할 수 있을 것 같습니다.


결론적으로 메시지 후킹 방법은 우리 목표에 잘 들어맞는 방법입니다. 다음 포스트에서 실제 메시지 후킹을 구현해 보도록 하겠습니다.


* 참고


사실 제가 처음 떠올렸던 아이디어는 단순한 마우스 메시지 후킹이었습니다. HxD.exe 상태바의 문자열이 바뀌려면 먼저 마우스로 커서 위치를 바꿔줘야 했으니 마우스 훅 프로시저에서 상태바의 문자열을 읽고 쓸 수 있지 않을까 하고 말이죠. 그러나 조금 더 생각해보니 좋은 아이디어가 아니라서 접었습니다. 이유는 키보드로도 커서 위치를 바꿀 수 있으니 키보드 메시지도 후킹 해야 할 테고, 상태바 윈도우가 다시 그려져야 하는 모든 상황(윈도우 이동, 윈도우가 가려졌다가 다시 나타나기, HxD 에서 다른 파일 열기, 기타)을 고려했을 때 후킹해야 할 메시지가 많아 질 것 같았기 때문입니다. 

따라서 덮어놓고 후킹을 시도하기보다는 먼저 차분히 생각을 정리해보고, 아이디어를 검증하는 단계가 매우 중요하다고 볼 수 있겠습니다.




ReverseCore

반응형
  1. J 2012.07.14 01:19

    언제나처럼 흥미로운 주제에 대한 포스팅이시네요. ^^
    주말시간에 한번 도전해봐야겠네요. ^^
    여름에 책으로 꼭 볼 수 있으면 좋겠습니다.

  2. 군인 2012.07.17 21:13

    재밌네요^^
    좋은 글 감사해요!!!! 잘읽고갑니다 :)

  3. packeter 2012.07.20 18:47

    HxD.exe 내부에서 사용하는 일반 함수를 Injection된 DLL에서 실행하는 방법은 없을까요?
    후킹은 passive해서.. 해당 API가 동작 해야만 원하는 코드를 실행시킬 수 있는데요,
    active하게 해당 API동작 없이.. 후킹한 API를 실행한다거나 하는 방법은 없을까요?

  4. smartdolphin 2012.07.23 13:12

    초보자들도 알기쉽게 잘 설명해주셨네요! 근데 책은 언제쯤 나오나요? 하루 빨리 책 출판을 기다리고 있숩니다~^^

  5. 멘죠님 2012.07.29 22:44

    즐겨찾기에 추가해 놓고 가끔 리버스코어님 블로그 들어와서 강좌만 읽고 가지만....
    정말 대단하시다는 말밖에 안나오네욤.....
    대한민국에 리버싱에 대해 이렇게 상세하게..그것도 기본부터 아주 세심하게
    강좌를 설명해 놓은 곳이 있을까요??

    물론 대한민국에 실력 좋은 사람들 많겠지만...
    코어님 처럼 이렇게 행동으로 꾸준하게 보여주는 사람은 아마 대한민국에 없을것으로 봅니다..

    정말 대단하세요...코어님...아니 형님!!! (__)

  6. 나그네 2012.08.01 16:18

    좋은 정보 감사합니다!
    열심히 공부할게요 ^_^

  7. 김호준 2012.09.05 13:35

    리버스 코어님!! 강컴사이트에서 http://kangcom.com/sub/view.asp?sku=201209040003

    이책을 보았는데 9월 20일 출판예정으로 되어있네요...

    혹시 이게 집필중이던 책인가요?

    맞으면 지금 바로 예약주문 하려구요 답변부탁드려요~~~

  8. ditongs 2012.09.05 20:33

    김호준님이 알려주신 링크는 넥슨 아메리카 게임보안팀에 계신 "강병탁"님이 집필하신 책입니다~
    저도 지금 주문 기다리고 있습니다. 말그대로 바이블입니다. 강추!

    • 김호준 2012.09.07 13:30

      다른분이셨군요...어쨌든 살책이 점점더 늘어나는데...지갑은 가벼워지고..아이고...ㅠㅠ

  9. 박종석 2012.09.11 17:25

    드디어 출간이 되네요.... 벌써부터 기대가 됩니다.
    "리버싱 핵심 원리"
    http://www.yes24.com/24/Goods/7529742?Acode=101

    • 담벼락 2012.09.11 17:28

      목차 보고 딱 리버스코어님이 만드신 걸 느꼈네요. 어서 예약 구매 질러야겠어요

    • 김호준 2012.09.11 17:39

      우어~~ 분량이 엄청난데요..ㄷㄷㄷ 바이블이 될듯합니다..ㄷㄷㄷ

  10. Lr라 2013.03.04 14:48

    어렵군요..ㅎㅎ;;
    그냥 이정도 자료로도 저에겐 벅찹니다..

    • reversecore 2013.03.04 20:17 신고

      ^^ 네, 처음 접하시면 분명히 어려운게 사실이지요.

      뭐든지 그렇지만 자꾸 보면 할만해져요~

      리버서들이 천재도 아니고 그냥 평범한 사람들이거든요. 그런데요 자꾸 보다보면 괜찮아요~ ^^

      감사합니다.

  11. supras shoes 2013.04.27 02:40

    내가 성공을 했다면 오직 천사와 같은 어머니의 덕이다.Topics related articles:


    http://azza.tistory.com/116 新建文章 11

    http://color114.tistory.com/68 新建文章 6

    http://mycite.tistory.com/78 新建文章 2

    http://bfhopestore.tistory.com/206 新建文章 5

  12. lunettes carrera 2013.04.28 04:22

    희미한 달빛이 샘물 위에 떠있으면, http://noq.botasugger.com/ botas ugg online,나는 너를 생각한다.

  13. nike free run shoes 2013.04.29 06:27

    노동은 생활의 꽃이요, 삶의 보람이요, 마음의 기쁨이다.Topics related articles:


    http://sma14u.tistory.com/70 新建文章 3

    http://ianbuffet.tistory.com/44?nil_openapi=search 新建文章 12

    http://eshita.tistory.com/120 新建文章 2

    http://starspalace.tistory.com/53 新建文章 6

반응형




제 책을 담당해 주시는 '전설의 에디터'님께서 보내주신 조판용 원고입니다. 

실제 책을 펼친 모양과 거의 같다고 보시면 될꺼에요~ 


이 엄청난 분량을 작업하시느라 고생하셨을 에디터님께 감사의 마음을 전합니다. ^^


제가 좋아하는 [연금술사] 책을 올려보았습니다. 

대략 분량이 가늠되시나요? 

1차로 180 페이지 정도를 끝낸 나머지 모든 분량입니다.


열심히 저자 검토중이고요. 

주로 제목, 레이아웃, 그림, 내용, 오탈자 위주로 보고 있습니다.


이제 출판 작업도 반환점을 돌아 결승선이 희미하게 보이기 시작합니다. 막 두근거려요~ ^^


반응형
  1. 이전 댓글 더보기
  2. havu 2012.07.10 21:42

    책 나오면 사인회 한번 하세요!
    책 표지에 사인 받고싶네요

  3. 루리킹 2012.07.10 21:59

    ....리버싱에 관한 국산 서적을 12년전 "크랙" 이후로 한번도 구경 못했는데....
    그 이후로는 국산 리버싱 서적이 저에게는 처음이나 마찬가지네욤...정말 기대중이고욤...
    책 나오면 꼭 살께욤...
    글자 틀려도 좋으니 얼른 나오게 해주세욤 ㅜ_ㅜ

  4. ㅇㅇ 2012.07.11 15:47

    국내에서 드디어 멋진 리버싱 서적이 나온다니 기대됩니다
    존경합니다

  5. 간만에 들려 2012.07.12 14:18

    정말 오랫동안 기다렸습니다.
    하루 빨리 나오기를 기다리겠습니다 ^^

  6. ㅇㅇ 2012.07.12 22:21

    책 표지가 멋있었으면 더 좋겠습니다

  7. 호지니 2012.07.14 11:58

    (왜 그런지는 잘 모르겠지만..) 저도 무지 떨려요 ㅋㅋ
    화이팅 하시구요. 순산하시길 기원할꼐요 ^^;

  8. 채진아 2012.07.16 10:51

    기다리고 있습니다.

  9. 2012.07.16 20:23

    비밀댓글입니다

  10. hare 2012.07.19 15:49

    드디어..ㅜㅡㅜ 책 예약판매 하면 바로 지릅니다!!

  11. smartdolphin 2012.07.21 12:29

    예전부터 리버스코어에서 많은 정보를 얻고 배울 수 있어서 그런지 정말 기대하고 있습니다. 책이 나오면 예판부터 질러야 겠네요 ㅎㅎ

  12. 로크 2012.08.15 13:35

    책 제목이 어떻게 되나요??
    궁금합니다.

  13. 하겐티 2012.08.20 11:14

    1년을 기다려왔습니다. 리버스코어에서 많을것을 배웠지만
    책을 소장하고 바이블로서 활용하고 싶습니다.
    정말 기대되네요

  14. 넹군 2012.08.23 22:32

    언제 출판 될까요 이제 9월인데 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

    대략 언제 나오는지 알려주시면 ....

  15. 담벼락 2012.08.27 13:36

    기다려지내요.. 늦더라도 9월초에 나왔으면 좋겠습니다. 책이름은 이상하게 말고 reversecore 라고만 적어도 멋있을꺼 같습니다.

  16. atlantic 2012.08.30 12:23

    흑흑 ㅜㅜ 진짜 너무안나오네여! ㅜㅜㅜ

  17. 2012.09.02 14:21

    주기적으로 와보는데 경과라도 알려주시면... ㅠ

  18. reversecore 2012.09.04 03:40 신고

    안녕하세요. ReverseCore 입니다.

    아~~ 책을 기다리시는 분들께는 죄송하다는 말씀 밖에 드릴수가 없네요. ㅜㅜ

    현재 최종 원고 리뷰만을 남겨둔 상태입니다.
    조만간 최종 원고를 받아서 검토가 끝나고 편집이 완료되면,
    일단 시간이 걸리는 작업은 모두 끝나게 됩니다.

    나머지는 출판사의 출판 프로세스에 맞춰서 빠르게 진행될 것입니다.
    9월말~10월초를 출간일로 예상하고 있습니다.

    완성도를 높이기 위해 저와 출판사에서 원고를 꼼꼼하게 확인하고 있습니다.
    일단 분량(본문 1,000 페이지 & 그림 880장 & 기타)이 엄청나고 특히 제가 너무 치열하게 리뷰하고 원고를 수정하는 바람에 편집자님께서 고생하시고, 그만큼 작업 시간이 더 걸리고 있습니다. ㅜㅜ

    기다리시는 분들께 양해를 부탁드리겠습니다.

    감사합니다.

    • 담벼락1개월만 기다리면 된다니 다행이내요.. 완성도도 높이고, 2012.09.04 11:25

      1개월만 기다리면 된다니 저도 모르게 두근두근 거리네요. 완성도를 높이기위한 노력 너무 감사합니다. 얼른 책을 펼쳐 보고 싶기는 하네요.. 하하

  19. 도키도키 2012.09.04 15:45

    두근두근

  20. 9월달! 2012.09.04 17:27

    이제 9월달 입니다.!!! 흐흐흐

  21. 리버싱 2012.09.16 16:21

    벌써 기대가 됩니다

+ Recent posts