App : System Cleaner 4.89 Build 110
Url : http://www.allerasoft.com/products/systemcleaner/
번역 : 김지환 (forc1@naver.com)
시작하기전에
=============
들어바! 이 문서 3번째 쓰는거야 !!
첫번짼 쓰다가 충돌 되어 날아갔어. 두번째는 정전이 되버렸지 뭐야 !!
이제..
이 문서는 ASP 1.3x 를 어떻게 언팩 하는지 진짜 쉽고 빠르게 보여줄꺼야.
그리고 stolen bytes 를 찾을꺼야. 조낸 쉽게 그리고 빠르게.
SoftIce, IceDump, /Tracex 는 잠시 접어두자구 !
그럼 어떻게해?
올리를 사용하지뭐!
필요한 도구
============
1. OllyDbg 1.09b2 or newer
2. ProcDump(G-rom)/Pe-edit(y0da)
3. imprec 1.3 (MackT/UCF)(protools.cjb.net)
4. HVIEW / Hex Editor
언패킹 과정
============
1. OEP 찾고 Dump 하기
2. Stolen Bytes 찾기
3. IAT Rebuild
4. OEP 고치기
5. 끝-
====================================
Step 1 - OEP 찾고 Dump 하기
====================================
1. 올리를 실행시키고 프로그램을 불러온다. (뭐라 묻거든 '예'를 눌러라)
2. 이제 F9를 누르면 여기서 멈출것이다 :
017E3414 3100 XOR DWORD PTR DS:[EAX],EAX <- 여기서 멈춤
017E3416 EB 01 JMP SHORT 017E3419
017E3418 68 648F0500 PUSH 58F64
올리는 왜 멈췄나? breakpoint를 준적 없는데 !?
냥- 올리는 새로운 모듈에 들어가면 항상 멈춘다 ... 우리는 이것을 이용할것이다 !!
3. Shift+F9 를 누르면 올리는 다음 모듈까지 실행을 계속한다.
4. Shift+F9 를 26번 누른후 아마도 여기에 위치할것이다 :
017E2D7A 3100 XOR DWORD PTR DS:[EAX],EAX <- 요기~
017E2D7C 64:8F05 00000000 POP DWORD PTR FS:[0] <- 여기에 브포 설정
017E2D83 58 POP EAX
017E2D84 833D 806D7E01 00 CMP DWORD PTR DS:[17E6D80],0
017E2D8B 74 14 JE SHORT 017E2DA1
017E2D8D 6A 0C PUSH 0C
017E2D8F B9 806D7E01 MOV ECX,17E6D80
017E2D94 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
017E2D97 BA 04000000 MOV EDX,4
017E2D9C E8 EFE0FFFF CALL 017E0E90
017E2DA1 FF75 FC PUSH DWORD PTR SS:[EBP-4]
017E2DA4 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
017E2DA7 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
017E2DAA 8338 00 CMP DWORD PTR DS:[EAX],0
017E2DAD 74 02 JE SHORT 017E2DB1
017E2DAF FF30 PUSH DWORD PTR DS:[EAX]
017E2DB1 FF75 F0 PUSH DWORD PTR SS:[EBP-10]
017E2DB4 FF75 EC PUSH DWORD PTR SS:[EBP-14]
017E2DB7 C3 RETN
Shift+F9를 한번만 더 눌러도 프로그램은 실행되니 절대 누르지 마라!!
5. marker를 아래로 이동하라
017E2D7C 64:8F05 00000000 POP DWORD PTR FS:[0]
그리고 F2 를 눌러라. (브포 설정)
이제 Shift+F9를 누르면 올리는 브포에서 멈출것이다.
6. 이제 F8로 trace하고 RETN 을 실행하면 여기에 위치할것이다 :
017F4EC8 E9 080A0000 JMP 017F58D5 <- we are here
F8을 눌러 위의 jump 를 실행하라..
그러면 여기에 위치할것이다:
017F58D5 D3DE RCR ESI,CL <-- 요기
017F58D7 B9 7D966271 MOV ECX,7162967D
017F58DC 81C1 38F10A23 ADD ECX,230AF138
017F58E2 D3EE SHR ESI,CL
017F58E4 BA 9ECC7376 MOV EDX,7673CC9E
017F58E9 81EA C56EFFD4 SUB EDX,D4FF6EC5
017F58EF 81F2 B7104902 XOR EDX,24910B7
017F58F5 C1CA 94 ROR EDX,94
017F58F8 8BF2 MOV ESI,EDX
017F58FA 81EE 87D851D2 SUB ESI,D251D887
017F5900 C1CE B0 ROR ESI,0B0
017F5903 8BC6 MOV EAX,ESI
017F5905 C1C8 28 ROR EAX,28
017F5908 53 PUSH EBX
017F5909 5E POP ESI
017F590A 81C5 974FAF73 ADD EBP,73AF4F97
017F5910 BA 048A9178 MOV EDX,78918A04
017F5915 F7D2 NOT EDX
017F5917 F7D2 NOT EDX
017F5919 81C2 FC756E87 ADD EDX,876E75FC
017F591F 8BDA MOV EBX,EDX
017F5921 41 INC ECX-------------------------
017F5922 8BD9 MOV EBX,ECX |
017F5924 D1C3 ROL EBX,1 | a Realy Long
017F5926 81F3 A38FD7AC XOR EBX,ACD78FA3 | Loop
017F592C 3BD8 CMP EBX,EAX |
017F592E ^0F85 EDFFFFFF JNZ 017F5921--------------------
017F5934 8BC1 MOV EAX,ECX <<-- 여기에 브포 설정
F8을 눌러서 전체 루프를 trace 하지 않을거다 !! 아래에 브포를 걸것이다:
017F5934 8BC1 MOV EAX,ECX
이제 브포를 설정(F2)한 후 F9(실행)를 누르면 브포에서 멈출것이다.
7. 뭐 ?? F8 / F7(Trace Into)로 전부다 trace 하라고 ??!!
음.. 아니!!
올리에는 Command Line 이라는 므훗한 도구가 있다
Plugins->Command line->Command line 으로 가라
자- 이제 조건과 함께 trace 명령을 쓸거다.
그래 ! 올리는 Trace command 가 있다! TC - Trace Condition 라고 한다.
이것은 조건이 참일때까지 trace 한다.
그래서.. 텍스트 박스에 다음과 같이 써라 : TC EIP<900000
그리고 엔터.
윈도우의 오른쪽 밑에 다음과 같은게 보일것이다 : "Tracing"
조낸 느린 나의 컴(350MHz)으로 8분 정도 걸린다.
다른 컴퓨터(900MHz 셀러론)에서 하니 2분쯤 걸리더라.
나에게 컴퓨터를 사주고 싶거든 내가 어디있는지 찾고 메시지를 주시라. -_-;;
8. trace가 다되면 여기서 멈춘다.
0057EA5B E8 DB E8
0057EA5C 00 DB 00
0057EA5D 8A DB 8A
0057EA5E E8 DB E8
0057EA5F FF DB FF
이바이바!! 나나 이거 볼주 몰라!! 이게 머야!?
냥- 이 코드는 아직 올리에 의해 분석되지 않았다.
이게 문제가 아니잖아~ 왜냐면 우리는 지금 OEP 에 있기 때문이야!
OEP=57EA5B
9. 중요! OEP 에서 EAX의 값을 보아. (오른쪽 위 - CPU Window)
EAX=57E318
이것을 적어둬라. 나중에 필요할 지니..
10. 이제 ProcDUmp/Pe-Edit 를 열고 프로세스 전체를 덤프 하라.
============================
Step 2 - Stolen Bytes 찾기 =
============================
Stolen Bytes로 가기 위해 현제까지 3가지 방법이 있다.
1. ASPR은 stolen bytes를 실행할것이고 그리곤 아래와 같이 OEP로 간다.
Stolen_Bytes_1
Stolen_Bytes_2
Stolen_Bytes_3
.....
.....
PUSH_THE_ADDRESS_OF_OEP
RET_TO_OEP
2. ASPR은 처음에 stolen bytes를 저장할것이고 그리곤 OEP로부터 byte를 제거할 것이며 아래와 같이 OEP로 Jmp 할것이다.
Stolen_Bytes_1
Stolen_Bytes_2
Stolen_Bytes_3
PUSH EBX
PUSH ESI
PUSH EDI
......
......
......
REPZ STOSB <- bytes 제거
POPFD
POPAD
JMP_TO_OEP
3. stolen byte가 없으면 단지 PopAD 하고 OEP로 점프한다.(Stolen byte 없음)
그래서 할려는게 뭔데 ??
OEP를 얻기 전에 ASPR의 마지막 스텝을 보기위해 Trace 로그를 볼 필요가 있다.
그래 ! 올리는 "Run Trace"라고 부르는 Trace 코드 로그를 얻었다.
그래서.. View->Run trace 메뉴를 선택하라
이제 새로운 윈도우가 보인다 .. 마지막 바로 전 라인으로 가면 아래와 같은게 보일것이다.
017F5779 F3:AA REP STOS BYTE PTR ES:[EDI]
017F577B 9D POPFD
017F577C 61 POPAD
017F577D -E9 D992D8FE JMP SYSTEMCL.0057EA5B <-- OEP 주소
2번째 방법을 사용할것이다.
win98은 안되고 winXP에선 작동한다는걸 알아냈다.
그래서 CPU Window 에서 Ctrl+S 를 눌러라 (Sequence of commands를 찾음)
그리고 그곳에 이렇게 써있다.
PUSH EBX
PUSH ESI
PUSH EDI
아래것들을 찾게 될것이다.
01029227 0055 8B ADD BYTE PTR SS:[EBP-75],DL
0102922A EC IN AL,DX ; I/O command
0102922B 83EC 54 SUB ESP,54
0102922E 53 PUSH EBX
0102922F 56 PUSH ESI
01029230 57 PUSH EDI
01029231 6A 11 PUSH 11
"00"을 무시하면 얻을것이다.
stolen byte : 55, 8b, ec, 83, ec, 54
이것 역시 써놔라.. 나중에 쓰일지니..
이제 올리를 끄고 나와라...
지금은 필요 없다.
======================
Step 3 - IAT Rebuild =
======================
1. 프로그램을 실행시키고 로드될때까지 기다려라
2. Imprec를 열고 리스트에서 프로그램을 선택
3. "IAT AutoSearch"를 눌러
4. 사이즈를 "BC" 에서 1000으로 바꿔라 (BC는 넘 작아 >.<)
5. "Get Imports"를 눌러
6. "Show Invalid"를 눌러
7. 나타난 invalid 에서 우클릭 하고 "Trace level 1"를 선택
8. "Show Invalid" 를 다시 눌르면 아래와 같은걸 얻을것이다.
(cut from the saved tree)
FThunk: 0019E258 NbFunc: 00000400
1 0019E258 kernel32.dll 00D6 DeleteCriticalSection
1 0019E25C kernel32.dll 0228 LeaveCriticalSection
................
생략
................
1 0019E2A4 kernel32.dll 01D1 GetThreadLocale
1 0019E2A8 kernel32.dll 01B9 GetStartupInfoA
0 0019E2AC ? 0000 017E0F2C <-- good
0 0019E2B0 ? 0000 017E139C <-- good
1 0019E2B4 kernel32.dll 018B GetModuleFileNameA
1 0019E2B8 kernel32.dll 0183 GetLocaleInfoA
1 0019E2BC kernel32.dll 0181 GetLastError
1 0019E2C0 kernel32.dll 0158 GetCurrentDirectoryA
0 0019E2C4 ? 0000 017E1408 <-- good
1 0019E2C8 kernel32.dll 0133 FreeLibrary
1 0019E2CC kernel32.dll 011C FindFirstFileA
..................
생략
..................
1 0019E314 kernel32.dll 00A0 CloseHandle
0 0019E318 ? 0000 0255A00E <-- BAD
1 0019E31C user32.dll 0112 GetKeyboardType
1 0019E320 user32.dll 019F LoadStringA
1 0019E324 user32.dll 01AD MessageBoxA
1 0019E328 user32.dll 0026 CharNextA
0 0019E32C ? 0000 70F7D832 <-- BAD
1 0019E330 advapi32.dll 00F7 RegQueryValueExA
1 0019E334 advapi32.dll 00EF RegOpenKeyExA
1 0019E338 advapi32.dll 00D8 RegCloseKey
0 0019E33C ? 0000 F37514C2 <-- BAD
1 0019E340 oleaut32.dll 0006 SysFreeString
1 0019E344 oleaut32.dll 0005 SysReAllocStringLen
1 0019E348 oleaut32.dll 0004 SysAllocStringLen
0 0019E34C ? 0000 4007F56E <-- BAD
1 0019E350 kernel32.dll 0307 TlsSetValue
1 0019E354 kernel32.dll 0306 TlsGetValue
1 0019E358 kernel32.dll 01E6 GlobalAlloc
0 0019E35C ? 0000 017E139C <-- good
0 0019E360 ? 0000 BF57C0D8 <-- BAD
.......................
생략
.......................
이와 같이 계속 진행된다.
BAD 주소(packer 코드 안에 있는거 말구)를 직접 선택할 필요가 있다. 그리고
우클릭해서 "Cut Thunk(s)" 선택
* 마지막을 잘 봐봐 .. 거기에 좋은 thunk 가 있어 ..
이제 그곳들을 good byte로 바꿀 필요가 있다. fraviamb.cjb에서 몇몇 플러그들을 다운받을 수 있다.
rebuild 하는 방법에 대한 나의 다른 튜토리얼을 보기 위해 New2Cracking.cjb.net 이나 Faviamb.cjb.net에 가보라.
아래는 내가 고친거다.
0019E2AC-> 017E0F2C ->GetProcAddress
0019E2B0-> 017E139C ->GetModuleHandleA
0019E2C4-> 017E1408 ->GetCommandLineA
0019E35C-> 017E139C ->GetModuleHandleA
0019E428-> 017E1420 ->LockResource
0019E47C-> 017E13C4 ->GetVersion
0019E4AC-> 017E0F2C ->GetProcAddress
0019E4B8-> 017E139C ->GetModuleHandleA
0019E4FC-> 017E13F8 ->GetCurrentProcessId
0019E500-> 017E13F0 ->GetCurrentProcess
0019E50C-> 017E1430 ->FreeResource
9. 이제 "Fix Dump" 를 누르고 덤프된 파일을 선택..
imprec는 덤프 파일의 이름 앞에 "_"를 추가하고 파일을 저장한다.
=====================
Step 4 - OEP 고치기 =
=====================
1. 이제 HVIEW /Hex Editor를 열고 OEP offset: 57ea5b로 가라
윗쪽 57ea55(6byte 앞)로 가서 "00" 대신에 stolen byte를 써넣는다.
새로운 파일로 저장.
2. open ProcDump/Pe-Edit를 열고 Pe-edit로 rebuild 파일을 로드하고
EP를 57ea55로 바꿔라. (stolen bytes 때문에)
3. 프로그램을 실행하려 한다면 충돌이 일어날것이다!!
4. 올리를 열고 fix된 파일을 로드하라.
5. OEP : 57ea55 에서 EAX 값은 뭔가? 내가 말했던거 기억하니?
덤핑하기 전에 OEP에서 EAX 값을 저장한것을.. EAX=57E318 이였지.
이 값이 우리 값과 다르다는건 잃어버린 하나의 명령이 더 있다는 의미다.
MOV EAX, 0157E318
byte로는 5byte다(HVIEW에서 직접 시도할 수 있다)
B818E35700 MOV EAX, 0157E318
이것은 6+5=11(decimal)의 stolen byte를 가지고 있다는걸 뜻한다.
이것은 진짜 OEP는 다음과 같다는걸 의미한다.
11=B(hex)
OLD_OEP-STOLEN_BYTES=57EA5B-B=57EA50
OEP = 57EA50
이제 HVIEW/Hex Edit에서 새로운 OEP로 가서 그곳에 써라.
55,8B,EC,83,EC,54,B8,18,E3,57,00
이제 ProcDump/Pe-Edit를 이용해서 EP를 57EA50으로 고쳐라
그러면 이제 프로그램은 실행될것이다.
끝!
(revised by forc1)