############################################
stolen
bytes가 있는 버전에 대한 해법입니다.
############################################
대상
: 입문용+
타겟
: Web Stream Recorder v1.0 Beta 3 (http://www.sytexis.com/)
or here
도구
: Soft-Ice 4.05 B334
Ice-Dump
Pe-Editor
1.7
ImportRec
& Revergine 1.6 final
Hiew
6.x (핵스 에디터)
환경
: Win 98 SE
이번에 살펴볼 것은 ASProtect 1.23 RC4 - 1.3.08.24 입니다. 가장 최근 버전이죠.
이 버전의 가장 큰 어려움은 stolen bytes 를 찾는 것입니다. 사실 stolen bytes
는 예전 copywrite님이 올리신 '새로운 형태의 Asprotect' 라는 글에서 예견되었던
것입니다. 다만 그 문서의 타겟이 되었던 프로그램의 경우 stolen bytes 가 지워지지
않아, iceDump 의 LastBranch를 통해 찾아갈 수 있었습니다. 하지만 지금의 경우는
조금 다릅니다. 즉 stolen bytes가 OEP로 점프된 이후에는 junk code 들로 인해 코드가
변경되기 때문에 알 수가 없습니다. 그럼 이제 stolen bytes 에 대해 알아보죠.
원래 프로그램은 통상,
55 PUSH EBP
8BEC MOV EBP,ESP
6AFF PUSH
FFFFFFFF
6800000000 PUSH 00000000 ; needs updating
6800000000 PUSH
00000000 ; needs updating
some codes.........
이런식으로 시작됩니다. 그런데 asprotect의 경우 이러한 시작부분을 미리 실행시킨
후 some codes 부분으로 바로 점프해옵니다. 또한 위 코드 중 push 00000000 부분에서
00000000 는 프로그램마다 다른 값이 들어가므로, 이것을 아는 것이 중요합니다.
즉 stolen bytes를 모른체로 덤프를 해봤자 소용이 없음을 뜻하죠. 또한 사실 새로운
형태의 asprotect의 경우에도 이러한 stolen bytes만 밝혀내면 예전과 동일한 방식으로
언팩킹이 가능합니다. 그럼 실제적인 작업을 시작해보죠.
1. 우선은 OEP를 찾아야 합니다. 이 OEP는 기존의 방법대로 /tracex를 이용해서
찾을 수 있습니다. 다만 새로운 버전의 경우 auto tracer trick(ATT)가 여러번 있어,
여러번 리턴을 해줘야 하는 번거로움이 있습니다. 이 ATT라는 것은 사실 별 문제가
되지 않습니다. 그것들의 루틴을 살펴보면, 바로 리턴되는 것이 특징이죠. 귀찮을
뿐이지 문제가 되진 않습니다. 하지만 /tracex를 사용할 경우 시간이 오래 걸립니다.
언팩킹에서 이러한 작업은 상당히 지루한 것이죠. 특히나 다시 덤프해야 할 때 정말
짜증납니다.
그래서 우린 copywrite 님의 빠른 OEP 접근법을 사용할 겁니다. 자 시작해보죠.
우선 다음과 같이 중단점을 설정하고,
bpx createfilea do "dd esp+38"
그리고 나서 프로그램을 실행시킨 후 데이터 윈도창의 주소가 asprotect 루틴이
나올 때까지 F5를 눌러줍시다. 그러고 나면,
EAX=0068FCE9
EBX=0003676B ECX=01015E18 EDX=0003676B ESI=0003676B
EDI=FFFFFFFF
EBP=0068FCC0 ESP=0068FC80 EIP=BFF77B5B o
d I S z a P c
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FCB8
01015E18
01003CBB 0068FDF4 01003D6A .^...<....h.j=..
0177:0068FCC8
000015A6 0068FF68 01003F4B 0068FDF4 ....h.h.K?....h.
0177:0068FCD8
00FF0000 00FD0000 01004138 00000000 ........8A......
0177:0068FCE8
5C3A4390 474F5250 204D4152 454C4946 .C:\PROGRAM
FILE
0177:0068FCF8
59535C53 49584554 4F532053 41575446 S\SYTEXIS
SOFTWA
0177:0068FD08
575C4552 53204245 41455254 4552204D RE\WEB
STREAM RE
0177:0068FD18
44524F43 575C5245 43455253 4544524F CORDER\WSRECORDE
-----KERNEL32!GetFullPathNameA+0046--------------------------------------PROT32-
016F:BFF77B56
E94C500000 JMP BFF7CBA7
KERNEL32!CreateFileA
016F:BFF77B5B
57 PUSH
EDI
016F:BFF77B5C
6827010000 PUSH
00000127
016F:BFF77B61
2BD2 SUB
EDX,EDX
016F:BFF77B63
684320FABF PUSH
BFFA2043
016F:BFF77B68
64FF32 PUSH
DWORD PTR FS:[EDX]
016F:BFF77B6B
648922 MOV
FS:[EDX],ESP
016F:BFF77B6E
8B7C2414 MOV
EDI,[ESP+14]
016F:BFF77B72
2BC0 SUB
EAX,EAX
016F:BFF77B74
8D48FF LEA
ECX,[EAX-01]
016F:BFF77B77
F2AE REPNZ
SCASB
016F:BFF77B79
8B4C2420 MOV
ECX,[ESP+20]
016F:BFF77B7D
E305 JECXZ
BFF77B84
016F:BFF77B7F
8A01 MOV
AL,[ECX]
016F:BFF77B81
8A410B MOV
AL,[ECX+0B]
016F:BFF77B84
648F02 POP
DWORD PTR FS:[EDX]
016F:BFF77B87
83C408 ADD
ESP,08
016F:BFF77B8A
5F POP
EDI
016F:BFF77B8B
E978790000 JMP BFF7F508
KERNEL32!SetFileAttributesA
016F:BFF77B90
2BD2 SUB
EDX,EDX
016F:BFF77B92
68EB1FFABF PUSH
BFFA1FEB
016F:BFF77B97
64FF32 PUSH
DWORD PTR FS:[EDX]
016F:BFF77B9A
648922 MOV
FS:[EDX],ESP
016F:BFF77B9D
8B4C240C MOV
ECX,[ESP+0C]
016F:BFF77BA1
E302 JECXZ
BFF77BA5
------------------------------------KERNEL32!_FREQASM+6B56----------------------
WINICE:
Load32 Obj=0001 Add=016F:BFE11000 Len=0000A000 Mod=IMM32
WINICE:
Load32 Obj=0002 Add=0177:BFE1B000 Len=00001000 Mod=IMM32
WINICE:
Load32 Obj=0003 Add=0177:BFE1C000 Len=00001000 Mod=IMM32
WINICE:
Load32 Obj=0004 Add=0177:BFE1D000 Len=00005000 Mod=IMM32
WINICE:
Load32 Obj=0005 Add=0177:BFE22000 Len=00001000 Mod=IMM32
Break
due to BPX KERNEL32!CreateFileA DO "dd esp+38"
Break
due to BPX KERNEL32!CreateFileA DO "dd esp+38"
:/screendump
c:\dump\wsr_1.txt
Invalid
command Wsrecord
그리고 나서 데이터 창에
나타난 주소가 실행되는 순간을 잡아봅시다. 그전에 다른 중단점은 모두 지워 버리구요.
bpr 1015E18
1015E18+2 rw if eip==1015E18 do "d esp"
그리고 다시 F5 하고 데이터
창을 봅시다. 그러면 400000 이라는 값이 들어가 있을 겁니다.
EAX=00444886
EBX=01004138 ECX=01019A1C EDX=0068FF68 ESI=00FD0000
EDI=00FF0000
EBP=0068FE08 ESP=0068FDD8 EIP=01015E18 o
d I s Z a P c
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8
00400000
D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8
00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8
00400000 00444886 D58A0195 0068FE1C ..@..HD.......h.
0177:0068FE08
0068FE10 01003A48 00444476 00000000 ..h.H:..vDD.....
0177:0068FE18
0044486E 00000000 8193BC10 0068FF78 nHD.........x.h.
0177:0068FE28
0068FE3C 00580000 8193BC70 8193BC30 <.h...X.p...0...
0177:0068FE38
00401000 BFF8B6E6 00000000 8193BC10 ..@.............
-------------------------------------------------------------------------PROT32-
016F:01015E18
E80D000000 CALL
01015E2A
016F:01015E1D
91 XCHG
EAX,ECX
016F:01015E1E
F6F7 DIV
BH
016F:01015E20
64CD82 INT
82
016F:01015E23
93 XCHG
EAX,EBX
016F:01015E24
D0C9 ROR
CL,1
016F:01015E26
CE INTO
016F:01015E27
EF OUT
DX,EAX
016F:01015E28
FC CLD
016F:01015E29
858BD858E80C TEST [EBX+0CE858D8],ECX
016F:01015E2F
0000 ADD
[EAX],AL
016F:01015E31
00943D32830039 ADD [EDI+EBP+39008332],DL
016F:01015E38
7EDF JLE
01015E19
016F:01015E3A
2CF5 SUB
AL,F5
016F:01015E3C
8AFB MOV
BH,BL
016F:01015E3E
6856173319 PUSH
19331756
016F:01015E43
58 POP
EAX
016F:01015E44
5A POP
EDX
016F:01015E45
0FBFF9 MOVSX
EDI,CX
016F:01015E48
81C288150000 ADD EDX,00001588
016F:01015E4E
66BF9238 MOV
DI,3892
016F:01015E52
682B050000 PUSH
0000052B
016F:01015E57
81EBD5D3A77B SUB EBX,7BA7D3D5
016F:01015E5D
5E POP
ESI
016F:01015E5E
0F8912000000 JNS 01015E76
016F:01015E64
0F890C000000 JNS 01015E76
016F:01015E6A
E907000000 JMP 01015E76
--------------------------------------------------------------------------------
Break
due to BPX KERNEL32!CreateFileA DO "dd esp+38"
Break
due to BPX KERNEL32!CreateFileA DO "dd esp+38"
:/screendump
c:\dump\wsr_1.txt
:bc
*
:bpr
1015e18 1015e18+2 rw if eip==1015e18
Break
due to BPR #0177:01015E18 #0177:01015E1A RW IF (EIP==0x1015E18)
:d
esp
:/screendump
c:\dump\wsr_2.txt
Invalid
command Wsrecord
그리고 나서,
bpm esp
다시 F5 하면 ,
EAX=5A007EB5
EBX=00400000 ECX=4605585B EDX=01015F0E ESI=00000000
EDI=4605585B
EBP=0068FE08 ESP=0068FDDC EIP=01015F13 o
d I s z A p c
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8
00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8
00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8
00400000 00444886 D58A0195 0068FE1C ..@..HD.......h.
0177:0068FE08
0068FE10 01003A48 00444476 00000000 ..h.H:..vDD.....
0177:0068FE18
0044486E 00000000 8193BC10 0068FF78 nHD.........x.h.
0177:0068FE28
0068FE3C 00580000 8193BC70 8193BC30 <.h...X.p...0...
0177:0068FE38
00401000 BFF8B6E6 00000000 8193BC10 ..@.............
-------------------------------------------------------------------------PROT32-
016F:01015F12
5B POP
EBX
016F:01015F13
58 POP
EAX
016F:01015F14
05469F54A7 ADD EAX,A7549F46
016F:01015F19
5C POP
ESP
016F:01015F1A
EB44 JMP
01015F60
016F:01015F1C
EB01 JMP
01015F1F
016F:01015F1E
9A51579CFCBF00 CALL 00BF:FC9C5751
016F:01015F25
0000 ADD
[EAX],AL
016F:01015F27
00B900000000 ADD [ECX+00000000],BH
016F:01015F2D
F3AA REPZ
STOSB
016F:01015F2F
9D POPFD
016F:01015F30
5F POP
EDI
016F:01015F31
59 POP
ECX
016F:01015F32
C3 RET
016F:01015F33
55 PUSH
EBP
016F:01015F34
8BEC MOV
EBP,ESP
016F:01015F36
53 PUSH
EBX
016F:01015F37
56 PUSH
ESI
016F:01015F38
8B750C MOV
ESI,[EBP+0C]
016F:01015F3B
8B5D08 MOV
EBX,[EBP+08]
016F:01015F3E
EB11 JMP
01015F51
016F:01015F40
0FB703 MOVZX
EAX,WORD PTR [EBX]
016F:01015F43
03C6 ADD
EAX,ESI
016F:01015F45
83C302 ADD
EBX,02
016F:01015F48
8BD0 MOV
EDX,EAX
016F:01015F4A
8BC6 MOV
EAX,ESI
016F:01015F4C
E80C000000 CALL
01015F5D
--------------------------------------------------------------------------------
:/screendump
c:\dump\wsr_2.txt
:bl
00)
BPR #0177:01015E18 #0177:01015E1A RW IF (EIP==0x1015E18)
:bc
*
:bpm
esp
Break
due to BPMB #0177:0068FDD8 RW DR3
:bc
*
:/screendump
c:\dump\wsr_3.txt
Invalid
command Wsrecord
여기에
중단점이 걸립니다.
여기서
바로 OEP로 가시려면 무수한 00 가 나올 때까지 코드창을 밑으로 내려봅시다. 그러면
아마도,
push
00000000
ret
0000
0000
0000
.......
이런식으로 나올 겁니다.
그러면 push 00000000 에 중단점을 걸고 넘어가시면 되겠습니다. 하지만 우리의 경우
stolen bytes를 찾아야 하므로 F8을 눌러 진행합시다. 그러면 아래의 루틴이 나올건데요.
EAX=01016212
EBX=01017418 ECX=01016212 EDX=010162A4 ESI=01016212
EDI=4605585B
EBP=0068FE0C ESP=0068FE04 EIP=01016194 o
d I s z a P c
CS=016F
DS=0177 SS=0177 ES=0177 FS=4297
GS=0000 DS:01017418=009C
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8
00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8
00FD0000 01004138 01019A1C 0101606C ....8A......l`..
0177:0068FDF8
00400000 00444886 010161A5 00000000 ..@..HD..a......
0177:0068FE08
00000323 00B5807E 01016211 01017412 #...~....b...t..
0177:0068FE18
01016212 00000000 8193A3A0 0068FF78 .b..........x.h.
0177:0068FE28
0068FE3C 00580000 8193A400 8193A3C0 <.h...X.........
0177:0068FE38
00401000 BFF8B6E6 00000000 8193A3A0 ..@.............
-------------------------------------------------------------------------PROT32-
016F:01016186
C3 RET
016F:01016187
55 PUSH
EBP
016F:01016188
8BEC MOV
EBP,ESP
016F:0101618A
53 PUSH
EBX
016F:0101618B
56 PUSH
ESI
016F:0101618C
8B750C MOV
ESI,[EBP+0C]
016F:0101618F
8B5D08 MOV
EBX,[EBP+08]
016F:01016192
EB11 JMP
010161A5
016F:01016194
0FB703 MOVZX
EAX,WORD PTR [EBX]
016F:01016197
03C6 ADD
EAX,ESI
016F:01016199
83C302 ADD
EBX,02
016F:0101619C
8BD0 MOV
EDX,EAX
016F:0101619E
8BC6 MOV
EAX,ESI
016F:010161A0
E80C000000 CALL
010161B1
016F:010161A5
66833B00 CMP
WORD PTR [EBX],00
016F:010161A9
75E9 JNZ
01016194
016F:010161AB
5E POP
ESI
016F:010161AC
5B POP
EBX
016F:010161AD
5D POP
EBP
016F:010161AE
C20800 RET
0008
016F:010161B1
0102 ADD
[EDX],EAX
016F:010161B3
C3 RET
016F:010161B4
03C3 ADD
EAX,EBX
016F:010161B6
BB23030000 MOV EBX,00000323
016F:010161BB
0BDB OR
EBX,EBX
016F:010161BD
7507 JNZ
010161C6
016F:010161BF
8944241C MOV
[ESP+1C],EAX
--------------------------------------------------------------------------------
:/screendump
c:\dump\wsr_2.txt
:bc
*
:bpm
esp
Break
due to BPMB #0177:0068FDD8 RW DR3
:bc
*
:/screendump
c:\dump\wsr_3.txt
:bl
:/screendump
c:\dump\wsr_4.txt
Invalid
command Wsrecord
저기서 jnz 다음의 명령에
브뽀를 걸어 반복루틴을 벗어납니다. 그리고 리턴후 도착해서 몇 번의 스텝인을 하다보면,
EAX=0101600A
EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000
EBP=0068FF78 ESP=0068FE38 EIP=0101601E o
d I s z a P c
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8
00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8
00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8
00400000 00444886 01015F51 00000000 ..@..HD.Q_......
0177:0068FE08
00000323 00B57E2A 01015FBD 010171BE #...*~..._...q..
0177:0068FE18
01015FBE 00000000 8193BC10 0068FF78 ._..........x.h.
0177:0068FE28
0068FE3C 00580000 8193BC70 0101600A <.h...X.p....`..
0177:0068FE38
00401000 BFF8B6E6 00000000 8193BC10 ..@.............
-------------------------------------------------------------------------PROT32-
016F:0101601E
EB01 JMP
01016021 (JUMP
)
016F:01016020
9A8D83D86F4883 CALL 8348:6FD8838D
016F:01016027
2EEB01 JMP
0101602B
016F:0101602A
0F81E888DA50 JNO 51DBE918
016F:01016030
CC INT
3
016F:01016031
58 POP
EAX
016F:01016032
6A60 PUSH
60
016F:01016034
6830694200 PUSH
00426930
016F:01016039
2EEB01 JMP
0101603D
016F:0101603C
9A2EEB02CD2057 CALL 5720:CD02EB2E
016F:01016043
EB08 JMP
0101604D
016F:01016045
C9 LEAVE
016F:01016046
1F POP
DS
016F:01016047
0D0BC91F0D OR EAX,0D1FC90B
016F:0101604C
0B6681 OR
ESP,[ESI-7F]
016F:0101604F
2D56600101 SUB EAX,01016056
016F:01016054
DF8B ESC
016F:01016056
CA8D9A RETF
9A8D
016F:01016059
6845600101 PUSH
01016045
016F:0101605E
5F POP
EDI
016F:0101605F
26EB01 JMP
01016063
016F:01016062
F083EC21 LOCK
SUB ESP,21
016F:01016066
EB02 JMP
0101606A
016F:01016068
CD20 INT
20 VXDCall 1D24,648D
016F:0101606E
F2EB01 REPNZ
JMP 01016072
016F:01016071
F289442400 REPNZ
MOV [ESP+00],EAX
016F:01016076
EB01 JMP
01016079
--------------------------------------------------------------------------------
:bpm
esp
Break
due to BPMB #0177:0068FDD8 RW DR3
:bc
*
:/screendump
c:\dump\wsr_3.txt
Break
due to BPX #016F:01015F57
:bc
*
:.
:/screendump
c:\dump\wsr_stolen.txt
Invalid
command Wsrecord
위처럼 stolen bytes를 발견하게
됩니다. 이 값들을 잘 적어둡시다. 사실 이러한 stolen bytes를 발견하는 것은 코드하나하나를
집중해서 바라보아야 합니다. 그리고 나서 OEP로 가는 도중엔 다음과 같은 루틴이
존재하게 됩니다.
EAX=00401000
EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000
EBP=0068FF78 ESP=0068FE34 EIP=01016191 o
d I s z a p c
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000 DS:01016049=0040BE15
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDD8
00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8
00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8
00400000 00444886 01015F51 00000000 ..@..HD.Q_......
0177:0068FE08
00000323 00B57E2A B62FE226 00580000 #...*~..&./...X.
0177:0068FE18
01016045 8193BC70 8193BC30 8193BC10 E`..p...0.......
0177:0068FE28
0040BE15 00401000 00000000 00426930 ..@...@.....0iB.
0177:0068FE38
00000060 BFF8B6E6 00000000 8193BC10 `...............
-------------------------------------------------------------------------PROT32-
016F:01016188
8F442700 POP
DWORD PTR [EDI+00]
016F:0101618C
58 POP
EAX
016F:0101618D
5F POP
EDI
016F:0101618E
EB01 JMP
01016191
016F:01016190
E8FF354960 CALL
614A9794
016F:01016191
FF3549600101 PUSH DWORD
PTR [01016049]
016F:01016197
685C384100 PUSH
0041385C
016F:0101619C
64A100000000 MOV EAX,FS:[00000000]
016F:010161A2
2EEB01 JMP
010161A6
016F:010161A5
9A8D6424EDF3EB CALL EBF3:ED24648D
016F:010161AC
02CD ADD
CL,CH
016F:010161AE
208D643C782B AND [EBP+2B783C64],CL
016F:010161B4
E783 OUT
83,EAX
016F:010161B6
EC IN
AL,DX
016F:010161B7
6966812DC16101 IMUL ESP,[ESI-7F],0161C12D
016F:010161BE
01C0 ADD
EAX,EAX
016F:010161C0
D1E6 SHL
ESI,1
016F:010161C2
BC01F05066 MOV ESP,6650F001
016F:010161C7
8135D061010179FEEB7BXOR DWORD PTR
[010161D0],7BEBFE79
016F:010161D1
3320 XOR
ESP,[EAX]
016F:010161D3
8F442400 POP
DWORD PTR [ESP+00]
016F:010161D7
8B442410 MOV
EAX,[ESP+10]
016F:010161DB
896C2410 MOV
[ESP+10],EBP
016F:010161DF
8D6C2410 LEA
EBP,[ESP+10]
016F:010161E3
2BE0 SUB
ESP,EAX
016F:010161E5
2EEB01 JMP
010161E9
016F:010161E8
9A8D6424EDF3EB CALL EBF3:ED24648D
--------------------------------------------------------------------------------
:.
:.
:.
:.
:.
:.
:.
:/screendump
c:\dump\wsr_oep_1.txt
Invalid
command Wsrecord
EAX=0040BE15
EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000
EBP=0068FE38 ESP=0068FDB8 EIP=010162AD o
d I S z a p C
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDB4
01000B37 00000000 00000000 8193BC10 7...............
0177:0068FDC4
00580000 0068FDD8 01000B4D 19331756 ..X...h.M...V.3.
0177:0068FDD4
073ED94C 00400000 D58A0195 0068FE1C L.>...@.......h.
0177:0068FDE4
00FF0000 00FD0000 01004138 01019A1C ........8A......
0177:0068FDF4
01015E18 00400000 00444886 01015F51 .^....@..HD.Q_..
0177:0068FE04
00000000 00000323 00B57E2A B62FE226 ....#...*~..&./.
0177:0068FE14
00580000 01016045 8193BC70 0068FDBC ..X.E`..p.....h.
-------------------------------------------------------------------------PROT32-
016F:0101628E
8D6424ED LEA
ESP,[ESP-13]
016F:01016292
F3EB02 REPZ
JMP 01016297
016F:01016295
CD20 INT
20 VXDCall 783C,648D
016F:0101629B
2BE7 SUB
ESP,EDI
016F:0101629D
83EC69 SUB
ESP,69
016F:010162A0
66812DA9620101C0D1 SUB WORD
PTR [010162A9],D1C0
016F:010162A9
26EB01 JMP
010162AD
016F:010162AC
F050 LOCK
PUSH EAX
016F:010162AD
50 PUSH
EAX
016F:010162AE
668135B862010179FE XOR WORD
PTR [010162B8],FE79
016F:010162B7
EB7B JMP
01016334
016F:010162B9
3320 XOR
ESP,[EAX]
016F:010162BB
8F442400 POP
DWORD PTR [ESP+00]
016F:010162BF
8B45FC MOV
EAX,[EBP-04]
016F:010162C2
C745FCFFFFFFFF MOV DWORD
PTR [EBP-04],FFFFFFFF
016F:010162C9
8945F8 MOV
[EBP-08],EAX
016F:010162CC
8D45F0 LEA
EAX,[EBP-10]
016F:010162CF
64A300000000 MOV FS:[00000000],EAX
016F:010162D5
64EB01 JMP
010162D9
016F:010162D8
69EB01696862 IMUL EBP,EBX,62686901
016F:010162DE
D84000 FADD
REAL4 PTR [EAX+00]
016F:010162E1
681C5F0101 PUSH
01015F1C
016F:010162E6
C3 RET
016F:010162E7
0000 ADD
[EAX],AL
016F:010162E9
0000 ADD
[EAX],AL
016F:010162EB
0000 ADD
[EAX],AL
016F:010162ED
0000 ADD
[EAX],AL
--------------------------------------------------------------------------------
:.
:d
eax
:.
:d
esp
:.
:.
:.
:/screendump
c:\dump\wsr_oep_2.txt
Invalid
command Wsrecord
EAX=0068FE28
EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000
EBP=0068FE38 ESP=0068FDB8 EIP=010162DC o
d I S z a p c
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDB4
0040BE15 0040BE15 00000000 8193BC10 ..@...@.........
0177:0068FDC4
00580000 0068FDD8 01000B4D 19331756 ..X...h.M...V.3.
0177:0068FDD4
073ED94C 00400000 D58A0195 0068FE1C L.>...@.......h.
0177:0068FDE4
00FF0000 00FD0000 01004138 01019A1C ........8A......
0177:0068FDF4
01015E18 00400000 00444886 01015F51 .^....@..HD.Q_..
0177:0068FE04
00000000 00000323 00B57E2A B62FE226 ....#...*~..&./.
0177:0068FE14
00580000 01016045 8193BC70 0068FDBC ..X.E`..p.....h.
-------------------------------------------------------------------------PROT32-
016F:010162A0
66812DA9620101C0D1 SUB WORD
PTR [010162A9],D1C0
016F:010162A9
26EB01 JMP
010162AD
016F:010162AC
F050 LOCK
PUSH EAX
016F:010162AE
668135B862010179FE XOR WORD
PTR [010162B8],FE79
016F:010162B7
EB02 JMP
010162BB
016F:010162B9
CD20 INT
20 VXDCall 0024,448F
016F:010162BF
8B45FC MOV
EAX,[EBP-04]
016F:010162C2
C745FCFFFFFFFF MOV DWORD
PTR [EBP-04],FFFFFFFF
016F:010162C9
8945F8 MOV
[EBP-08],EAX
016F:010162CC
8D45F0 LEA
EAX,[EBP-10]
016F:010162CF
64A300000000 MOV FS:[00000000],EAX
016F:010162D5
64EB01 JMP
010162D9
016F:010162D8
69EB01696862 IMUL EBP,EBX,62686901
016F:010162DC
6862D84000 PUSH
0040D862
016F:010162E1
681C5F0101 PUSH
01015F1C
016F:010162E6
C3 RET
016F:010162E7
0000 ADD
[EAX],AL
016F:010162E9
0000 ADD
[EAX],AL
016F:010162EB
0000 ADD
[EAX],AL
016F:010162ED
0000 ADD
[EAX],AL
016F:010162EF
0000 ADD
[EAX],AL
016F:010162F1
0000 ADD
[EAX],AL
016F:010162F3
0000 ADD
[EAX],AL
016F:010162F5
0000 ADD
[EAX],AL
016F:010162F7
0000 ADD
[EAX],AL
016F:010162F9
0000 ADD
[EAX],AL
016F:010162FB
0000 ADD
[EAX],AL
--------------------------------------------------------------------------------
:d
eax
:.
:d
esp
:.
:.
:.
:/screendump
c:\dump\wsr_oep_2.txt
:/screendump
c:\dump\wsr_oep_3.txt
Invalid
command Wsrecord
EAX=0068FE28
EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000
EBP=0068FE38 ESP=0068FDB8 EIP=0040D862 o
d I S z a p c
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDB8
0040BE15 00000000 8193BC10 00580000 ..@...........X.
0177:0068FDC8
0068FDD8 01000B4D 19331756 073ED94C ..h.M...V.3.L.>.
0177:0068FDD8
00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8
00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8
00400000 00444886 01015F51 00000000 ..@..HD.Q_......
0177:0068FE08
00000323 00B57E2A B62FE226 00580000 #...*~..&./...X.
0177:0068FE18
01016045 8193BC70 0068FDBC 0068FF68 E`..p.....h.h.h.
-------------------------------------------------------------------------PROT32-
016F:0040D85C
64A300000000 MOV FS:[00000000],EAX
016F:0040D862
C3 RET
016F:0040D863
8B4DF0 MOV
ECX,[EBP-10]
016F:0040D866
64890D00000000 MOV FS:[00000000],ECX
016F:0040D86D
59 POP
ECX
016F:0040D86E
5F POP
EDI
016F:0040D86F
5E POP
ESI
016F:0040D870
5B POP
EBX
016F:0040D871
C9 LEAVE
016F:0040D872
51 PUSH
ECX
016F:0040D873
C3 RET
016F:0040D874
8B4604 MOV
EAX,[ESI+04]
016F:0040D877
85C0 TEST
EAX,EAX
016F:0040D879
7444 JZ
0040D8BF
016F:0040D87B
8D5008 LEA
EDX,[EAX+08]
016F:0040D87E
803A00 CMP
BYTE PTR [EDX],00
016F:0040D881
743C JZ
0040D8BF
016F:0040D883
8B4F04 MOV
ECX,[EDI+04]
016F:0040D886
3BC1 CMP
EAX,ECX
016F:0040D888
7410 JZ
0040D89A
016F:0040D88A
83C108 ADD
ECX,08
016F:0040D88D
51 PUSH
ECX
016F:0040D88E
52 PUSH
EDX
016F:0040D88F
E8BC0D0000 CALL
0040E650
016F:0040D894
85C0 TEST
EAX,EAX
016F:0040D896
59 POP
ECX
016F:0040D897
59 POP
ECX
------------------------------------WSRECORDER!+C85C----------------------------
:.
:/screendump
c:\dump\wsr_oep_2.txt
:/screendump
c:\dump\wsr_oep_3.txt
:d
esp
:.
:d
esp
:d
esp
:/screendump
c:\dump\wsr_oep_4.txt
Invalid
command Wsrecord
EAX=0068FE28
EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=8193BC10
EDI=00000000
EBP=0068FE38 ESP=0068FDBC EIP=0040BE15 o
d I S z a p c
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000
--------------------------------------------------dword-------------PROT---(0)--
0177:0068FDB8
0040BE15 00000000 8193BC10 00580000 ..@...........X.
0177:0068FDC8
0068FDD8 01000B4D 19331756 073ED94C ..h.M...V.3.L.>.
0177:0068FDD8
00400000 D58A0195 0068FE1C 00FF0000 ..@.......h.....
0177:0068FDE8
00FD0000 01004138 01019A1C 01015E18 ....8A.......^..
0177:0068FDF8
00400000 00444886 01015F51 00000000 ..@..HD.Q_......
0177:0068FE08
00000323 00B57E2A B62FE226 00580000 #...*~..&./...X.
0177:0068FE18
01016045 8193BC70 0068FDBC 0068FF68 E`..p.....h.h.h.
-------------------------------------------------------------------------PROT32-
016F:0040BDFC
68FF000000 PUSH
000000FF
016F:0040BE01
E866FCFFFF CALL
0040BA6C
016F:0040BE06
59 POP
ECX
016F:0040BE07
59 POP
ECX
016F:0040BE08
C3 RET
016F:0040BE09
0000 ADD
[EAX],AL
016F:0040BE0B
0000 ADD
[EAX],AL
016F:0040BE0D
0000 ADD
[EAX],AL
016F:0040BE0F
00E8 ADD
AL,CH
016F:0040BE11
131A ADC
EBX,[EDX]
016F:0040BE13
0000 ADD
[EAX],AL
016F:0040BE15
BF94000000 MOV EDI,00000094
016F:0040BE1A
8BC7 MOV
EAX,EDI
016F:0040BE1C
E8CFF7FFFF CALL
0040B5F0
016F:0040BE21
8965E8 MOV
[EBP-18],ESP
016F:0040BE24
8BF4 MOV
ESI,ESP
016F:0040BE26
893E MOV
[ESI],EDI
016F:0040BE28
56 PUSH
ESI
016F:0040BE29
FF159C224200 CALL [0042229C]
016F:0040BE2F
8B4E10 MOV
ECX,[ESI+10]
016F:0040BE32
890DECFA4200 MOV [0042FAEC],ECX
016F:0040BE38
8B4604 MOV
EAX,[ESI+04]
016F:0040BE3B
A3F8FA4200 MOV [0042FAF8],EAX
016F:0040BE40
8B5608 MOV
EDX,[ESI+08]
016F:0040BE43
8915FCFA4200 MOV [0042FAFC],EDX
016F:0040BE49
8B760C MOV
ESI,[ESI+0C]
016F:0040BE4C
81E6FF7F0000 AND ESI,00007FFF
------------------------------------WSRECORDER!+ADFC----------------------------
:/screendump
c:\dump\wsr_oep_2.txt
:/screendump
c:\dump\wsr_oep_3.txt
:d
esp
:.
:d
esp
:d
esp
:/screendump
c:\dump\wsr_oep_4.txt
:/screendump
c:\dump\wsr_oep_5.txt
Invalid
command Wsrecord
바로
위의 부분이 대망의 OEP입니다. 하지만 이곳은 소위 말하는 fake OEP입니다. 따라서
덤프를 하기전에 우리가 실제 OEP로 eip를 옮깁시다.
r
eip eip-7
왜
eip-7 인지는 stolen bytes의 수를 세어보면 알 수 있습니다. 따라서 실제 OEP는
40BE15 - 7 = 40BE0E 가 되겠습니다. 덤프를 하실까요!
/dump
400000 58000 c:\dump\wsr_dump.exe
로
하시면 되겠습니다. 그리고 당근 PE editor를 열어 OEP와 색션을 수정해주셔야겠죠.
그리고 중요한 것은 덤프한 파일엔 stolen bytes가 없으므로 직접 심어줘야 한다는
것입니다. 전 Hiew를 사용해서 수정했습니다.

2.
이제 IAT를 복구해봅시다. Import Reconstruct를 가동하시고 OEP를 BE0E에 넣고 IAT
search를 하신후, show invalid를 눌러 trace level1, trace asprotect 1.22를 해줍시다.
그러면 아마도 하나의 미해결 임포를 제외하고 다 풀릴 겁니다. 이제 미해결 임포트가
뭔지 봐야겠죠.
faults
on 에 명령을 주시고 실행하면 아마 오류가 날겁니다. 그러면 R 키를 누른후, u
*esp해서
봅시다. 어디서 오류가 나나요? 아마도 OEP 밑부분의 명령어 중
016F:0040BE29
FF159C224200 CALL [0042229C]
여기에서
에러가 뜰겁니다. 그러면 프로그램을 다시 실행시켜서 저기에 무엇이 있나보죠. [0042229C]
= 01010CB0
입니다. 이곳으로 가보시면 아래처럼 나올 겁니다.
EAX=0040BE21
EBX=00580000 ECX=8193BC30 EDX=8193BC70 ESI=0068FD28
EDI=00000094
EBP=0068FD1C ESP=0068FD08 EIP=01010CB8 o
d I s z a p c
CS=016F
DS=0177 SS=0177 ES=0177 FS=34CF
GS=0000
-----KERNEL32!GetVersionExA+0008------------------dword-------------PROT---(0)--
0177:BFF917B2
8B08758B 009C3D06 0E740000 0000943D .u...=....t.=...
0177:BFF917C2
33077400 00F6E9C0 04BF0000 8D000000 .t.3............
0177:BFF917D2
8950F845 46C7047E 00000A08 0C46C700 E.P.~..F......F.
0177:BFF917E2
040A08AE 011046C7 68000000 BFF79450 .....F.....hP...
0177:BFF917F2
00000268 00116880 D3E80001 85FFFDFB h....h..........
0177:BFF91802
816675C0 00009C3E 8D287500 7D89FC45 .uf.>....u(.E..}
0177:BFF91812
F47D8DF4 FF335057 98685757 FFBFF794 ..}.WP3.WWh.....
-------------------------------------------------------------------------PROT32-
016F:01010CB0
55 PUSH
EBP
016F:01010CB1
8BEC MOV
EBP,ESP
016F:01010CB3
83EC0C SUB
ESP,0C
016F:01010CB6
56 PUSH
ESI
016F:01010CB7
57 PUSH
EDI
016F:01010CB8
E9F50AF8BE JMP BFF917B2
(JUMP
)
016F:01010CBD
0000 ADD
[EAX],AL
016F:01010CBF
000E ADD
[ESI],CL
016F:01010CC1
0000 ADD
[EAX],AL
016F:01010CC3
00E9 ADD
CL,CH
016F:01010CC5
C4E4 LES
ESP,ESP
016F:01010CC7
F8 CLC
016F:01010CC8
BE3700000E MOV ESI,0E000037
016F:01010CCD
0000 ADD
[EAX],AL
016F:01010CCF
0055E9 ADD
[EBP-17],DL
016F:01010CD2
56 PUSH
ESI
016F:01010CD3
15F7BE0000 ADC EAX,0000BEF7
016F:01010CD8
0E PUSH
CS
016F:01010CD9
0000 ADD
[EAX],AL
016F:01010CDB
00E9 ADD
CL,CH
016F:01010CDD
18D6 SBB
DH,DL
016F:01010CDF
F7BE3700000E IDIV DWORD
PTR [ESI+0E000037]
016F:01010CE5
0000 ADD
[EAX],AL
016F:01010CE7
006808 ADD
[EAX+08],CH
016F:01010CEA
44 INC
ESP
016F:01010CEB
F7BFC300000E IDIV DWORD
PTR [EDI+0E0000C3]
016F:01010CF1
0000 ADD
[EAX],AL
--------------------------------------------------------------------------------
:.
:d
esp
:d
esp
:/screendump
c:\dump\wsr_oep_4.txt
:/screendump
c:\dump\wsr_oep_5.txt
:/screendump
c:\dump\wsr_api_1.txt
:d
bff917b2
:/screendump
c:\dump\wsr_api_1.txt
Invalid
command Wsrecord
위에서
볼 수 있듯이 BFF917B2
로 점프하는 것을 알 수 있습니다. BFFxxxxx 은 DLL의 영역입니다. 과연 이 주소가
어디에 속하는지 데이터창으로 봅시다. 그랬더니 데이터 창에 GetVersionExA+008
이라고 나옴을 볼 수 있습니다. 위의 녹색부분에 해당하는 코드 수는 정확히 8바이트입니다.
즉 asprotect가 GetVersionExA의 8바이트를 미리 실행하고 해당 함수로 점프를 하는군요.
즉 마치 OEP의 stolen bytes같은 것이지요. 머 어차피 자동으로 복구할 것이므로
상관없습니다. 다시 Import Recontruct를 띄우시고, 해당 미해결 임포트를 더블클릭
후 해당함수를 클릭해 줍시다. 이제 더 이상의 미해결 임포트는 없습니다. 기쁜 마음으로
실행해 보세요. 잘 되죠~~~~
p.s
: 임포트 복구는 별다른 문제가 없었기에, 또한 제가 복구하면서 IAT tree를 저장하지
않았기에, 귀찮니즘으로 인해 첨부하지 않습니다. 혹시라도 임포트 복구가 안되는
분 계시면 올려드리도록 하겠습니다.
p.s
:
이 자리를 빌어 copywrite
님에게 깊은 감사를 드립니다. 사실 저도 이번에 asprotect의 코드를 일일이 스텝인하면서
혈압이 급상승함을 느낀 적이 한두 번이 아니었습니다. 그 수많은 SEH 트릭에 좌절하며,
소아로 풀어낸다는 것이 불가능할 것으로만 여겼습니다. 하지만 copywrite님의 도움을
받아 이렇게 손쉽게 해내는군요. 예전에 copywrite님이 asprotect에 심취하셔서 같이
루틴을 파해해보자고 했을 때 그러지 못한 것이 못내 아쉽고 미안할 따름입니다.
아무튼 아직까지 소아로 풀어낸 public tutorial은 보지 못했기에 더욱 뜻 깊은 것
같습니다. 다시 한번 감사의 뜻을 전하며...
p.s
: 혹시 위의 과정들에 대한 의미를 파악하실 분은 제 홈페이지의 게시판을 참조하시기
바랍니다. 또한 이것 이외의 정보를 얻고 싶으신 분들은 개인적으로 메일을 주십시요.
결국은 그 자료들이란게 직접 해보지 않는 이상 도움이 전혀 안될 자료들이지만,
분명 길잡이가 되어줄 수 있으리라 생각합니다.