<span class="pediy"><span class="pediy">
[part 8]
; --------------------------- 不明飞行物 -----------------------------------
003B0FD3 8D85 DA5C4000 lea eax, dword ptr ss:[ebp+405CDA]
003B1011 E8 96200000 call 003B30AC ; 没看懂
; ***************************************************************************
; 处 理 调 用 表 & 跳 转 表 ( 还 原 指 针 )
; ***************************************************************************
003B105F 8D85 DB5C4000 lea eax, dword ptr ss:[ebp+405CDB]
; fly 写的文章里提到,但没有说为什么,这里详细说明一下
; ---------------call dword ptr ds:[xxxxxxxx],其中xxxxxxxx是80xxxxxxxx----------------
003B108C 60 pushad
003B10A4 8B9D 08D64100 mov ebx, dword ptr ss:[ebp+41D608]
003B10AF 039D DCD34100 add ebx, dword ptr ss:[ebp+41D3DC] ; 还是Imagebase
003B110F BE E4D34100 mov esi, 41D3E4 ; 块表
003B1119 03F5 add esi, ebp
003B1120 8B9D DCD34100 mov ebx, dword ptr ss:[ebp+41D3DC] ; Try.00400000
003B112B 031E add ebx, dword ptr ds:[esi]
; ebx -> a section,应该是代码段
003B1132 8BFB mov edi, ebx ; Try.00401000
003B1139 8B4E 08 mov ecx, dword ptr ds:[esi+8] ; VSize
003B1141 83F9 00 cmp ecx, 0
003B115B /0F84 93050000 je 003B16F4 ; 0?不玩了
003B1178 D1E9 shr ecx, 1 ; ecx/2
003B11A7 49 dec ecx
003B11AD 66:B8 FF15 mov ax, 15FF ; call dword ptr ds:[xxxxxxxx]
003B11CD BE 31354200 mov esi, 423531
003B11FF 03F5 add esi, ebp
003B124A F2:66:AF repne scas word ptr es:[edi] ; 寻找call dword ptr ds:[xxxxxxxx]
; forgot:如果没有就……不好玩了,看Ding Boy怎么收场
; edi -> xxxxxxxx,而不是call dword ptr
003B1264 8B1F mov ebx, dword ptr ds:[edi]; 要call的地址->Ebx
003B127D 81E3 00000080 and ebx, 80000000 ; 取高位
003B129A 81FB 00000080 cmp ebx, 80000000 ; 是80xxxxxxx的形势?
003B12A0 /0F85 13010000 jnz 003B13B9 ; 不是算了
003B12AB 8B1F mov ebx, dword ptr ds:[edi]; 加密过的指针
003B12B2 81E3 FFFFFF7F and ebx, 7FFFFFFF ; 去掉31st bit,还原指针
003B12BD 3B9D 33D64100 cmp ebx, dword ptr ss:[ebp+41D633]
003B12C3 0F82 C3000000 jb 003B138C ; 判断地址范围
003B12CE 3B9D 2FD64100 cmp ebx, dword ptr ss:[ebp+41D62F] ; Try.0041F01B
003B12D4 /0F87 AD000000 ja 003B1387
003B12DF 833E FF cmp dword ptr ds:[esi], -1 ; ???
003B130F /0F84 DF030000 je 003B16F4
003B131A 8B1B mov ebx, dword ptr ds:[ebx] ; 把指针指向的内容读出来
003B1321 891E mov dword ptr ds:[esi], ebx
; 写到esi
003B1350 8937 mov dword ptr ds:[edi], esi ; 地址重定位,nop掉,下同
003B1357 83C6 04 add esi, 4 ; 移动指针
003B13BE 83F9 00 cmp ecx, 0
003B13C1 ^ 0F85 56FEFFFF jnz 003B121D ; 循环直到所有都搞定
; ----------------------- jmp dword ptr ds:[xxxxxxxx]----------------------------------
; 方法如出一辙,不多解释
003B140B 56 push esi;剩下的buffer
003B1416 8B9D 08D64100 mov ebx, dword ptr ss:[ebp+41D608]
003B1449 039D DCD34100 add ebx, dword ptr ss:[ebp+41D3DC] ; Try.00400000
003B1459 BE E4D34100 mov esi, 41D3E4
003B148B 03F5 add esi, ebp
003B1492 8B9D DCD34100 mov ebx, dword ptr ss:[ebp+41D3DC] ; Try.00400000
003B149D 031E add ebx, dword ptr ds:[esi]
003B14A4 8BFB mov edi, ebx ; Try.00401000
003B14AB 8B4E 08 mov ecx, dword ptr ds:[esi+8]
003B14C5 D1E9 shr ecx, 1
003B14DE 49 dec ecx
003B150C 66:B8 FF25 mov ax, 25FF ; jmp dword ptr ds:[xxxxxxxx]
003B151A 5E pop esi
003B152A F2:66:AF repne scas word ptr es:[edi]
003B1532 8B1F mov ebx, dword ptr ds:[edi]
003B1539 81E3 00000080 and ebx, 80000000
003B1556 81FB 00000080 cmp ebx, 80000000
003B155C /0F85 5B010000 jnz 003B16BD
003B158F 8B1F mov ebx, dword ptr ds:[edi]
003B15BE 81E3 FFFFFF7F and ebx, 7FFFFFFF
003B15F1 3B9D 33D64100 cmp ebx, dword ptr ss:[ebp+41D633] ; Try.00411000
003B15F7 /0F82 A9000000 jb 003B16A6
003B1614 3B9D 2FD64100 cmp ebx, dword ptr ss:[ebp+41D62F] ; Try.0041F01B
003B161A /77 5D ja short 003B1679
003B1621 833E FF cmp dword ptr ds:[esi], -1
003B1629 /0F84 C5000000 je 003B16F4
003B1634 8B1B mov ebx, dword ptr ds:[ebx]
003B163B 891E mov dword ptr ds:[esi], ebx
003B166A 8937 mov dword ptr ds:[edi], esi
003B166A 8937 mov dword ptr ds:[edi], esi
003B16D4 83F9 00 cmp ecx, 0
003B16D7 ^ 0F85 48FEFFFF jnz 003B1525 ; 循环处理所有
003B170B 61 popad ; 文革结束啦
