안티-리버싱 기법에 대해 관심이 많으신 분들은~~ 다들 알만한 내용입니다만...
-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= 아직 이유를 모르거든요;;;.. )
암튼.. 위와 같은 방식을 단일 실행파일에 적용하는 것은 괜찮겠지만...
패커나 프로텍터 등~ 다양한 파일을 지원하는 프로젝트에 적용하는 것은~
고려를 해봐야될 듯 합니다.. ^^:
'Reverse Engineering' 카테고리의 다른 글
사람 난감하게 만든 '언인스톨러'... (6) | 2010.03.22 |
---|---|
3rd 코드엔진(CodeEngn) 컨퍼런스~!! (18) | 2009.06.24 |
간단한 안티-덤프 트릭~ ( LordPE, OllyDBG, etc... ) (6) | 2009.02.26 |
Anti-Unpacker Tricks ( by Peter Ferrie ) (3) | 2009.02.25 |
Themida 의 API Wrapping 분석(?) (28) | 2008.11.20 |
XP SP3 와 OllyAdvanced 문제..;;; (3) | 2008.05.15 |
안될 api를 쓰겠지 하고 딜레이임포트 코드를 봤는데
loadlibrary, getprocaddress, jmp to func로 이어지고, 그 후에는 iat에 func주소를 박아놓더군요
제머신에선 잘 돼서 이유를 못알아냈습니다. 칙쇼~~
머신때문인지 바이너리 자체 때문인지(vs6로 컴파일한 바이너리입니당..) 모르겠지만
혹시 저작권 문제가 없다면 그 안되는 바이너리를 받아볼 수 있을까요?
한글과컴퓨터 오피스뷰어 2007의..
HncView.exe 파일도 Delay Import 를 가지는데..
실행중에 이미지 베이스를 날려버린 후..
XLS/PPT 등 다른 포맷을 읽어들이려하면...
제대로 동작하지 않더라구요...^^;;
아 까먹고 있다가 오늘 보고 리플을 답니다.
예전에 해보고 리플을 달았던거 같은데 아닌가보네요 ^^;;
peb의 imagebase를 날려버리면 kernel32의 GetModuleHandle( NULL )이 동작 안합니다. GetModuleHandle이 peb를 참조해서 리턴하기 때문이죠.
GetModuleHandle이 제대로 안돼서 저 프로그램들이 안돌았을 수도 있구요
아니면 exception이 걸렸을 수도 있습니다.
exception이 걸리면 seh handler를 찾는 과정중에 peb의 imagebase였나 dll_entry의 맨 첫번째 링크였나(마찬가지로 exe의 imagebase죠)를 참조해서 pe format을 파싱하는데
이과정에서 imagebase가 0이 돼있으면 handler를 호출하지 못하고 프로세스가 비정상 종료됩니다. ^^;
아~! 감사합니다.. (__)
( 잊지않고 이런걸 또... ^^;; )
// 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]
이 되어야하지 않나요 ? 궁금해서 질문 드립니다 ^^
음.. 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 부분은 프로세스 파라메터 포인터입니다. ^^