반응형


회사 프로젝트 때문에~ 이런저런 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

반응형


이번에는 가지고 있으면 이리저리~ 도움이 될 만한(?) 올리디버거의 플러그인을 몇가지 소개할까 합니다.

( 물론 "Olly Advanced" 같은~ 다들 알만한 플러그인은 제외하구요..^^; )


◆ Code Ripper ◆

디스어셈블리창에 보이는 내용들 중 선택한 영역에 대한 어셈블리 코드만 뽑아주는 플러그인입니다.

Code Ripper #1 - Code Ripper 를 적용할 타겟

위의 함수에 Code Ripper 를 사용하면~

Code Ripper #2 - 결과


이렇게 됩니다~~ㅋ

별것아닌것 같지만... 어셈 코드만 떼어내서 사용하고 싶을 때 꽤~ 편리하답니다. :-)



◆ Data Ripper ◆

이름에서 알 수 있듯이(?) Code Ripper 와는 자매품이 아닐까~ 생각되는 플러그인입니다.

Code Ripper 가 코드를 추출해주는 플러그인이라면 Data Ripper 는 데이터(?) 를 추출해주는 플러그인입니다.

( 물론 선택한 영역에 대해서~~^^;; )

"백문이 불여일견"이라고.. 아래 화면을 보시면 이해가 빠를듯 :D

Data Ripper #1 - Data Ripper 를 적용할 타겟


위의 선택한 영역에 대해서 Data Ripper 를 사용하면~

Data Ripper #2 - 결과


요렇게~~ :-) .. 패턴 작업할때~ 꽤 편리하답니다~ㅋ

제 편의상 C/C++ 형식에 BYTE 형으로 맞춰서 사용중입니다만... 입맛에 맞게 셋팅을 하실 수 있습니다.

Data Ripper #3 - Data Ripper 의 셋팅창



◆ Memory Dump ◆

Memory Dump 의 주기능은 Data Ripper 와 같지만... Memory Dump 만의 다른 기능때문에 같이 사용중입니다.

Memory Dump #1 - Memory Dump 의 메뉴


Delphi/Pascal, C/C++, ASM, Visual Basic 등의 Table 을 지원해주는데 이는 Data Ripper 와 동일한 기능이구요.

Memory Dump #2 - 데이터를 Delphi/Pascal 테이블로 추출한 결과



그 외 Range Dump 를 통해 임의로 영역을 지정해서 Dump 를 만들수도 있고..

Xor Selection 으로 선택한 데이터에 XOR 연산을 한 결과를 얻을 수도 있습니다.



◆ Game Invader ◆

"Cheat Engine" 의 일부 기능(메모리 서치 기능~ㅋ)을 올리디버거의 플러그인으로 만든 것입니다..

Game Invader #1 - "지뢰찾기" 시간 부분을 찾은 결과


물론 치트엔진만큼 강력하진 않지만 올리디버거로 트레이스할 때 이용하면 ~ 상당히 편리하답니다.. :-)


이상으로 4가지 플러그인의 소개를 마칩니다;

뭐.. 해당 플러그인들을 아는 분들도 계시겠지만... 은근히 모르는 분들이 많아서 살포시 올려봤습니다.

< 다운로드 >





출처 : Tuts4You - http://www.tuts4you.com/
반응형

'Reverse Engineering > RCE Tools' 카테고리의 다른 글

Kernel Detective v1.4.1  (2) 2010.12.19
Import REConstructor v1.7e FINAL ~  (0) 2010.10.13
XueTr 0.36 업데이트~  (2) 2010.08.07
올리디버거~ 2.0 Final Release (2010.06.04)  (0) 2010.06.11
Kernel Detective v1.3.1  (8) 2010.03.29
AND

[자작곡] Rainy Day...

My Music 2008. 11. 16. 13:44
반응형



지난 여름...

한참 비가 많이 올 때, 만든 곡인데 =0=;;;

어쩌다보니 이제서야 올리게되는군요;;;


밤에 잠 못이루면서... 뒤척거리다가...

빗소리 들으면서~~ 멍하게 있다가~ 만든 곡입니다;;ㅋ



반응형

'My Music' 카테고리의 다른 글

[자작곡] 아련함... (BGM Ver.)  (14) 2009.03.05
[자작곡] Where Am I...?  (12) 2008.12.20
[자작곡] 어느 기다림...  (7) 2007.12.29
[자작곡] Intro... ( Make me Crazy... )  (2) 2007.09.02
HS - 아끼지 못했던 사랑...  (0) 2007.06.10
AND