안티-리버싱 기법에 대해 관심이 많으신 분들은~~ 다들 알만한 내용입니다만...

-0- 스스로 정리하는 차원에서;; 살포시 포스팅 해봅니다..

PEB 에서 ImageBase 값 및 LDR_DATA 의 첫번째 모듈(보통은 메인 프로세스죠;;)의

이미지베이스, 엔트리포인트, 이미지크기 등을 조작해서 해당 정보를 읽지 못하게 하면 되는데요~

코드는 대략 아래와 같습니다.

__asm {
    // 프로세스의 이미지 베이스 제거 
    MOV     EAX, DWORD PTR FS:[0x30]
    MOV     DWORD PTR [EAX + 0x08], 0

    // LDR_DATA 의 첫번째 모듈 정보 조작
    MOV     EAX, DWORD PTR FS:[0x30]
    MOV     EAX, DWORD PTR [EAX + 0x0C]
    MOV     EAX, DWORD PTR [EAX + 0x0C]

    // 모듈의 베이스 주소
    MOV     DWORD PTR [EAX + 0x18], 0
    // 모듈의 엔트리 포인트
    MOV     DWORD PTR [EAX + 0x1C], 0
    // 모듈의 사이즈
    ADD     DWORD PTR [EAX + 0x20], 0x1000
}
 
LordPE 에는 'correct ImageSize' 라고 이미지 사이즈가 조작된 경우 이를 어느 정도 바로잡아 주는 기능이 있는데..

위와 같이 이미지 베이스 등~ 정보를 다 조작해버리면 그 기능도 사용할 수 없습니다~ :)

( 직접 분석해보면서 부분 덤프를 해야하겠죠;;... )


보통은 위와 같은 구현으로 잘 돌아갑니다만...

테스트를 해보니 문제가 발생하는 경우가 있었습니다..

실행파일이 "Delay Import" 를 가지는 경우인데요~

정확한 이유는~~ =0= 다음에 좀 더 살펴보고 이어서 포스팅을 할까 합니다..
( 사실 =0= 아직 이유를 모르거든요;;;.. )

암튼.. 위와 같은 방식을 단일 실행파일에 적용하는 것은 괜찮겠지만...

패커나 프로텍터 등~ 다양한 파일을 지원하는 프로젝트에 적용하는 것은~

고려를 해봐야될 듯 합니다.. ^^:
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. BlogIcon jz- 2009.03.03 13:28 신고  댓글주소  수정/삭제  댓글쓰기

    안될 api를 쓰겠지 하고 딜레이임포트 코드를 봤는데
    loadlibrary, getprocaddress, jmp to func로 이어지고, 그 후에는 iat에 func주소를 박아놓더군요
    제머신에선 잘 돼서 이유를 못알아냈습니다. 칙쇼~~
    머신때문인지 바이너리 자체 때문인지(vs6로 컴파일한 바이너리입니당..) 모르겠지만
    혹시 저작권 문제가 없다면 그 안되는 바이너리를 받아볼 수 있을까요?

    • BlogIcon XeroNic(HS) 2009.03.03 15:53 신고  댓글주소  수정/삭제

      한글과컴퓨터 오피스뷰어 2007의..
      HncView.exe 파일도 Delay Import 를 가지는데..
      실행중에 이미지 베이스를 날려버린 후..
      XLS/PPT 등 다른 포맷을 읽어들이려하면...
      제대로 동작하지 않더라구요...^^;;

  2. BlogIcon jz 2009.07.08 23:23  댓글주소  수정/삭제  댓글쓰기

    아 까먹고 있다가 오늘 보고 리플을 답니다.

    예전에 해보고 리플을 달았던거 같은데 아닌가보네요 ^^;;

    peb의 imagebase를 날려버리면 kernel32의 GetModuleHandle( NULL )이 동작 안합니다. GetModuleHandle이 peb를 참조해서 리턴하기 때문이죠.
    GetModuleHandle이 제대로 안돼서 저 프로그램들이 안돌았을 수도 있구요
    아니면 exception이 걸렸을 수도 있습니다.
    exception이 걸리면 seh handler를 찾는 과정중에 peb의 imagebase였나 dll_entry의 맨 첫번째 링크였나(마찬가지로 exe의 imagebase죠)를 참조해서 pe format을 파싱하는데
    이과정에서 imagebase가 0이 돼있으면 handler를 호출하지 못하고 프로세스가 비정상 종료됩니다. ^^;

  3. HooKiS 2011.12.01 11:20  댓글주소  수정/삭제  댓글쓰기

    // LDR_DATA 의 첫번째 모듈 정보 조작
    MOV EAX, DWORD PTR FS:[0x30]
    MOV EAX, DWORD PTR [EAX + 0x0C]
    MOV EAX, DWORD PTR [EAX + 0x0C]

    LDR_DATA를 조작하기 위해서는 위 코드에서 .. EAX + 0x0C가 아니라

    // LDR_DATA 의 첫번째 모듈 정보 조작
    MOV EAX, DWORD PTR FS:[0x30]
    MOV EAX, DWORD PTR [EAX + 0x10]
    MOV EAX, DWORD PTR [EAX + 0x10]
    이 되어야하지 않나요 ? 궁금해서 질문 드립니다 ^^

    • BlogIcon XeroNic(HS) 2011.12.01 14:09 신고  댓글주소  수정/삭제

      음.. 32비트 OS 에서 PEB 구조체는 다음과 같이 되어있습니다.

      lkd> dt nt!_peb
      +0x000 InheritedAddressSpace : UChar
      +0x001 ReadImageFileExecOptions : UChar
      +0x002 BeingDebugged : UChar
      +0x003 SpareBool : UChar
      +0x004 Mutant : Ptr32 Void
      +0x008 ImageBaseAddress : Ptr32 Void
      +0x00c Ldr : Ptr32 _PEB_LDR_DATA
      +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS

      PEB + 0x0C 부분이~ Ldr 의 포인터이며..
      PEB + 0x10 부분은 프로세스 파라메터 포인터입니다. ^^