好友
阅读权限40
听众
最后登录1970-1-1
|
楼主|
小生我怕怕
发表于 2008-10-13 01:02
00400154 > 8725 AC824900 xchg dword ptr ds:[4982AC],esp //OD载入
0040015A 61 popad
0040015B 94 xchg eax,esp //单步F8到此,注意堆栈窗口
0040015C 55 push ebp
0040015D A4 movs byte ptr es:[edi],byte ptr ds:[esi]
━━━━━━━━━━━━━━━━━━━━━━━━━━
004982B0 004001E8 UnPackMe.004001E8
004982B4 004001DC UnPackMe.004001DC
004982B8 004001DE UnPackMe.004001DE //下面即我们OEP地址0045271C
004982BC 0045271C UnPackMe.0045271C //在这行我们右键,反汇编窗口跟随
004982C0 > 7C801D77 kernel32.LoadLibraryA
004982C4 > 7C80ADA0 kernel32.GetProcAddress
━━━━━━━━━━━━━━━━━━━━━━━━━━
0045271C 00 db 00 //右键从模块中删除分析
0045271D 00 db 00 //删除后如下面的分析
0045271E 00 db 00
0045271F 00 db 00
00452720 00 db 00
00452721 00 db 00
━━━━━━━━━━━━━━━━━━━━━━━━━━
0045271C 0000 add byte ptr ds:[eax],al //在此右键断点,设置硬件访问断点
0045271E 0000 add byte ptr ds:[eax],al //ctrl+f2从新加载程序
00452720 0000 add byte ptr ds:[eax],al
00452722 0000 add byte ptr ds:[eax],al
00452724 0000 add byte ptr ds:[eax],al
━━━━━━━━━━━━━━━━━━━━━━━━━━
00400154 > 8725 AC824900 xchg dword ptr ds:[4982AC],esp //从新加载后在这里
0040015A 61 popad //F9直接运行程序
0040015B 94 xchg eax,esp
0040015C 55 push ebp
0040015D A4 movs byte ptr es:[edi],byte ptr ds:[esi]
0040015E B6 80 mov dh,80
━━━━━━━━━━━━━━━━━━━━━━━━━━
0045271C 55 push ebp //程序直接停在我们的OEP上
0045271D 8BEC mov ebp,esp //运行lordPE把程序DUMP
0045271F 83C4 EC add esp,-14 //运行importRCE修复程序
00452722 33C0 xor eax,eax
00452724 8945 EC mov dword ptr ss:[ebp-14],eax
00452727 B8 34254500 mov eax,UnPackMe.00452534
0045272C E8 673BFBFF call UnPackMe.00406298
━━━━━━━━━━━━━━━━━━━━━━━━━━
在修复时,会发现只有3个指针,这种情况是不可能有的,所以我们要开始手动来查找我们的IAT指针
当然如果有CHimpREC这个工具就可以避免手动查找IAT的痛苦,好啦废话就不多说啦,我们开始找我
们的IAT指针
━━━━━━━━━━━━━━━━━━━━━━━━━━
0045271C 55 push ebp //这里是我们的OEP处
0045271D 8BEC mov ebp,esp
0045271F 83C4 EC add esp,-14
00452722 33C0 xor eax,eax
00452724 8945 EC mov dword ptr ss:[ebp-14],eax
00452727 B8 34254500 mov eax,UnPackMe.00452534
0045272C E8 673BFBFF call UnPackMe.00406298
00452731 33C0 xor eax,eax
00452733 55 push ebp
00452734 68 9E274500 push UnPackMe.0045279E
00452739 64:FF30 push dword ptr fs:[eax]
0045273C 64:8920 mov dword ptr fs:[eax],esp
0045273F A1 E03F4500 mov eax,dword ptr ds:[453FE0] //注意453FE0这个值
00452744 8B00 mov eax,dword ptr ds:[eax] //我们在命令栏输入 d 453fe0
00452746 E8 91DEFFFF call UnPackMe.004505DC
━━━━━━━━━━━━━━━━━━━━━━━━━━
00453FE0 00455BB0 UnPackMe.00455BB0 //此时数据窗口如下
00453FE4 00453014 UnPackMe.00453014 //我们向下拉着找有IAT指针的地址
00453FE8 00407138 ASCII "dVE"
00453FEC 0041ADD0 ASCII "dVE"
00453FF0 0041ADF0 ASCII "dVE"
━━━━━━━━━━━━━━━━━━━━━━━━━━
0045611C 00000000
00456120 00000000
00456124 00000000
00456128 00000000
0045612C 7C93188A ntdll.RtlDeleteCriticalSection //找到这里,在上去就是空代码啦,所以我们的RVA就为5612C
00456130 7C9210ED ntdll.RtlLeaveCriticalSection //我们的大小就不用去计算啦,就直接填1000
00456134 7C921005 ntdll.RtlEnterCriticalSection //填上我们的OEP:5271C,RVA:5612C 大小:1000直接获取输入表
00456138 7C809EF1 kernel32.InitializeCriticalSection //会发现有616个指针无效,直接剪切掉就可以啦,抓取下文件就可以啦
0045613C 7C809AE4 kernel32.VirtualFree
00456140 7C809A51 kernel32.VirtualAlloc
00456144 7C80992F kernel32.LocalFree
00456148 7C80998D kernel32.LocalAlloc
━━━━━━━━━━━━━━━━━━━━━━━━━━
运行了一下我们的脱壳程序会发现程序无法运行,很明显是有自效验,好我们把脱壳的载入OD
0045271C >/$ 55 push ebp //从新载入后在这里
0045271D |. 8BEC mov ebp,esp //在命令行下断 bp FindFirstFileA
0045271F |. 83C4 EC add esp,-14 //下好断后,f9运行程序
00452722 |. 33C0 xor eax,eax
00452724 |. 8945 EC mov [local.5],eax
00452727 |. B8 34254500 mov eax,dumped_.00452534
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C8137D9 > 8BFF mov edi,edi//F9运行到这里后
7C8137DB 55 push ebp//记住这个断点千万不能取消,后面还要用到
7C8137DC 8BEC mov ebp,esp
7C8137DE 81EC 6C020000 sub esp,26C
7C8137E4 A1 CC46887C mov eax,dword ptr ds:[7C8846CC]
━━━━━━━━━━━━━━━━━━━━━━━━━━
00408848 |. 8BF0 mov esi,eax //ait+f9返回到这里
0040884A |. 8973 14 mov dword ptr ds:[ebx+14],esi //开始单步f8走起
0040884D |. 83FE FF cmp esi,-1 //以下代码过多我就不复制啦,我尽量复制关键
00408850 |. 74 16 je short dumped_.00408868 //一路F8单步走就是啦
00408852 |. 8BC3 mov eax,ebx
00408854 |. E8 63FFFFFF call dumped_.004087BC
━━━━━━━━━━━━━━━━━━━━━━━━━━
00451FB8 . 3D D7330000 cmp eax,33D7 //哈哈到这里一定忽悠死不少人
00451FBD . 0F8F C2000000 jg dumped_.00452085 //我们只要注意他的跳向地址就可以闭开啦
00451FC3 . 0F84 1C030000 je dumped_.004522E5
00451FC9 . 3D FB040000 cmp eax,4FB //单步跳走
00451FCE . 7F 5E jg short dumped_.0045202E
00451FD0 . 0F84 55030000 je dumped_.0045232B
━━━━━━━━━━━━━━━━━━━━━━━━━━
00452085 > \3D E9E40200 cmp eax,2E4E9 //单步到这里会发现我们脱壳后的会大几倍,在向下拉看看。他是跳去退出
0045208A . 7F 6A jg short dumped_.004520F6 //这里改NOP
0045208C . 0F84 29030000 je dumped_.004523BB //这里向下看如果不跳,下面的地址将跳向退出,所以这里要改JMP
00452092 . 3D 8BFC0000 cmp eax,0FC8B
00452097 . 7F 37 jg short dumped_.004520D0
00452099 . 0F84 0A020000 je dumped_.004522A9
0045209F . 2D 8C340000 sub eax,348C
004520A4 . 0F84 F3010000 je dumped_.0045229D
修改如下:
0045208A . 7F 6A jg short dumped_.004520F6 //这里改NOP
0045208C . 0F84 29030000 je dumped_.004523BB //这里改JMP
━━━━━━━━━━━━━━━━━━━━━━━━━━
004523BB > \33C0 xor eax,eax //修改后跳向这里
004523BD . 5A pop edx //继续单步F8走
004523BE . 59 pop ecx //由于代码过多我就不一样复制啦
004523BF . 59 pop ecx
004523C0 . 64:8910 mov dword ptr fs:[eax],edx
004523C3 . EB 0A jmp short dumped_.004523CF
━━━━━━━━━━━━━━━━━━━━━━━━━━
00452766 |. 33C0 xor eax,eax
00452768 |. E8 7F06FBFF call dumped_.00402DEC
0045276D |. 8B45 EC mov eax,[local.5]
00452770 |. E8 0BFDFFFF call dumped_.00452480 //在路过这个CALL时会跑去系统里如下
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C8137D9 > 8BFF mov edi,edi //我们继续AIT+F9返回到用户代码
7C8137DB 55 push ebp
7C8137DC 8BEC mov ebp,esp
7C8137DE 81EC 6C020000 sub esp,26C
━━━━━━━━━━━━━━━━━━━━━━━━━━
00408848 |. 8BF0 mov esi,eax //继续F8单步走
0040884A |. 8973 14 mov dword ptr ds:[ebx+14],esi //由于代码过多我就不复制啦
0040884D |. 83FE FF cmp esi,-1
00408850 |. 74 16 je short dumped_.00408868
00408852 |. 8BC3 mov eax,ebx
━━━━━━━━━━━━━━━━━━━━━━━━━━
00452775 |. 3D E9E40200 cmp eax,2E4E9 //我们F8单步到达这里时注意他比较的值和我们上面一样
0045277A 75 0C jnz short dumped_.00452788 //这里改NOP就可以过掉第2处效验
0045277C |. A1 E03F4500 mov eax,dword ptr ds:[453FE0]
00452781 |. 8B00 mov eax,dword ptr ds:[eax]
00452783 |. E8 ECDEFFFF call dumped_.00450674
修改如下:
0045277A 75 0C jnz short dumped_.00452788 //这句改NOP
━━━━━━━━━━━━━━━━━━━━━━━━━━
0045277C |. A1 E03F4500 mov eax,dword ptr ds:[453FE0] //继续F8单步走
00452781 |. 8B00 mov eax,dword ptr ds:[eax] //由于代码过多我也不复制啦
00452783 |. E8 ECDEFFFF call dumped_.00450674 //路过这里时程序又跑去系统里啦
00452788 |> 33C0 xor eax,eax //此时会发现程序已经运行啦,但是这只是假象
0045278A |. 5A pop edx //所以我们还得继续寻找
━━━━━━━━━━━━━━━━━━━━━━━━━━
7C8137D9 > 8BFF mov edi,edi //我们AIT+F9返回到用户代码
7C8137DB 55 push ebp
7C8137DC 8BEC mov ebp,esp
7C8137DE 81EC 6C020000 sub esp,26C
7C8137E4 A1 CC46887C mov eax,dword ptr ds:[7C8846CC]
━━━━━━━━━━━━━━━━━━━━━━━━━━
00408848 |. 8BF0 mov esi,eax //我们返回到这里
0040884A |. 8973 14 mov dword ptr ds:[ebx+14],esi //由于代码过多我也就不一一复制
0040884D |. 83FE FF cmp esi,-1 //继续单步F8跟
00408850 |. 74 16 je short dumped_.00408868
00408852 |. 8BC3 mov eax,ebx
━━━━━━━━━━━━━━━━━━━━━━━━━━
00452419 |. 3D E9E40200 cmp eax,2E4E9 //当跟踪到这里时会发现出现第3处比较
0045241E 74 07 je short dumped_.00452427 //这里不跳就直接退出啦,所以这里改JMP
00452420 |. 6A 00 push 0 ; /ExitCode = 0
00452422 |. E8 8940FBFF call <jmp.&kernel32.ExitProcess> ; \ExitProcess
00452427 |> 33C0 xor eax,eax
修改如下:
0045241E 74 07 je short dumped_.00452427 //这里改JMP
━━━━━━━━━━━━━━━━━━━━━━━━━━
修改后,我们右键---复制到可执行文件,所有改动,然后保存一份
运行我们的程序,可以运行自效验已经排除 |
-
-
去效验.rar
338 KB, 下载次数: 20, 下载积分: 吾爱币 -1 CB
|