查看單個文章
舊 2005-12-18, 07:49 PM   #9 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

006AF090 0BDB or ebx,ebx
006AF092 /74 0A je short DrvStudy.006AF09E ; ebx==0,跳
006AF094 |8B03 mov eax,dword ptr ds:[ebx]
006AF096 |8785 35050000 xchg dword ptr ss:[ebp+535],eax
006AF09C |8903 mov dword ptr ds:[ebx],eax
006AF09E \8DB5 69050000 lea esi,dword ptr ss:[ebp+569] ; 跳到這裡, esi指向一標誌
006AF0A4 833E 00 cmp dword ptr ds:[esi],0
006AF0A7 /0F84 21010000 je DrvStudy.006AF1CE ; 不為0, 不跳
006AF0AD 6A 04 push 4
006AF0AF 68 00100000 push 1000
006AF0B4 68 00180000 push 1800
006AF0B9 6A 00 push 0
006AF0BB FF95 4D050000 call dword ptr ss:[ebp+54D] ; 分配記憶體
C語言描述為
VirtualAlloc(NULL, 0x1800, MEM_COMMIT, PAGE_READWRITE);
006AF0C7 8B46 04 mov eax,dword ptr ds:[esi+4]
006AF0CA 05 0E010000 add eax,10E
006AF0CF 6A 04 push 4
006AF0D1 68 00100000 push 1000
006AF0D6 50 push eax
006AF0D7 6A 00 push 0
006AF0D9 FF95 4D050000 call dword ptr ss:[ebp+54D] ; 再次分配記憶體, eax為所需記憶體大小
006AF0DF 8985 52010000 mov dword ptr ss:[ebp+152],eax ; 分配的第2塊記憶體鋸柄存入ebp+152處
006AF0E5 56 push esi
006AF0E6 8B1E mov ebx,dword ptr ds:[esi]
006AF0E8 039D 22040000 add ebx,dword ptr ss:[ebp+422]
006AF0EE FFB5 56010000 push dword ptr ss:[ebp+156] ; 0x401000
006AF0F4 FF76 04 push dword ptr ds:[esi+4]
006AF0F7 50 push eax
006AF0F8 53 push ebx
006AF0F9 E8 6E050000 call DrvStudy.006AF66C ; 解壓程式碼
006AF0FE B3 01 mov bl,1
006AF100 80FB 00 cmp bl,0
006AF103 75 5E jnz short DrvStudy.006AF163
006AF105 FE85 EC000000 inc byte ptr ss:[ebp+EC]
006AF10B 8B3E mov edi,dword ptr ds:[esi]
006AF10D 03BD 22040000 add edi,dword ptr ss:[ebp+422]
006AF113 FF37 push dword ptr ds:[edi] ; 保護0x401000處的程式碼
006AF115 C607 C3 mov byte ptr ds:[edi],0C3 ; 把0x401000處的程式碼改為RET
006AF118 FFD7 call edi ; LJ使用
006AF11A 8F07 pop dword ptr ds:[edi] ; 恢復0x401000處的程式碼
F8單步到下面一點點, 來到
006AF12D 0BC9 or ecx,ecx
006AF12F 74 2E je short DrvStudy.006AF15F
006AF131 78 2C js short DrvStudy.006AF15F
006AF133 AC lods byte ptr ds:[esi]
006AF134 3C E8 cmp al,0E8
006AF136 74 0A je short DrvStudy.006AF142
006AF138 EB 00 jmp short DrvStudy.006AF13A
006AF13A 3C E9 cmp al,0E9
006AF13C 74 04 je short DrvStudy.006AF142
006AF13E 43 inc ebx
006AF13F 49 dec ecx
006AF140 ^ EB EB jmp short DrvStudy.006AF12D
006AF142 8B06 mov eax,dword ptr ds:[esi] ; 在這裡設定一個斷點
這裡找opcode為e8或e9的地方, F9執行後斷下, ebx=1FE, eax=[esi]的內容, 緊接著會比較esi指向的地方
006AF144 /EB 00 jmp short DrvStudy.006AF146
006AF146 \803E 36 cmp byte ptr ds:[esi],36 ; 比較第2個字元的opcode是否為36
006AF149 ^ 75 F3 jnz short DrvStudy.006AF13E ; 是就不跳, 這裡為36不會跳
006AF14B 24 00 and al,0
006AF14D C1C0 18 rol eax,18 ; 解碼
006AF150 2BC3 sub eax,ebx ; 解碼
006AF152 8906 mov dword ptr ds:[esi],eax ; 解碼後的程式碼存入esi指向的地方
006AF154 83C3 05 add ebx,5
006AF157 83C6 04 add esi,4
006AF15A 83E9 05 sub ecx,5
006AF15D ^ EB CE jmp short DrvStudy.006AF12D ; 向上跳
可以判斷出上面的這段程式碼是解碼的, C30000處的程式碼會解碼, 在006AF15D的下一個指令設好斷點, F9執行, 斷下
006AF15F 5B pop ebx ; 斷下, 解碼完畢
006AF160 5E pop esi
006AF161 59 pop ecx
006AF162 58 pop eax
006AF163 EB 08 jmp short DrvStudy.006AF16D ; 跳
006AF16D 8BC8 mov ecx,eax ; 來到這裡
006AF16F 8B3E mov edi,dword ptr ds:[esi] ; 程式碼段偏移
006AF171 03BD 22040000 add edi,dword ptr ss:[ebp+422] ; 基位址+偏移, 指向程式碼段
006AF177 8BB5 52010000 mov esi,dword ptr ss:[ebp+152] ; 解碼後的正確程式碼位址
006AF17D C1F9 02 sar ecx,2
006AF180 F3:A5 rep movs dword ptr es:[edi],dword >; 填充正確的程式碼
006AF182 8BC8 mov ecx,eax
006AF184 83E1 03 and ecx,3
006AF187 F3:A4 rep movs byte ptr es:[edi],byte pt>; 填充正確的程式碼
006AF189 5E pop esi
006AF18A 68 00800000 push 8000
006AF18F 6A 00 push 0
006AF191 FFB5 52010000 push dword ptr ss:[ebp+152]
006AF197 FF95 51050000 call dword ptr ss:[ebp+551] ; VirtualFree
006AF19D 83C6 08 add esi,8
006AF1A0 833E 00 cmp dword ptr ds:[esi],0 ; 解碼完成?沒完成就跳
006AF1A3 ^ 0F85 1EFFFFFF jnz DrvStudy.006AF0C7 ; 又跳到上面
因此可以確定這一大段006AF0C7 - 006AF1A3都是解碼的程式碼, 在006AF1A3處的下1條指令設定一個斷點, F9執行, 斷下
006AF1A9 68 00800000 push 8000 ; 斷下
006AF1AE 6A 00 push 0
006AF1B0 FFB5 56010000 push dword ptr ss:[ebp+156]
006AF1B6 FF95 51050000 call dword ptr ss:[ebp+551] ; VirtualFree
解壓縮記憶體了
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1630 篇, 收花: 3204 次