<span class="pediy"><span class="pediy">
[part 6 ](区段处理)
; =========================================================================================
; 返回到 Ch e c k s u m - C h e c k i n g 之后的位置
; 有个稍微快一点的方法解决注册
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
003B073A E8 4A2A0000 call 003B3189 ; nop掉然后置eax =1即可
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
003B076C 66:3D 0100 cmp ax, 1
003B0775 /0F84 E9000000 je 003B0864 ; j,否则Over
003B087B 8D85 D85C4000 lea eax, dword ptr ss:[ebp+405CD8]
003B08F8 BE E4D34100 mov esi, 41D3E4
003B0902 03F5 add esi, ebp ; esi -> 块表
; esi:
;-----------------------
003B7B17 00001000 ; VOffset
003B7B1B 00006000 ; RSize
003B7B1F 0000F342 ; VSize
003B7B23 E0000021 ; Flags
003B7B27 00017000 ; 一样....
003B7B2B 00001000
003B7B2F 00000FB8
003B7B33 C0000041
;-----------------------
003B090E 833E 00 cmp dword ptr ds:[esi], 0 ; 区块解码结束了?
003B0916 /0F84 7E060000 je 003B0F9A ; 结束就走人
003B0921 8B9D DCD34100 mov ebx, dword ptr ss:[ebp+41D3DC] ; ImageBase
003B092C 031E add ebx, dword ptr ds:[esi] ; ebx -> 指向一个Section
003B0945 8B4E 04 mov ecx, dword ptr ds:[esi+4] ; ecx -> Size
003B0952 83F9 00 cmp ecx, 0
003B0955 /75 4E jnz short 003B09A5 ; 长度非零,处理--->
((((((((((((((((((((((((((((((((((((((((((((((((((((
; 跳过处理大小为零的Section
003B096E 83C6 10 add esi, 10
003B0976 ^\EB 91 jmp short 003B0909
))))))))))))))))))))))))))))))))))))))))))))))))))))
003B09EE D1E9 shr ecx, 1 ; ecx /2
003B09F5 66:8B85 2DD6410>mov ax, word ptr ss:[ebp+41D62D]
003B0A01 66:35 2111 xor ax, 1121
003B0A37 66:C1C8 02 ror ax, 2
003B0A40 66:05 1A00 add ax, 1A
003B0A49 66:05 A100 add ax, 0A1
; 计算key
003B0A84 66:3103 xor word ptr ds:[ebx], ax
003B0A8C 66:48 dec ax
003B0A93 43 inc ebx ; 指向下一byte
003B0A99 43 inc ebx ; 移动指针
003B0AC7 49 dec ecx
003B0ACD 83F9 00 cmp ecx, 0
003B0AD0 ^\75 AD jnz short 003B0A7F
; 循环解码
003B0B09 8B46 0C mov eax, dword ptr ds:[esi+C] ; flag
003B0B11 83E0 01 and eax, 1 ; 隐藏着什么标记呢?
003B0B30 83BD F81D4200 0>cmp dword ptr ss:[ebp+421DF8], 1
003B0B37 /0F85 60030000 jnz 003B0E9D ; 不知道,nj
003B0B6A 83F8 01 cmp eax, 1
003B0B6D 0F85 25030000 jnz 003B0E98; 还是不知道,nj,$$#@%@#$
003B0C18 60 pushad
003B0C23 8B46 04 mov eax, dword ptr ds:[esi+4]; RSize
003B0C2B 83F8 00 cmp eax, 0
003B0C33 /0F84 03020000 je 003B0E3C ; RSize==0就不分配空间了
003B0C43 8B46 08 mov eax, dword ptr ds:[esi+8] ;VSize
003B0C73 6A 04 push 4
003B0C75 68 00100000 push 1000
003B0C7A 50 push eax
003B0C7B 6A 00 push 0
003B0C7D FF95 13CF4100 call dword ptr ss:[ebp+41CF13] ; 分配空间存放Section
0012FF74 003B0C83 /CALL to VirtualAlloc from 003B0C7D
0012FF78 00000000 |Address = NULL
0012FF7C 0000F342 |Size = F342 (62274.)
0012FF80 00001000 |AllocationType = MEM_COMMIT
0012FF84 00000004 \Protect = PAGE_READWRITE
003B0CC7 8985 E0D34100 mov dword ptr ss:[ebp+41D3E0], eax ; 得到的空间
003B0CFF 56 push esi ; 保存 Section Table Pointer
003B0D32 8B1E mov ebx, dword ptr ds:[esi] ; ebx -> VOffset
003B0D39 039D DCD34100 add ebx, dword ptr ss:[ebp+41D3DC] ; +ImageBase, 得到VA
003B0D44 50 push eax
003B0D45 53 push ebx
003B0D46 E8 AE620000 call 003B6FF9 ; aplib_depack_asm.解压缩到刚才VirtualAlloc得到的空间
003B0D50 83C4 08 add esp, 8 ; 平衡堆栈,大概用的不是stdcall
003B0D5D 8BC8 mov ecx, eax ; 解压出来的长度
003B0D64 8B3E mov edi, dword ptr ds:[esi] ; edi -> VOffset
003B0D93 03BD DCD34100 add edi, dword ptr ss:[ebp+41D3DC] ; +ImageBase, Get VA
; 要把解压得代码传送回去了
003B0DC6 8BB5 E0D34100 mov esi, dword ptr ss:[ebp+41D3E0]; 解压缩后的数据
003B0DE3 F3:A4 rep movs byte ptr es:[edi], byte ptr ds:[esi] ; copy all
003B0DEF 5E pop esi ; 恢复 Section Table Pointer
; 这里有点无聊。根本没有修改esi也没用用它,最后都popad
003B0E0C 8B85 E0D34100 mov eax, dword ptr ss:[ebp+41D3E0] ; 申请到的地址
003B0E29 68 00800000 push 8000
003B0E2E 6A 00 push 0
003B0E30 50 push eax
003B0E31 FF95 17CF4100 call dword ptr ss:[ebp+41CF17] ; kernel32.VirtualFree
; 满门抄斩……55555555
003B0E53 61 popad
; -------- 修正页面访问权限 ----------
003B0EAC 60 pushad
003B0EB2 8B9D DCD34100 mov ebx, dword ptr ss:[ebp+41D3DC] ; ImageBase
003B0ECF 031E add ebx, dword ptr ds:[esi] ; 块表 VA
003B0EE8 8B4E 04 mov ecx, dword ptr ds:[esi+4] ; 长度
003B0EF5 B8 74894100 mov eax, 418974
003B0EFF 03C5 add eax, ebp ; buffer for VirtualProtect
003B0F2E 50 push eax
003B0F2F 6A 04 push 4
003B0F31 51 push ecx
003B0F32 53 push ebx
003B0F33 FF95 27CF4100 call dword ptr ss:[ebp+41CF27] ; kernel32.VirtualProtect
0012FF74 003B0F39 /CALL to VirtualProtect from 003B0F33
0012FF78 00401000 |Address = Try.00401000
0012FF7C 00006000 |Size = 6000 (24576.)
0012FF80 00000004 |NewProtect = PAGE_READWRITE
0012FF84 003B30A7 \pOldProtect = 003B30A7
003B0F3E 61 popad
; -------------- 移动指针,到下一个Section ------------------
003B0F83 83C6 10 add esi, 10
003B0F8B ^\E9 79F9FFFF jmp 003B0909 ; 循环直到所有Sections都还原
; ------------------------------------
; 循环完成到这里,这里其实可以Dump了:
003B0F9A 90 nop
003B0FAE 8D85 D95C4000 lea eax, dword ptr ss:[ebp+405CD9] ; 这东西很无聊,碰到好几次,猜不出来,大概是buffer
