好友
阅读权限10
听众
最后登录1970-1-1
|
Armadillo V4.62 Public Build 的 IAT 加密及 Magic Jmp 分析[动画]
【文章标题】: Armadillo V4.62 Public Build 的 IAT 加密及 Magic Jmp 分析
【文章作者】: RegKiller
【作者邮箱】: 保密一下
【作者主页】: http://bbs.86sw.com
【作者QQ号】: 看雪不让说
【软件名称】: Win98 记事本
【软件大小】: 576 KB
【加壳方式】: Armadillo V4.62 Public Build 单进程标准
【保护方式】: 加密壳保护
【使用工具】: 最新版本的->电脑 + 大脑 + 双手
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
前段时间电脑挂了,刚修好,好久没上线了,今天一上来看到好多软件都更新为新版本了,顺手下载了一个 FLY 破解的 Armadillo V4.62 Public Build 然后用单进程标准方式加壳了一个 Win98 记事本看看新版本有没有变化,这一测试可好,果然有变化,以前直接 BP GetModuleHandleA 找 Magic Jmp 的方法竟然不灵了,测试了一下用 dilloDIE 1.6 脱壳机脱出来后竟然无法运行,所以出此下文,水平有限,错误之处敬请网友指教
【详细过程】
手脱 Armadillo V4.62 Public Build 单进程标准方式加壳的 Win98 记事本
本文是写给向我一样的菜鸟的,目的是希望菜鸟也能基本看的明白,所以写的过于罗嗦,望高手谅解。
本文重点:介绍加密壳避开 IAT 加密的方法
主要目的:希望新手通过此文可以学习到如何处理加密壳加密 IAT 的方法
我们分三个部分搞定
第一步:获取 OEP 和 IAT 的地址和 Size
第二步:避开 IAT 加密及寻找 Magic Jmp
第三步:脱壳后的程序优化
OK 开始步入主题
第一步:获取 OEP 和 IAT 的地址和 Size
00448173 >/$ 55 push ebp ; OD加载后停在此处
00448174 |. 8BEC mov ebp,esp
00448176 |. 6A FF push -1
00448178 |. 68 682F4700 push PackEd.00472F68
0044817D |. 68 B07E4400 push PackEd.00447EB0 ; SE 处理程序安装
Alt+M 打开内存映射窗口 在.text段下F2断点然后 Shift+F9 运行 中断在 00C202DB 处
00C202DB 8B12 mov edx,dword ptr ds:[edx] ; 中断在这里F8向下走
00C202DD 8955 DC mov dword ptr ss:[ebp-24],edx
00C202E0 834D FC FF or dword ptr ss:[ebp-4],FFFFFFFF
00C202E4 EB 11 jmp short 00C202F7
00C202E6 6A 01 push 1
00C202E8 58 pop eax
00C202E9 C3 retn
00C202EA 8B65 E8 mov esp,dword ptr ss:[ebp-18]
00C202ED 834D FC FF or dword ptr ss:[ebp-4],FFFFFFFF
00C202F1 8B7D 08 mov edi,dword ptr ss:[ebp+8]
00C202F4 8B55 DC mov edx,dword ptr ss:[ebp-24]
00C202F7 A1 D415C300 mov eax,dword ptr ds:[C315D4]
00C202FC 3150 24 xor dword ptr ds:[eax+24],edx
00C202FF A1 D415C300 mov eax,dword ptr ds:[C315D4]
00C20304 3150 24 xor dword ptr ds:[eax+24],edx
00C20307 A1 D415C300 mov eax,dword ptr ds:[C315D4]
00C2030C 8B48 38 mov ecx,dword ptr ds:[eax+38]
00C2030F 3348 30 xor ecx,dword ptr ds:[eax+30]
00C20312 3308 xor ecx,dword ptr ds:[eax]
00C20314 030D EC15C300 add ecx,dword ptr ds:[C315EC] ; PackEd.00400000
00C2031A 8B17 mov edx,dword ptr ds:[edi]
00C2031C 85D2 test edx,edx
00C2031E 75 18 jnz short 00C20338
00C20320 FF77 18 push dword ptr ds:[edi+18]
00C20323 FF77 14 push dword ptr ds:[edi+14]
00C20326 FF77 10 push dword ptr ds:[edi+10]
00C20329 8B50 68 mov edx,dword ptr ds:[eax+68]
00C2032C 3350 40 xor edx,dword ptr ds:[eax+40]
00C2032F 3350 30 xor edx,dword ptr ds:[eax+30]
00C20332 2BCA sub ecx,edx
00C20334 FFD1 call ecx
00C20336 EB 1D jmp short 00C20355
00C20338 83FA 01 cmp edx,1
00C2033B 75 1B jnz short 00C20358
00C2033D FF77 04 push dword ptr ds:[edi+4]
00C20340 FF77 08 push dword ptr ds:[edi+8]
00C20343 6A 00 push 0
00C20345 FF77 0C push dword ptr ds:[edi+C]
00C20348 8B50 68 mov edx,dword ptr ds:[eax+68]
00C2034B 3350 40 xor edx,dword ptr ds:[eax+40]
00C2034E 3350 30 xor edx,dword ptr ds:[eax+30]
00C20351 2BCA sub ecx,edx
00C20353 FFD1 call ecx ; PackEd.004010CC 这个地址是什么?呵呵。
可以看到 00C20353 的 call ecx 后面的注释里已经出现记事本的 OEP 了 F7进入此 Call
004010CC 55 push ebp ; 记事本 OEP
004010CD 8BEC mov ebp,esp
004010CF 83EC 44 sub esp,44
004010D2 56 push esi
004010D3 FF15 E4634000 call dword ptr ds:[4063E4]
004010D9 8BF0 mov esi,eax
004010DB 8A00 mov al,byte ptr ds:[eax]
004010DD 3C 22 cmp al,22
004010DF 75 1B jnz short PackEd.004010FC
004010E1 56 push esi
004010E2 FF15 F4644000 call dword ptr ds:[4064F4] ; USER32.CharNextA
004010E8 8BF0 mov esi,eax
004010EA 8A00 mov al,byte ptr ds:[eax]
004010EC 84C0 test al,al
004010EE 74 04 je short PackEd.004010F4
004010F0 3C 22 cmp al,22
004010F2 ^ 75 ED jnz short PackEd.004010E1
004010F4 803E 22 cmp byte ptr ds:[esi],22
004010F7 75 15 jnz short PackEd.0040110E
004010F9 46 inc esi
004010FA EB 12 jmp short PackEd.0040110E
004010FC 3C 20 cmp al,20
004010FE 7E 0E jle short PackEd.0040110E
00401100 56 push esi
00401101 FF15 F4644000 call dword ptr ds:[4064F4] ; USER32.CharNextA
可以看出上面部分 IAT 已经被加密了。
查看方法是在 004010D3 处鼠标右键从弹出菜单中选 跟随到数据窗口->内存地址
在数据窗口中滚动鼠标上下察看下 IAT 可以看出 IAT 并不是连续的,中间部分断开了
不过这不妨碍我们获取 IAT 的起始地址和结束地址,滚动鼠标上下察看得出 IAT 地址和大小
IAT 起始地址:004062E4-00400000=62E4
IAT 结束地址:00406524-00400000=6524
IAT 大小=结束地址-起始地址=6524-62E4=240
减 00400000 是减去基址 00400000
整理一下
OEP:10CC
IAT Rva:62E4
IAT Size:240
第二步:避开 IAT 加密及寻找 Magic Jmp
我们继续看数据窗口,向下找可以找到这里
00406378 7C830927 kernel32.LocalReAlloc
0040637C 7C80998D kernel32.LocalAlloc
00406380 7C832E1D kernel32.LocalLock
00406384 00C0A7EF
00406388 7C80A7D4 kernel32.GetLocalTime
0040638C 7C83632D kernel32.GetTimeFormatA
我们看到 00406384 处的函数是空白,但她上下都是有内容的,说明这个函数已经被加密,这里说一下如何确定这个是被加密了呢?我们可以看一下下面的这个例子:
加壳前的样子
004063F8 >7D6470B0 SHELL32.DragFinish
004063FC >7D63245A SHELL32.ShellAboutA
00406400 >7D610EB0 SHELL32.ShellExecuteA
00406404 >7D5FAF9E SHELL32.DragAcceptFiles
00406408 >7D688BE2 SHELL32.SHGetSpecialFolderPathA
0040640C >7D6470C1 SHELL32.DragQueryFileA
00406410 00000000
00406414 >77D1A8AD USER32.wsprintfA
加壳后的样子
004063F8 7D6470B0 SHELL32.DragFinish
004063FC 7D63245A SHELL32.ShellAboutA
00406400 7D610EB0 SHELL32.ShellExecuteA
00406404 7D5FAF9E SHELL32.DragAcceptFiles
00406408 7D688BE2 SHELL32.SHGetSpecialFolderPathA
0040640C 7D6470C1 SHELL32.DragQueryFileA
00406410 00C07414
00406414 77D1A8AD USER32.wsprintfA
这里只有 00406410 行有变化,加壳前的 00406410 里面的数据是 00000000,而加壳后的是 00C07414 那么这个 00C07414 为什么不是被加密的函数呢?其实很简单,因为 00406410 上面的是 SHELL32 而她下面的是 USER32 说明这是2个不同的 Dll 文件里的函数,所以 00C07414 这个数据其实是无用数据,或者可以说是正常的分隔数据(个人理解)。
OK,明白了上面的东西后我们继续把目光锁定在 00406378
拖动鼠标选择 00406378 行到 004063A8 行
00406378 7C830927 kernel32.LocalReAlloc
0040637C 7C80998D kernel32.LocalAlloc
00406380 7C832E1D kernel32.LocalLock
00406384 00C0A7EF
00406388 7C80A7D4 kernel32.GetLocalTime
0040638C 7C83632D kernel32.GetTimeFormatA
00406390 7C8361EE kernel32.GetDateFormatA
00406394 7C80BAA1 kernel32.lstrcmpiA
00406398 7C801EEE kernel32.GetStartupInfoA
0040639C 00C0A7A4
004063A0 00C0819F
004063A4 7C80BDB6 kernel32.lstrlenA
004063A8 7C810111 kernel32.lstrcpynA
确定选择了上面内容之后从右键菜单中选择断点->硬件写入->字节(或者选字也可以),然后 Ctrl+F2 从新加载程序。
在命令行里下 d 406378 后回车,然后 Shift+F 运行程序中断在这里:
77C16FA3 F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi] ; 中断在这里
77C16FA5 FF2495 B870C177 jmp dword ptr ds:[edx*4+77C170B8]
77C16FAC 8BC7 mov eax,edi
77C16FAE BA 03000000 mov edx,3
77C16FB3 83E9 04 sub ecx,4
Alt+F9 返回
00C1BCC3 83C4 0C add esp,0C ; 返回到这里
00C1BCC6 8D85 C4D5FFFF lea eax,dword ptr ss:[ebp-2A3C]
00C1BCCC 50 push eax
00C1BCCD FFB5 C4D5FFFF push dword ptr ss:[ebp-2A3C]
00C1BCD3 FFB5 CCD5FFFF push dword ptr ss:[ebp-2A34]
返回后再 Shift+F9 中断在这里
00C1CF28 8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0] ; 中断在这里
00C1CF2E 83C0 04 add eax,4
00C1CF31 8985 10D9FFFF mov dword ptr ss:[ebp-26F0],eax
00C1CF37 ^ E9 4DFCFFFF jmp 00C1CB89
00C1CF3C FF15 8472C200 call dword ptr ds:[C27284] ; kernel32.GetTickCount
此时可以发现数据窗口中已经写入了一个函数了。
00406378 7C830927 kernel32.LocalReAlloc
0040637C BFF74934
00406380 BFFA0C8F
00406384 BFF74934
现在我们删除硬件断点后从 00C1CF28 处 F8 单步跟踪
发现程序一直在 00C1CB89 到 00C1CF37 中间打转,并且每循环一次就出现一个函数
通过单步跟踪发现 当 00C1CDD0 的 [ebp-3598] 等于 0 的时候 IAT 不加密,反之就加密 IAT
00C1CDD0 83BD 68CAFFFF 0>cmp dword ptr ss:[ebp-3598],0 ; [ebp-3598] 为 0 吗
00C1CDD7 75 42 jnz short 00C1CE1B ; 跳就加密 IAT(如果上面没修改这里nop掉可避开加密)
那么可以把 00C1CDD7 的 jnz short 00C1CE1B 这句 nop 掉就可以避开 IAT 加密了。
后来通过详细跟踪发现下面这段才是 Magic Jmp 的关键:
00C1CD26 8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8] ; 开始循环计算函数地址
00C1CD2C 83C0 0C add eax,0C
00C1CD2F 8985 58C2FFFF mov dword ptr ss:[ebp-3DA8],eax
00C1CD35 8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8]
00C1CD3B 8378 08 00 cmp dword ptr ds:[eax+8],0
00C1CD3F 74 49 je short 00C1CD8A
00C1CD41 68 00010000 push 100
00C1CD46 8D85 58C1FFFF lea eax,dword ptr ss:[ebp-3EA8]
00C1CD4C 50 push eax
00C1CD4D 8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8]
00C1CD53 FF30 push dword ptr ds:[eax]
00C1CD55 E8 9153FDFF call 00BF20EB
00C1CD5A 83C4 0C add esp,0C
00C1CD5D 8D85 58C1FFFF lea eax,dword ptr ss:[ebp-3EA8]
00C1CD63 50 push eax
00C1CD64 8D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98]
00C1CD6A 50 push eax
00C1CD6B FF15 7873C200 call dword ptr ds:[C27378] ; msvcrt._stricmp
00C1CD71 59 pop ecx
00C1CD72 59 pop ecx
00C1CD73 85C0 test eax,eax ; 这里 EAX 的值情况有 3 种情况
00C1CD75 75 11 jnz short 00C1CD88 ; Magic Jmp
00C1CD77 8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8] ; 如果上面 EAX 值为 0 那么就加密 IAT
00C1CD7D 8B40 08 mov eax,dword ptr ds:[eax+8]
00C1CD80 8985 68CAFFFF mov dword ptr ss:[ebp-3598],eax
00C1CD86 EB 02 jmp short 00C1CD8A ; 找到了就结束循环继续处理
00C1CD88 ^ EB 9C jmp short 00C1CD26 ; 返回 00C1CD26 继续循环
00C1CD73 的 test eax,eax 这里 EAX 的值情况有 3 种情况
第1种 EAX 的值为 FFFFFFFF
第2种 EAX 的值为 1
第3种 EAX 的值为 0
当 EAX 的值为 0 时就加密 IAT
那么可以推断 00C1CD75 的 jnz short 00C1CD88 就是 Magic Jmp 这里把 JNZ 改为 JMP 就可以避开 IAT 加密了。
只想脱壳找 Magic Jmp 方法的可以略过下面这段以下是处理 IAT 的详细分析:
00C1C72E 6A 01 push 1 ; IAT 处理开始
00C1C730 58 pop eax
00C1C731 85C0 test eax,eax
00C1C733 0F84 C5080000 je 00C1CFFE
00C1C739 8B85 84D9FFFF mov eax,dword ptr ss:[ebp-267C] ; DLL 名送 EAX
00C1C73F 8985 84D3FFFF mov dword ptr ss:[ebp-2C7C],eax
00C1C745 6A 00 push 0
00C1C747 FFB5 84D9FFFF push dword ptr ss:[ebp-267C]
00C1C74D FF15 2073C200 call dword ptr ds:[C27320] ; msvcrt.strchr
00C1C753 59 pop ecx
00C1C754 59 pop ecx
00C1C755 40 inc eax
00C1C756 8985 84D9FFFF mov dword ptr ss:[ebp-267C],eax
00C1C75C 8B85 84D3FFFF mov eax,dword ptr ss:[ebp-2C7C]
00C1C762 0FBE00 movsx eax,byte ptr ds:[eax]
00C1C765 85C0 test eax,eax
00C1C767 75 05 jnz short 00C1C76E
00C1C769 E9 90080000 jmp 00C1CFFE
00C1C76E 8B85 84D9FFFF mov eax,dword ptr ss:[ebp-267C]
00C1C774 8B00 mov eax,dword ptr ds:[eax]
00C1C776 8985 90D4FFFF mov dword ptr ss:[ebp-2B70],eax
00C1C77C 8B85 84D9FFFF mov eax,dword ptr ss:[ebp-267C]
00C1C782 83C0 04 add eax,4
00C1C785 8985 84D9FFFF mov dword ptr ss:[ebp-267C],eax
00C1C78B 8B85 84D9FFFF mov eax,dword ptr ss:[ebp-267C]
00C1C791 8B00 mov eax,dword ptr ds:[eax]
00C1C793 8985 98D4FFFF mov dword ptr ss:[ebp-2B68],eax
00C1C799 8B85 84D9FFFF mov eax,dword ptr ss:[ebp-267C]
00C1C79F 83C0 04 add eax,4
00C1C7A2 8985 84D9FFFF mov dword ptr ss:[ebp-267C],eax
00C1C7A8 A0 50FFC200 mov al,byte ptr ds:[C2FF50]
00C1C7AD 8885 88D3FFFF mov byte ptr ss:[ebp-2C78],al
00C1C7B3 6A 40 push 40
00C1C7B5 59 pop ecx
00C1C7B6 33C0 xor eax,eax
00C1C7B8 8DBD 89D3FFFF lea edi,dword ptr ss:[ebp-2C77]
00C1C7BE F3:AB rep stos dword ptr es:[edi]
00C1C7C0 66:AB stos word ptr es:[edi]
00C1C7C2 AA stos byte ptr es:[edi]
00C1C7C3 FFB5 84D3FFFF push dword ptr ss:[ebp-2C7C]
00C1C7C9 E8 B3ACFEFF call 00C07481 ; 获取 DLL 基址
00C1C7CE 8985 A0D4FFFF mov dword ptr ss:[ebp-2B60],eax ; 基址送 [ebp-2B60] 保存
00C1C7D4 83BD A0D4FFFF 0>cmp dword ptr ss:[ebp-2B60],0
00C1C7DB 0F85 9F000000 jnz 00C1C880
00C1C7E1 83BD A0D4FFFF 0>cmp dword ptr ss:[ebp-2B60],0
00C1C7E8 75 5B jnz short 00C1C845
00C1C7EA 6A 01 push 1
00C1C7EC 8D85 80D2FFFF lea eax,dword ptr ss:[ebp-2D80]
00C1C7F2 50 push eax
00C1C7F3 E8 036DFFFF call 00C134FB
00C1C7F8 59 pop ecx
00C1C7F9 59 pop ecx
00C1C7FA 6A 5C push 5C
00C1C7FC 8D85 80D2FFFF lea eax,dword ptr ss:[ebp-2D80]
00C1C802 50 push eax
00C1C803 FF15 EC72C200 call dword ptr ds:[C272EC] ; msvcrt.strrchr
00C1C809 59 pop ecx
00C1C80A 59 pop ecx
00C1C80B 8985 7CD2FFFF mov dword ptr ss:[ebp-2D84],eax
00C1C811 83BD 7CD2FFFF 0>cmp dword ptr ss:[ebp-2D84],0
00C1C818 74 2B je short 00C1C845
00C1C81A FFB5 84D3FFFF push dword ptr ss:[ebp-2C7C]
00C1C820 8B85 7CD2FFFF mov eax,dword ptr ss:[ebp-2D84]
00C1C826 40 inc eax
00C1C827 50 push eax
00C1C828 E8 FD990000 call 00C2622A ; jmp 到 msvcrt.strcpy
00C1C82D 59 pop ecx
00C1C82E 59 pop ecx
00C1C82F 6A 08 push 8
00C1C831 6A 00 push 0
00C1C833 8D85 80D2FFFF lea eax,dword ptr ss:[ebp-2D80]
00C1C839 50 push eax
00C1C83A E8 36B0FEFF call 00C07875
00C1C83F 8985 A0D4FFFF mov dword ptr ss:[ebp-2B60],eax
00C1C845 83BD A0D4FFFF 0>cmp dword ptr ss:[ebp-2B60],0
00C1C84C 75 32 jnz short 00C1C880
00C1C84E 6A 01 push 1
00C1C850 8D85 80D2FFFF lea eax,dword ptr ss:[ebp-2D80]
00C1C856 50 push eax
00C1C857 E8 9F6CFFFF call 00C134FB
00C1C85C 59 pop ecx
00C1C85D 59 pop ecx
00C1C85E 8D85 80D2FFFF lea eax,dword ptr ss:[ebp-2D80]
00C1C864 50 push eax
00C1C865 8D85 88D3FFFF lea eax,dword ptr ss:[ebp-2C78]
00C1C86B 50 push eax
00C1C86C FFB5 84D3FFFF push dword ptr ss:[ebp-2C7C]
00C1C872 E8 43A7FEFF call 00C06FBA
00C1C877 83C4 0C add esp,0C
00C1C87A 8985 A0D4FFFF mov dword ptr ss:[ebp-2B60],eax
00C1C880 83BD A0D4FFFF 0>cmp dword ptr ss:[ebp-2B60],0
00C1C887 75 58 jnz short 00C1C8E1
00C1C889 8B45 08 mov eax,dword ptr ss:[ebp+8]
00C1C88C 8B00 mov eax,dword ptr ds:[eax]
00C1C88E C700 03000000 mov dword ptr ds:[eax],3
00C1C894 0FBE85 88D3FFFF movsx eax,byte ptr ss:[ebp-2C78]
00C1C89B 85C0 test eax,eax
00C1C89D 74 0E je short 00C1C8AD
00C1C89F 8D85 88D3FFFF lea eax,dword ptr ss:[ebp-2C78]
00C1C8A5 8985 E0A8FFFF mov dword ptr ss:[ebp+FFFFA8E0],eax
00C1C8AB EB 0C jmp short 00C1C8B9
00C1C8AD 8B85 84D3FFFF mov eax,dword ptr ss:[ebp-2C7C]
00C1C8B3 8985 E0A8FFFF mov dword ptr ss:[ebp+FFFFA8E0],eax
00C1C8B9 FF15 C072C200 call dword ptr ds:[C272C0] ; ntdll.RtlGetLastWin32Error
00C1C8BF 50 push eax
00C1C8C0 FFB5 E0A8FFFF push dword ptr ss:[ebp+FFFFA8E0]
00C1C8C6 68 78DDC200 push 0C2DD78 ; ASCII "File "%s", error %d"
00C1C8CB 8B45 08 mov eax,dword ptr ss:[ebp+8]
00C1C8CE FF70 04 push dword ptr ds:[eax+4]
00C1C8D1 FF15 1C73C200 call dword ptr ds:[C2731C] ; msvcrt.sprintf
00C1C8D7 83C4 10 add esp,10
00C1C8DA 33C0 xor eax,eax
00C1C8DC E9 7F1A0000 jmp 00C1E360
00C1C8E1 FFB5 A0D4FFFF push dword ptr ss:[ebp-2B60] ; Dll 基址进栈
00C1C8E7 E8 6294FEFF call 00C05D4E
00C1C8EC 59 pop ecx
00C1C8ED 83A5 9CD4FFFF 0>and dword ptr ss:[ebp-2B64],0
00C1C8F4 A1 EC15C300 mov eax,dword ptr ds:[C315EC]
00C1C8F9 8985 F0A9FFFF mov dword ptr ss:[ebp+FFFFA9F0],eax ; 镜像基址送 [ebp+FFFFA9F0]
00C1C8FF 8B85 A0D4FFFF mov eax,dword ptr ss:[ebp-2B60] ; Dll 基址送 EAX
00C1C905 3B85 F0A9FFFF cmp eax,dword ptr ss:[ebp+FFFFA9F0]
00C1C90B 75 0F jnz short 00C1C91C
00C1C90D C785 9CD4FFFF B>mov dword ptr ss:[ebp-2B64],0C2BBB8
00C1C917 E9 93000000 jmp 00C1C9AF
00C1C91C 83A5 78D2FFFF 0>and dword ptr ss:[ebp-2D88],0
00C1C923 C785 74D2FFFF D>mov dword ptr ss:[ebp-2D8C],0C2C1D8
00C1C92D EB 1C jmp short 00C1C94B
00C1C92F 8B85 74D2FFFF mov eax,dword ptr ss:[ebp-2D8C]
00C1C935 83C0 0C add eax,0C
00C1C938 8985 74D2FFFF mov dword ptr ss:[ebp-2D8C],eax
00C1C93E 8B85 78D2FFFF mov eax,dword ptr ss:[ebp-2D88]
00C1C944 40 inc eax
00C1C945 8985 78D2FFFF mov dword ptr ss:[ebp-2D88],eax
00C1C94B 8B85 74D2FFFF mov eax,dword ptr ss:[ebp-2D8C]
00C1C951 8338 00 cmp dword ptr ds:[eax],0
00C1C954 74 59 je short 00C1C9AF
00C1C956 8B85 74D2FFFF mov eax,dword ptr ss:[ebp-2D8C]
00C1C95C 8B40 08 mov eax,dword ptr ds:[eax+8]
00C1C95F 83E0 01 and eax,1
00C1C962 85C0 test eax,eax
00C1C964 74 13 je short 00C1C979
00C1C966 B9 880FC300 mov ecx,0C30F88
00C1C96B E8 77F1FDFF call 00BFBAE7
00C1C970 0FB6C0 movzx eax,al
00C1C973 85C0 test eax,eax
00C1C975 74 02 je short 00C1C979
00C1C977 ^ EB B6 jmp short 00C1C92F
00C1C979 B9 880FC300 mov ecx,0C30F88
00C1C97E E8 ADD1FEFF call 00C09B30
00C1C983 8B8D 78D2FFFF mov ecx,dword ptr ss:[ebp-2D88]
00C1C989 8B15 9C55C300 mov edx,dword ptr ds:[C3559C]
00C1C98F 8B0C8A mov ecx,dword ptr ds:[edx+ecx*4]
00C1C992 33C8 xor ecx,eax
00C1C994 398D A0D4FFFF cmp dword ptr ss:[ebp-2B60],ecx
00C1C99A 75 11 jnz short 00C1C9AD
00C1C99C 8B85 74D2FFFF mov eax,dword ptr ss:[ebp-2D8C]
00C1C9A2 8B40 04 mov eax,dword ptr ds:[eax+4]
00C1C9A5 8985 9CD4FFFF mov dword ptr ss:[ebp-2B64],eax
00C1C9AB EB 02 jmp short 00C1C9AF
00C1C9AD ^ EB 80 jmp short 00C1C92F
00C1C9AF 80A5 94D4FFFF 0>and byte ptr ss:[ebp-2B6C],0
00C1C9B6 83BD E4D7FFFF 0>cmp dword ptr ss:[ebp-281C],0
00C1C9BD 75 39 jnz short 00C1C9F8
00C1C9BF A0 AC15C300 mov al,byte ptr ds:[C315AC]
00C1C9C4 8885 ECA9FFFF mov byte ptr ss:[ebp+FFFFA9EC],al
00C1C9CA 0FB685 ECA9FFFF movzx eax,byte ptr ss:[ebp+FFFFA9EC]
00C1C9D1 85C0 test eax,eax
00C1C9D3 74 23 je short 00C1C9F8
00C1C9D5 8B85 90D4FFFF mov eax,dword ptr ss:[ebp-2B70]
00C1C9DB 3B85 C0FEFFFF cmp eax,dword ptr ss:[ebp-140]
00C1C9E1 72 15 jb short 00C1C9F8
00C1C9E3 8B85 90D4FFFF mov eax,dword ptr ss:[ebp-2B70]
00C1C9E9 3B85 CCFEFFFF cmp eax,dword ptr ss:[ebp-134]
00C1C9EF 73 07 jnb short 00C1C9F8
00C1C9F1 C685 94D4FFFF 0>mov byte ptr ss:[ebp-2B6C],1
00C1C9F8 8B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00C1C9FE 40 inc eax
00C1C9FF 8985 98D4FFFF mov dword ptr ss:[ebp-2B68],eax
00C1CA05 83BD E4D7FFFF 0>cmp dword ptr ss:[ebp-281C],0
00C1CA0C 74 4D je short 00C1CA5B
00C1CA0E 8B85 90D4FFFF mov eax,dword ptr ss:[ebp-2B70]
00C1CA14 2B85 E8D7FFFF sub eax,dword ptr ss:[ebp-2818]
00C1CA1A C1E8 02 shr eax,2
00C1CA1D 8985 70D2FFFF mov dword ptr ss:[ebp-2D90],eax
00C1CA23 8B85 70D2FFFF mov eax,dword ptr ss:[ebp-2D90]
00C1CA29 8B8D E4D7FFFF mov ecx,dword ptr ss:[ebp-281C]
00C1CA2F 8D0481 lea eax,dword ptr ds:[ecx+eax*4]
00C1CA32 8985 10D9FFFF mov dword ptr ss:[ebp-26F0],eax
00C1CA38 8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0]
00C1CA3E 8985 6CD9FFFF mov dword ptr ss:[ebp-2694],eax
00C1CA44 8B85 44D9FFFF mov eax,dword ptr ss:[ebp-26BC]
00C1CA4A 8B8D E4D7FFFF mov ecx,dword ptr ss:[ebp-281C]
00C1CA50 8D0481 lea eax,dword ptr ds:[ecx+eax*4]
00C1CA53 8985 64D9FFFF mov dword ptr ss:[ebp-269C],eax
00C1CA59 EB 59 jmp short 00C1CAB4
00C1CA5B 0FB685 94D4FFFF movzx eax,byte ptr ss:[ebp-2B6C]
00C1CA62 85C0 test eax,eax
00C1CA64 74 30 je short 00C1CA96
00C1CA66 8B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00C1CA6C C1E0 02 shl eax,2
00C1CA6F 50 push eax
00C1CA70 E8 25970000 call 00C2619A ; jmp 到 msvcrt.??2@YAPAXI@Z
00C1CA75 59 pop ecx
00C1CA76 8985 ACABFFFF mov dword ptr ss:[ebp+FFFFABAC],eax
00C1CA7C 8B85 ACABFFFF mov eax,dword ptr ss:[ebp+FFFFABAC]
00C1CA82 8985 10D9FFFF mov dword ptr ss:[ebp-26F0],eax
00C1CA88 8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0]
00C1CA8E 8985 6CD9FFFF mov dword ptr ss:[ebp-2694],eax
00C1CA94 EB 1E jmp short 00C1CAB4
00C1CA96 8B85 0CD8FFFF mov eax,dword ptr ss:[ebp-27F4]
00C1CA9C 0385 90D4FFFF add eax,dword ptr ss:[ebp-2B70]
00C1CAA2 8985 6CD9FFFF mov dword ptr ss:[ebp-2694],eax
00C1CAA8 8B85 6CD9FFFF mov eax,dword ptr ss:[ebp-2694]
00C1CAAE 8985 10D9FFFF mov dword ptr ss:[ebp-26F0],eax
00C1CAB4 83BD E4D7FFFF 0>cmp dword ptr ss:[ebp-281C],0
00C1CABB 0F85 B5000000 jnz 00C1CB76
00C1CAC1 8D85 8CD4FFFF lea eax,dword ptr ss:[ebp-2B74]
00C1CAC7 50 push eax
00C1CAC8 6A 04 push 4
00C1CACA 8B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00C1CAD0 C1E0 02 shl eax,2
00C1CAD3 50 push eax
00C1CAD4 8B85 0CD8FFFF mov eax,dword ptr ss:[ebp-27F4]
00C1CADA 0385 90D4FFFF add eax,dword ptr ss:[ebp-2B70]
00C1CAE0 50 push eax
00C1CAE1 FF15 1871C200 call dword ptr ds:[C27118] ; kernel32.VirtualProtect
00C1CAE7 6A 14 push 14
00C1CAE9 E8 AC960000 call 00C2619A ; jmp 到 msvcrt.??2@YAPAXI@Z
00C1CAEE 59 pop ecx
00C1CAEF 8985 A8ABFFFF mov dword ptr ss:[ebp+FFFFABA8],eax
00C1CAF5 83BD A8ABFFFF 0>cmp dword ptr ss:[ebp+FFFFABA8],0
00C1CAFC 74 58 je short 00C1CB56
00C1CAFE A1 08BAC300 mov eax,dword ptr ds:[C3BA08]
00C1CB03 8985 E8A9FFFF mov dword ptr ss:[ebp+FFFFA9E8],eax
00C1CB09 8B85 0CD8FFFF mov eax,dword ptr ss:[ebp-27F4]
00C1CB0F 0385 90D4FFFF add eax,dword ptr ss:[ebp-2B70]
00C1CB15 8B8D A8ABFFFF mov ecx,dword ptr ss:[ebp+FFFFABA8]
00C1CB1B 8901 mov dword ptr ds:[ecx],eax
00C1CB1D 8B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00C1CB23 C1E0 02 shl eax,2
00C1CB26 8B8D A8ABFFFF mov ecx,dword ptr ss:[ebp+FFFFABA8]
00C1CB2C 8941 04 mov dword ptr ds:[ecx+4],eax
00C1CB2F 8B85 A8ABFFFF mov eax,dword ptr ss:[ebp+FFFFABA8]
00C1CB35 8060 0C 00 and byte ptr ds:[eax+C],0
00C1CB39 8B85 A8ABFFFF mov eax,dword ptr ss:[ebp+FFFFABA8]
00C1CB3F 8B8D E8A9FFFF mov ecx,dword ptr ss:[ebp+FFFFA9E8]
00C1CB45 8948 10 mov dword ptr ds:[eax+10],ecx
00C1CB48 8B85 A8ABFFFF mov eax,dword ptr ss:[ebp+FFFFABA8]
00C1CB4E 8985 DCA8FFFF mov dword ptr ss:[ebp+FFFFA8DC],eax
00C1CB54 EB 07 jmp short 00C1CB5D
00C1CB56 83A5 DCA8FFFF 0>and dword ptr ss:[ebp+FFFFA8DC],0
00C1CB5D 8B85 DCA8FFFF mov eax,dword ptr ss:[ebp+FFFFA8DC]
00C1CB63 A3 08BAC300 mov dword ptr ds:[C3BA08],eax
00C1CB68 A1 08BAC300 mov eax,dword ptr ds:[C3BA08]
00C1CB6D 8B8D 8CD4FFFF mov ecx,dword ptr ss:[ebp-2B74]
00C1CB73 8948 08 mov dword ptr ds:[eax+8],ecx
00C1CB76 83A5 A8D4FFFF 0>and dword ptr ss:[ebp-2B58],0
00C1CB7D FF15 8472C200 call dword ptr ds:[C27284] ; kernel32.GetTickCount
00C1CB83 8985 A4D4FFFF mov dword ptr ss:[ebp-2B5C],eax
00C1CB89 6A 01 push 1
00C1CB8B 58 pop eax
00C1CB8C 85C0 test eax,eax
00C1CB8E 0F84 A8030000 je 00C1CF3C
00C1CB94 8B85 84D9FFFF mov eax,dword ptr ss:[ebp-267C]
00C1CB9A 66:8B00 mov ax,word ptr ds:[eax]
00C1CB9D 66:8985 64C2FFF>mov word ptr ss:[ebp-3D9C],ax
00C1CBA4 8B85 84D9FFFF mov eax,dword ptr ss:[ebp-267C]
00C1CBAA 40 inc eax
00C1CBAB 40 inc eax
00C1CBAC 8985 84D9FFFF mov dword ptr ss:[ebp-267C],eax
00C1CBB2 0FB785 64C2FFFF movzx eax,word ptr ss:[ebp-3D9C]
00C1CBB9 50 push eax
00C1CBBA FFB5 84D9FFFF push dword ptr ss:[ebp-267C]
00C1CBC0 8D85 70CAFFFF lea eax,dword ptr ss:[ebp-3590]
00C1CBC6 50 push eax
00C1CBC7 E8 C8950000 call 00C26194 ; jmp 到 msvcrt.memcpy
00C1CBCC 83C4 0C add esp,0C
00C1CBCF 0FB785 64C2FFFF movzx eax,word ptr ss:[ebp-3D9C]
00C1CBD6 8B8D 84D9FFFF mov ecx,dword ptr ss:[ebp-267C]
00C1CBDC 03C8 add ecx,eax
00C1CBDE 898D 84D9FFFF mov dword ptr ss:[ebp-267C],ecx
00C1CBE4 66:83A5 6CCAFFF>and word ptr ss:[ebp-3594],0
00C1CBEC A0 50FFC200 mov al,byte ptr ds:[C2FF50]
00C1CBF1 8885 68C2FFFF mov byte ptr ss:[ebp-3D98],al
00C1CBF7 B9 FF010000 mov ecx,1FF
00C1CBFC 33C0 xor eax,eax
00C1CBFE 8DBD 69C2FFFF lea edi,dword ptr ss:[ebp-3D97]
00C1CC04 F3:AB rep stos dword ptr es:[edi]
00C1CC06 66:AB stos word ptr es:[edi]
00C1CC08 AA stos byte ptr es:[edi]
00C1CC09 0FB785 64C2FFFF movzx eax,word ptr ss:[ebp-3D9C]
00C1CC10 85C0 test eax,eax
00C1CC12 74 6E je short 00C1CC82
00C1CC14 8D8D 74D9FFFF lea ecx,dword ptr ss:[ebp-268C]
00C1CC1A E8 E143FDFF call 00BF1000
00C1CC1F 8985 60C2FFFF mov dword ptr ss:[ebp-3DA0],eax
00C1CC25 6A 00 push 0
00C1CC27 0FB785 64C2FFFF movzx eax,word ptr ss:[ebp-3D9C]
00C1CC2E 50 push eax
00C1CC2F 8D85 70CAFFFF lea eax,dword ptr ss:[ebp-3590]
00C1CC35 50 push eax
00C1CC36 FFB5 60C2FFFF push dword ptr ss:[ebp-3DA0]
00C1CC3C E8 6B48FDFF call 00BF14AC ; 获取一个函数名
00C1CC41 83C4 10 add esp,10
00C1CC44 0FB685 70CAFFFF movzx eax,byte ptr ss:[ebp-3590] ; 函数名首字母 ASCII 送到 EAX
00C1CC4B 3D FF000000 cmp eax,0FF
00C1CC50 75 10 jnz short 00C1CC62
00C1CC52 66:8B85 71CAFFF>mov ax,word ptr ss:[ebp-358F]
00C1CC59 66:8985 6CCAFFF>mov word ptr ss:[ebp-3594],ax
00C1CC60 EB 20 jmp short 00C1CC82
00C1CC62 0FBE85 70CAFFFF movsx eax,byte ptr ss:[ebp-3590] ; 函数名首字母 ASCII 送到 EAX
00C1CC69 85C0 test eax,eax
00C1CC6B 74 15 je short 00C1CC82
00C1CC6D 8D85 70CAFFFF lea eax,dword ptr ss:[ebp-3590] ; 函数名送到 EAX 中保存
00C1CC73 50 push eax
00C1CC74 8D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98] ; 函数地址送到 EAX 中保存
00C1CC7A 50 push eax
00C1CC7B E8 AA950000 call 00C2622A ; jmp 到 msvcrt.strcpy
00C1CC80 59 pop ecx
00C1CC81 59 pop ecx
00C1CC82 83A5 68CAFFFF 0>and dword ptr ss:[ebp-3598],0
00C1CC89 0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594] ; EAX 清 0
00C1CC90 85C0 test eax,eax
00C1CC92 74 6C je short 00C1CD00
00C1CC94 83BD 9CD4FFFF 0>cmp dword ptr ss:[ebp-2B64],0
00C1CC9B 74 51 je short 00C1CCEE
00C1CC9D 8B85 9CD4FFFF mov eax,dword ptr ss:[ebp-2B64]
00C1CCA3 8985 5CC2FFFF mov dword ptr ss:[ebp-3DA4],eax
00C1CCA9 EB 0F jmp short 00C1CCBA
00C1CCAB 8B85 5CC2FFFF mov eax,dword ptr ss:[ebp-3DA4]
00C1CCB1 83C0 0C add eax,0C
00C1CCB4 8985 5CC2FFFF mov dword ptr ss:[ebp-3DA4],eax
00C1CCBA 8B85 5CC2FFFF mov eax,dword ptr ss:[ebp-3DA4]
00C1CCC0 8378 08 00 cmp dword ptr ds:[eax+8],0
00C1CCC4 74 28 je short 00C1CCEE
00C1CCC6 0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00C1CCCD 8B8D 5CC2FFFF mov ecx,dword ptr ss:[ebp-3DA4]
00C1CCD3 0FB749 04 movzx ecx,word ptr ds:[ecx+4]
00C1CCD7 3BC1 cmp eax,ecx
00C1CCD9 75 11 jnz short 00C1CCEC
00C1CCDB 8B85 5CC2FFFF mov eax,dword ptr ss:[ebp-3DA4]
00C1CCE1 8B40 08 mov eax,dword ptr ds:[eax+8]
00C1CCE4 8985 68CAFFFF mov dword ptr ss:[ebp-3598],eax
00C1CCEA EB 02 jmp short 00C1CCEE
00C1CCEC ^ EB BD jmp short 00C1CCAB
00C1CCEE 8B85 A8D4FFFF mov eax,dword ptr ss:[ebp-2B58]
00C1CCF4 40 inc eax
00C1CCF5 8985 A8D4FFFF mov dword ptr ss:[ebp-2B58],eax
00C1CCFB E9 D0000000 jmp 00C1CDD0
00C1CD00 0FBE85 68C2FFFF movsx eax,byte ptr ss:[ebp-3D98] ; 函数名首字母送 ASCII 码 EAX
00C1CD07 85C0 test eax,eax
00C1CD09 0F84 8A000000 je 00C1CD99 ; 空就跳走
00C1CD0F 83BD 9CD4FFFF 0>cmp dword ptr ss:[ebp-2B64],0
00C1CD16 74 72 je short 00C1CD8A
00C1CD18 8B85 9CD4FFFF mov eax,dword ptr ss:[ebp-2B64]
00C1CD1E 8985 58C2FFFF mov dword ptr ss:[ebp-3DA8],eax
00C1CD24 EB 0F jmp short 00C1CD35
00C1CD26 8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8] ; 开始循环计算函数地址
00C1CD2C 83C0 0C add eax,0C
00C1CD2F 8985 58C2FFFF mov dword ptr ss:[ebp-3DA8],eax
00C1CD35 8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8]
00C1CD3B 8378 08 00 cmp dword ptr ds:[eax+8],0
00C1CD3F 74 49 je short 00C1CD8A
00C1CD41 68 00010000 push 100
00C1CD46 8D85 58C1FFFF lea eax,dword ptr ss:[ebp-3EA8]
00C1CD4C 50 push eax
00C1CD4D 8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8]
00C1CD53 FF30 push dword ptr ds:[eax]
00C1CD55 E8 9153FDFF call 00BF20EB
00C1CD5A 83C4 0C add esp,0C
00C1CD5D 8D85 58C1FFFF lea eax,dword ptr ss:[ebp-3EA8]
00C1CD63 50 push eax
00C1CD64 8D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98]
00C1CD6A 50 push eax
00C1CD6B FF15 7873C200 call dword ptr ds:[C27378] ; msvcrt._stricmp
00C1CD71 59 pop ecx
00C1CD72 59 pop ecx
00C1CD73 85C0 test eax,eax ; 这里 EAX 的值情况有 3 种情况 第1种 FFFFFFFF 第2种 1 第3种 0
00C1CD75 75 11 jnz short 00C1CD88 ; Magic Jmp
00C1CD77 8B85 58C2FFFF mov eax,dword ptr ss:[ebp-3DA8] ; 如果上面 EAX 值为 0 那么就加密 IAT
00C1CD7D 8B40 08 mov eax,dword ptr ds:[eax+8]
00C1CD80 8985 68CAFFFF mov dword ptr ss:[ebp-3598],eax
00C1CD86 EB 02 jmp short 00C1CD8A ; 找到了就结束循环继续处理
00C1CD88 ^ EB 9C jmp short 00C1CD26 ; 返回 00C1CD26 继续循环
00C1CD8A 8B85 A8D4FFFF mov eax,dword ptr ss:[ebp-2B58] ; EAX 清 0
00C1CD90 40 inc eax ; EAX 自加
00C1CD91 8985 A8D4FFFF mov dword ptr ss:[ebp-2B58],eax
00C1CD97 EB 37 jmp short 00C1CDD0
00C1CD99 8D8D 38D9FFFF lea ecx,dword ptr ss:[ebp-26C8]
00C1CD9F E8 9C42FDFF call 00BF1040
00C1CDA4 0FB6C0 movzx eax,al
00C1CDA7 99 cdq
00C1CDA8 6A 14 push 14
00C1CDAA 59 pop ecx
00C1CDAB F7F9 idiv ecx
00C1CDAD 8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0]
00C1CDB3 8B8C95 94D7FFFF mov ecx,dword ptr ss:[ebp+edx*4-286C]
00C1CDBA 8908 mov dword ptr ds:[eax],ecx
00C1CDBC 8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0]
00C1CDC2 83C0 04 add eax,4
00C1CDC5 8985 10D9FFFF mov dword ptr ss:[ebp-26F0],eax
00C1CDCB E9 6C010000 jmp 00C1CF3C
00C1CDD0 83BD 68CAFFFF 0>cmp dword ptr ss:[ebp-3598],0 ; [ebp-3598] 为 0 吗
00C1CDD7 75 42 jnz short 00C1CE1B ; 跳就加密 IAT(如果上面没修改这里nop掉可避开加密)
00C1CDD9 0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594] ; EAX 清 0
00C1CDE0 85C0 test eax,eax
00C1CDE2 74 0F je short 00C1CDF3
00C1CDE4 0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00C1CDEB 8985 D8A8FFFF mov dword ptr ss:[ebp+FFFFA8D8],eax
00C1CDF1 EB 0C jmp short 00C1CDFF
00C1CDF3 8D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98] ; 函数名送 EAX
00C1CDF9 8985 D8A8FFFF mov dword ptr ss:[ebp+FFFFA8D8],eax
00C1CDFF 6A 01 push 1
00C1CE01 FFB5 D8A8FFFF push dword ptr ss:[ebp+FFFFA8D8] ; 函数名进栈
00C1CE07 FFB5 A0D4FFFF push dword ptr ss:[ebp-2B60] ; 函数名所在的 Dll 进栈
00C1CE0D E8 1B98FEFF call 00C0662D
00C1CE12 83C4 0C add esp,0C
00C1CE15 8985 68CAFFFF mov dword ptr ss:[ebp-3598],eax ; 把处理好的 IAT 送到 [ebp-3598]
00C1CE1B 83BD 68CAFFFF 0>cmp dword ptr ss:[ebp-3598],0 ; 送进去了吗?
00C1CE22 75 42 jnz short 00C1CE66 ; 送进去就跳到下面继续
00C1CE24 0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00C1CE2B 85C0 test eax,eax
00C1CE2D 74 0F je short 00C1CE3E
00C1CE2F 0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00C1CE36 8985 D4A8FFFF mov dword ptr ss:[ebp+FFFFA8D4],eax
00C1CE3C EB 0C jmp short 00C1CE4A
00C1CE3E 8D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98]
00C1CE44 8985 D4A8FFFF mov dword ptr ss:[ebp+FFFFA8D4],eax
00C1CE4A 6A 00 push 0
00C1CE4C FFB5 D4A8FFFF push dword ptr ss:[ebp+FFFFA8D4]
00C1CE52 FFB5 A0D4FFFF push dword ptr ss:[ebp-2B60]
00C1CE58 E8 D097FEFF call 00C0662D
00C1CE5D 83C4 0C add esp,0C
00C1CE60 8985 68CAFFFF mov dword ptr ss:[ebp-3598],eax
00C1CE66 83BD 68CAFFFF 0>cmp dword ptr ss:[ebp-3598],0 ; 送进去了吗?
00C1CE6D 0F85 99000000 jnz 00C1CF0C ; 送进去就跳到下面继续
00C1CE73 0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00C1CE7A 85C0 test eax,eax
00C1CE7C 74 54 je short 00C1CED2
00C1CE7E FF15 C072C200 call dword ptr ds:[C272C0] ; ntdll.RtlGetLastWin32Error
00C1CE84 83F8 32 cmp eax,32
00C1CE87 75 0C jnz short 00C1CE95
00C1CE89 C785 68CAFFFF 2>mov dword ptr ss:[ebp-3598],0C06622
00C1CE93 EB 3B jmp short 00C1CED0
00C1CE95 8B45 08 mov eax,dword ptr ss:[ebp+8]
00C1CE98 8B00 mov eax,dword ptr ds:[eax]
00C1CE9A C700 03000000 mov dword ptr ds:[eax],3
00C1CEA0 FF15 C072C200 call dword ptr ds:[C272C0] ; ntdll.RtlGetLastWin32Error
00C1CEA6 50 push eax
00C1CEA7 0FB785 6CCAFFFF movzx eax,word ptr ss:[ebp-3594]
00C1CEAE 50 push eax
00C1CEAF FFB5 84D3FFFF push dword ptr ss:[ebp-2C7C]
00C1CEB5 68 54DDC200 push 0C2DD54 ; ASCII "File "%s", ordinal %d (error %d)"
00C1CEBA 8B45 08 mov eax,dword ptr ss:[ebp+8]
00C1CEBD FF70 04 push dword ptr ds:[eax+4]
00C1CEC0 FF15 1C73C200 call dword ptr ds:[C2731C] ; msvcrt.sprintf
00C1CEC6 83C4 14 add esp,14
00C1CEC9 33C0 xor eax,eax
00C1CECB E9 90140000 jmp 00C1E360
00C1CED0 EB 3A jmp short 00C1CF0C
00C1CED2 8B45 08 mov eax,dword ptr ss:[ebp+8]
00C1CED5 8B00 mov eax,dword ptr ds:[eax]
00C1CED7 C700 03000000 mov dword ptr ds:[eax],3
00C1CEDD FF15 C072C200 call dword ptr ds:[C272C0] ; ntdll.RtlGetLastWin32Error
00C1CEE3 50 push eax
00C1CEE4 8D85 68C2FFFF lea eax,dword ptr ss:[ebp-3D98]
00C1CEEA 50 push eax
00C1CEEB FFB5 84D3FFFF push dword ptr ss:[ebp-2C7C]
00C1CEF1 68 30DDC200 push 0C2DD30 ; ASCII "File "%s", function "%s" (error %d)"
00C1CEF6 8B45 08 mov eax,dword ptr ss:[ebp+8]
00C1CEF9 FF70 04 push dword ptr ds:[eax+4]
00C1CEFC FF15 1C73C200 call dword ptr ds:[C2731C] ; msvcrt.sprintf
00C1CF02 83C4 14 add esp,14
00C1CF05 33C0 xor eax,eax
00C1CF07 E9 54140000 jmp 00C1E360
00C1CF0C 8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0] ; 把刚才 IAT 所在的位置送到 EAX
00C1CF12 3B85 64D9FFFF cmp eax,dword ptr ss:[ebp-269C] ; EAX 里现在是 FFFFFFFF 吗?
00C1CF18 73 1D jnb short 00C1CF37
00C1CF1A 8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0] ; 把刚才 IAT 所在的位置送到 EAX
00C1CF20 8B8D 68CAFFFF mov ecx,dword ptr ss:[ebp-3598] ; 把 IAT 送到 ECX
00C1CF26 8908 mov dword ptr ds:[eax],ecx ; 写入 IAT,过了这句就可以在数据窗口中看到 IAT 被写入了
00C1CF28 8B85 10D9FFFF mov eax,dword ptr ss:[ebp-26F0] ; 把刚才 IAT 所在位置的地址送到 EAX 中
00C1CF2E 83C0 04 add eax,4 ; 加 4 (其实就是指针指向下一个要写入的 IAT 位置)
00C1CF31 8985 10D9FFFF mov dword ptr ss:[ebp-26F0],eax ; 获得下一个要写入的 IAT 的位置后 送到 [ebp-26F0] 中保存
00C1CF37 ^ E9 4DFCFFFF jmp 00C1CB89 ; 回去继续循环
00C1CF3C FF15 8472C200 call dword ptr ds:[C27284] ; kernel32.GetTickCount
00C1CF42 2B85 A4D4FFFF sub eax,dword ptr ss:[ebp-2B5C]
00C1CF48 8B8D A8D4FFFF mov ecx,dword ptr ss:[ebp-2B58]
00C1CF4E 6BC9 32 imul ecx,ecx,32
00C1CF51 81C1 D0070000 add ecx,7D0
00C1CF57 3BC1 cmp eax,ecx
00C1CF59 76 07 jbe short 00C1CF62
00C1CF5B C685 34D9FFFF 0>mov byte ptr ss:[ebp-26CC],1
00C1CF62 83BD E4D7FFFF 0>cmp dword ptr ss:[ebp-281C],0
00C1CF69 0F85 8A000000 jnz 00C1CFF9
00C1CF6F 0FB685 94D4FFFF movzx eax,byte ptr ss:[ebp-2B6C]
00C1CF76 85C0 test eax,eax
00C1CF78 74 7F je short 00C1CFF9
00C1CF7A 6A 00 push 0
00C1CF7C 8B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00C1CF82 C1E0 02 shl eax,2
00C1CF85 50 push eax
00C1CF86 8B85 0CD8FFFF mov eax,dword ptr ss:[ebp-27F4]
00C1CF8C 0385 90D4FFFF add eax,dword ptr ss:[ebp-2B70]
00C1CF92 50 push eax
00C1CF93 E8 061F0000 call 00C1EE9E
00C1CF98 83C4 0C add esp,0C
00C1CF9B 8B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00C1CFA1 C1E0 02 shl eax,2
00C1CFA4 50 push eax
00C1CFA5 FFB5 6CD9FFFF push dword ptr ss:[ebp-2694]
00C1CFAB 8B85 0CD8FFFF mov eax,dword ptr ss:[ebp-27F4]
00C1CFB1 0385 90D4FFFF add eax,dword ptr ss:[ebp-2B70]
00C1CFB7 50 push eax
00C1CFB8 E8 D7910000 call 00C26194 ; jmp 到 msvcrt.memcpy
00C1CFBD 83C4 0C add esp,0C
00C1CFC0 6A 01 push 1
00C1CFC2 8B85 98D4FFFF mov eax,dword ptr ss:[ebp-2B68]
00C1CFC8 C1E0 02 shl eax,2
00C1CFCB 50 push eax
00C1CFCC 8B85 0CD8FFFF mov eax,dword ptr ss:[ebp-27F4]
00C1CFD2 0385 90D4FFFF add eax,dword ptr ss:[ebp-2B70]
00C1CFD8 50 push eax
00C1CFD9 E8 C01E0000 call 00C1EE9E
00C1CFDE 83C4 0C add esp,0C
00C1CFE1 8B85 6CD9FFFF mov eax,dword ptr ss:[ebp-2694]
00C1CFE7 8985 A4ABFFFF mov dword ptr ss:[ebp+FFFFABA4],eax
00C1CFED FFB5 A4ABFFFF push dword ptr ss:[ebp+FFFFABA4]
00C1CFF3 E8 96910000 call 00C2618E ; jmp 到 msvcrt.??3@YAXPAX@Z
00C1CFF8 59 pop ecx
00C1CFF9 ^ E9 30F7FFFF jmp 00C1C72E ; 跳回去继续处理 IAT
00C1CFFE 8B85 F0D7FFFF mov eax,dword ptr ss:[ebp-2810] ; 到这里 IAT 已经全部处理完毕
好了,想要的我们都找到了,现在总结一下:
想要避开 IAT 加密这里有2个选择:
1 把 00C1CDD7 的 jnz short 00C1CE1B 这句 nop 掉就可以避开 IAT 加密了。
2 把 00C1CD75 的 jnz 改成 JMP 就可以避开 IAT 加密了。
两种方法任选其一,改好后到 00C1CFFE 设置个硬件执行断点,然后 Shift+F9 运行程序
中断后把刚才改的还原回来这时候就可以用 ImportREC v1.6 Fix 修复输入表了
在 ImportREC 里填好 OEP 后自动搜索IAT或手动输入来获取输入信息都可以。
如果手动输入就用我们前面获得的数据:
OEP:10CC
IAT Rva:62E4
IAT Size:240
这时 ImportREC 提示:
IAT 读取成功.
当前输入表:
0 (十进制:0) 个有效模块
90 (十进制:144) 个输入函数.
(5 (十进制:5) 个未解决的指针)
点 ImportREC 右边的无效函数按钮,然后用鼠标右键菜单中的剪切指针把这些无效指针 CUT 掉
到这里 UnPack 后的程序应该已经可以运行了,脱壳后的文件大小变成了 780 KB
第三步:脱壳后的程序优化
现在我们来优化一下,把脱壳后的文件载入 OD,Alt+M 打开内存映射窗口
从 00401000 到 004C2000 这 11 个段全部下 F2 断点
然后 Shift+F9 直到程序完全运行后再次 Alt+M 看看哪几个断点已经不存在了
剩下还有断点的这几个段就是无用区段了
这里分别是:.IDAta .reloc .text1 .adata .data1 .reloc1 .pdata
用 LordPE 删除上面几个区段后重建一 PE 下就可以了
优化后大小:38.4 KB
动画下载地址:http://bbs.86sw.com/viewFile.asp?BoardID=3&ID=577 |
|