회사 프로젝트 때문에~ 이런저런 Packer/Protector 들을 많이 살펴보게 됩니다...
그 중에 가장~ 난감한 녀석을 꼽으라면 역시 Themida 가 아닐까 싶네요;;;...
( ㅋ.. 이쪽 분야를 접한 분들 중에서 알만한 분들은 다 아실듯한... )
Themida 의 여러 기능 중~ 타겟을 분석하기 짜증나게(?) 하는 것 중의 하나가 바로 API Wrapping 인데요...
오늘은 API Wrapping 에 대해서 알게된 것을 정리를 해볼까합니다;;ㅋ...
API Wrapping ... 말그대로 "API 를 감싼다" 라고 생각하시면 될듯 합니다.
( 실제로 대상 API 를 이런저런 더미코드 및 정크코드로 둘러싼거니까요~ :D )
지금부터~ㅋ 특정 API 하나를 타겟으로 잡아서 Themida 가 어떤식으로 Wrapping 했는지 추적을 해봅시다~
#01. 원본파일의 코드
#02. Themida 로 팩된 파일의 코드
원본파일에서 "FF 15 ~ XXXXXXXX" 로 되어있는 6 바이트 CALL 문을
"E8 ~ XXXXXXXX" 의 5 바이트 CALL 문으로 바꾸면서~ 길이를 맞추기 위해 NOP 추가했습니다.
코드가 조금 변경되면서 보이는 길이가 달라지긴 했지만 전체적인 형태를 보면 같은 형태인걸 확인하실 수 있을겁니다.
SendDlgItemMessageW 를 콜하는 부분이 016005F9 를...
lstrcpyW 를 콜하는 부분이 014D0000 를...
CloseHandle 를 콜하는 부분이 014C0BD9 를.. 콜하도록 변경된거죠~~
이걸 바꿔말하면 016005F9 에서는 어떻게든 SendDlgItemMessageW 를 호출할테고...
014D0000 에서는 역시 lstrcpyW 를 호출할테고...
014C0BD9 에서는 CloseHandle 을 호출한다고 볼 수 있습니다.
이 중에서 CloseHandle 을 호출할 014C0BD9 .. 이 곳을 트레이스 해보도록 하겠습니다.
먼저 원본에서 CloseHandle API 가 어떤 구조로 되어있나 확인부터 해봅니다~ :)
#03. 원본의 CloseHandle API 코드
CloseHandle API 코드 한줄 한줄을 잘 봐두시길 바라면서~~ 이제 트레이스를 시작합니다.
크.. 터무니없이 길어질 것 같아서~~ 트레이스 과정은 접어두도록 하겠습니다.
ㅋ... 트레이스는 끝이 났네요;;;
이제 REAL CODE 라고 되어있는 코드만 쭉~~ 모아볼까요?;
=============================================================
MOV EDI, EDI
XCHG EAX, EBP
PUSH EAX
XCHG EAX, EBP
MOV EBP, ESP
MOV EAX, DWORD PTR FS:[18]
MOV ECX, DWORD PTR [EAX+30]
MOV EAX, DWORD PTR SS:[EBP+8]
CMP EAX, -0C
JE Kernel32.7C830A42
CMP EAX, -0B
JE Kernel32.7C830A37
CMP EAX, -0A
JE Kernel32.7C839BC1
MOV ECX, EAX
AND ECX, 10000003
CMP ECX, 3
PUSH EAX
JE Kernel32.7C81D3CF
CALL DWORD PTR DS:[<&ntdll.NtClose>]
TEST EAX, EAX
JL Kernel32.7C830A2A
SUB EAX, EAX
INC EAX
POP EBP
RETN 4
=============================================================
요렇게 모인 코드와... 조~~기 위의 CloseHandle API 코드를 비교를 해볼까요~~ㅋ
붉은색으로 칠한 코드빼고는 완전히 똑같은 걸 알 수 있습니다..
붉은색으로 칠한 코드는... =0=;; 코드 자체는 살짝 다르긴 하지만.. 동작은 동일합니다..;
XCHG EAX, EBP
PUSH EAX
XCHG EAX, EBP
이 부분에 대한 내용은 위에서 언급을 했으니 넘어가고..
SUB EAX, EAX...
원본 코드에선 XOR EAX, EAX 가 되어있는데...
XOR 이나 SUB 나.. 앞뒤로 같은 레지스터를 넣어버리면
둘다~ 해당 레지스터의 값을 0 으로 만들어버린다는 것은 동일하거든요;;
즉, Themida 의 API Wrapping 을 정리를 하자면...
"원래 API 의 코드를 새로운 메모리에 복사를 하면서 정상코드를 더미코드 / 정크코드와 같이 섞어두는 것"
정도면 되려나요...;;;
더미코드 / 정크코드를 실행하는 중간에 정상코드를 실행하도록해서 분석을 어렵게 만드건데...
흠... API Redirect 개념과는 조금 다르지 않나 생각되네요...;;
아... 보너스로 Themida 에서 보이는 코드 변형 패턴은.. 대체로 아래와 같은 형식입니다..
XOR EAX, EAX
=> SUB EAX, EAX
PUSH EBP
=> Type1) XCHG EAX, EBP / PUSH EAX / XCHG EAX, EBP
=> Type2) PUSH ESI / MOV DWORD PTR SS:[ESP], EBP
.......
이상으로 ㅋ.. Themida 의 API Wrapping 에 대한 정리를 마칠까 합니다..ㅡ.ㅡ;;
크... 포스팅에 2시간이나 걸렸네요;;;; ㄷㄷㄷ;;;..
타겟 함수 잡는 것도 꽤 힘들었는데.. 포스팅이 더 힘든;;;;
( 여담이지만.. API Wrapping 에 사용된 더미코드/정크코드는 실행할 때 마다 형태가 달라집니다;; 다형성이죠;;.. )
매번 느끼는거지만.. ㅋ... 실행파일 프로텍터들;;;.. 다른 파일을 감염시키지 않을 뿐;;..
어떻게보면 "바이러스" 와 비슷하다고 볼 수도 있을 것 같네요...ㅋ
그런 측면에서.. 백신들의 인공지능 체크에서 프로텍터들을 감지하는 것도 이해가 가기도 하구요;;ㅋㅋㅋㅋ
암튼.. 오늘은 이만 잘렵니다...ㅋ
'Reverse Engineering' 카테고리의 다른 글
간단한 안티-덤프 트릭~ ( LordPE, OllyDBG, etc... ) (6) | 2009.02.26 |
---|---|
Anti-Unpacker Tricks ( by Peter Ferrie ) (3) | 2009.02.25 |
XP SP3 와 OllyAdvanced 문제..;;; (3) | 2008.05.15 |
XP 서비스팩3 설치시~ Olly Advanced 비정상 동작~;; (3) | 2008.05.10 |
중국산 실행압축프로그램~ Upack~! (6) | 2007.12.02 |