반응형


회사 프로젝트 때문에~ 이런저런 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 에 사용된 더미코드/정크코드는 실행할 때 마다 형태가 달라집니다;; 다형성이죠;;.. )

매번 느끼는거지만.. ㅋ... 실행파일 프로텍터들;;;.. 다른 파일을 감염시키지 않을 뿐;;..

어떻게보면 "바이러스" 와 비슷하다고 볼 수도 있을 것 같네요...ㅋ

그런 측면에서.. 백신들의 인공지능 체크에서 프로텍터들을 감지하는 것도 이해가 가기도 하구요;;ㅋㅋㅋㅋ

암튼.. 오늘은 이만 잘렵니다...ㅋ

반응형
AND