-
-
[旧帖] [原创]PeSpinv0.3脱壳 0.00雪花
-
发表于: 2008-1-17 17:39 2376
-
【文章标题】: PeSpinv0.3脱壳
【文章作者】: 我不是高手
【作者邮箱】: --
【作者主页】: --
【作者QQ号】: --
【软件名称】: 用PeSpinv0.3主程序给PeSpinv0.3主程序加壳后的文件
【使用工具】: OllyDbg
【操作平台】: XP+SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
目标程序是我用用PeSpinv0.3主程序给PeSpinv0.3主程序加壳后的文件,加壳方式是默认的!
0040D087 > /EB 01 jmp short 0040D08A //OD载入后停在这里
0040D089 |68 60E80000 push 0E860
0040D08E 0000 add byte ptr [eax], al
0040D090 8B1C24 mov ebx, dword ptr [esp]
注意:
请设置一下OD,选项--调试选项,除了"忽略在KERNEL32中的内存访问异常"这个打勾外,其他的都不要打!
然后按F9!
第一次异常:
0040D273 F3:AE repe scas byte ptr es:[edi]
SHIFT+F9,第2次异常
0040D3DD F6F3 div bl
SHIFT+F9,第3次异常
0040E944 FB sti
SHIFT+F9,第2次异常
0040E944 4B sti
SHIFT+F9,第5次异常
0040E908 D7 xlat byte ptr [ebx+al]
SHIFT+F9,第6次异常
0040D5AA 8918 mov dword ptr [eax], ebx
SHIFT+F9,第7次异常
004001C1 FFFF ??? ; 未知命令
再shift+f9的话程序就运行了,所以我们在第7次的时候查看堆栈。
SE句柄=0040E553 //到这个地址下断,SHIFR+F9
0040E553 2BDB sub ebx, ebx //停在这里
0040E555 8B6424 08 mov esp, dword ptr [esp+8]
0040E559 64:8F03 pop dword ptr fs:[ebx]
CTRL+B,查找"81 7E 10 ?? ?? ?? ?? 0F 84"
0040DA17 817E 10 00D00000 cmp dword ptr [esi+10], 0D000 //找到这里,在这里下断,SHIFT+F9
0040DA1E 0F84 82010000 je 0040DBA6 //输入表处理完毕就跳
=======================================================================================
跟踪程序发现如下代码:
0040D87B 57 push edi
0040D87C 51 push ecx
0040D87D BF 565E4000 mov edi, 00405E56 //edi=00405e56
0040D882 B9 50010000 mov ecx, 150
0040D887 3917 cmp dword ptr [edi], edx //和Firstthunk比较
0040D889 74 03 je short 0040D88E
0040D88B 47 inc edi
0040D88C ^ E2 F9 loopd short 0040D887 //循环
0040D88E 807F FF E9 cmp byte ptr [edi-1], 0E9 //比较是不是E9
0040D892 75 0A jnz short 0040D89E
0040D894 83C7 04 add edi, 4
0040D897 2BC7 sub eax, edi //函数地址减edi
0040D899 8947 FC mov dword ptr [edi-4], eax //这样就出错拉~!
0040D89C EB 02 jmp short 0040D8A0
0040D89E 8902 mov dword ptr [edx], eax //把正确的函数地址写到Firstthunk
0040D8A0 59 pop ecx
0040D8A1 5F pop edi
0040D8A2 C3 retn
edi是程序的IAT表,这段数据是有规律的:
E9-FIRSTTHUNK-FF
FF25-FIRSTTHUNK //这种形式我们将得到正确的一张跳转表
=======================================================================================
现在我们找一段空白的代码处,我找到如下的地方:
0040EC71 0000 add byte ptr [eax], al
0040EC73 0000 add byte ptr [eax], al
0040EC75 0000 add byte ptr [eax], al
0040EC77 0000 add byte ptr [eax], al //原来的
0040EC79 0000 add byte ptr [eax], al
0040EC7B 0000 add byte ptr [eax], al
0040EC7D 0000 add byte ptr [eax], al
0040EC7F 0000 add byte ptr [eax], al
0040EC81 0000 add byte ptr [eax], al
0040EC83 0000 add byte ptr [eax], al
写如我自己的代码:
0040EC71 50 push eax //这里右键--此处为新的EIP
0040EC72 BF 565E4000 mov edi, 00405E56
0040EC77 B9 50010000 mov ecx, 150
0040EC7C 803F E9 cmp byte ptr [edi], 0E9
0040EC7F 75 0D jnz short 0040EC8E
0040EC81 8B47 01 mov eax, dword ptr [edi+1]
0040EC84 C607 FF mov byte ptr [edi], 0FF //修改后的
0040EC87 C647 01 25 mov byte ptr [edi+1], 25
0040EC8B 8947 02 mov dword ptr [edi+2], eax
0040EC8E 47 inc edi
0040EC8F ^ E2 EB loopd short 0040EC7C
0040EC91 58 pop eax //这里F4完成循环
0040EC92 90 nop
0040EC93 90 nop
CTRL+G到0040DA1E,右键--此处为新的EIP,下断,F9直到跳转成功!
0040DBA6 F9 stc
0040DBA7 72 05 jb short 0040DBAE
0040DBA9 E8 D00A0000 call 0040E67E
0040DBAE EB 01 jmp short 0040DBB1
0040DBB0 FF8D BD372740 dec dword ptr [ebp+402737BD]
0040DBB6 00EB add bl, ch
0040DBB8 0168 F3 add dword ptr [eax-D], ebp
0040DBBB 0F31 rdtsc //注意这个
0040DBBD 50 push eax
0040DBBE F3: prefix rep:
0040DBBF 0F31 rdtsc //rdtsc检验
。。。。。。。。。。。。。。省略N句代码。。。。。。。。。。。。。。。
0040DBD7 3D FF0F0000 cmp eax, 0FFF
0040DBDC 76 1A jbe short 0040DBF8 //到这里修改zf=1,另跳转实现
。。。。。。。。。。。。。。省略N句代码。。。。。。。。。。。。。。。
0040DC0C 61 popad
0040DC0D - E9 E47EFFFF jmp 00405AF6 //跳到OEP
00405AF6 2BC0 sub eax, eax //OEP,在这里dump程序
00405AF8 68 255B4000 push 00405B25 ; ASCII "PE_SPIN_v03"
00405AFD 50 push eax
00405AFE 50 push eax
00405AFF E8 6A030000 call 00405E6E ; jmp 到 kernel32.CreateMutexA
00405B04 E8 8F030000 call 00405E98 ; jmp 到 ntdll.RtlGetLastWin32Error
00405B09 3D B7000000 cmp eax, 0B7
00405B0E 75 21 jnz short 00405B31
dump后的程序可以正常运行,脱壳成功!
--------------------------------------------------------------------------------
【经验总结】
这个壳的难点应该是避开IAT加密吧~!由于是默认的加壳方式,所以没有stolen code。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于xxxxxx论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年01月17日 16:59:28
【文章作者】: 我不是高手
【作者邮箱】: --
【作者主页】: --
【作者QQ号】: --
【软件名称】: 用PeSpinv0.3主程序给PeSpinv0.3主程序加壳后的文件
【使用工具】: OllyDbg
【操作平台】: XP+SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
目标程序是我用用PeSpinv0.3主程序给PeSpinv0.3主程序加壳后的文件,加壳方式是默认的!
0040D087 > /EB 01 jmp short 0040D08A //OD载入后停在这里
0040D089 |68 60E80000 push 0E860
0040D08E 0000 add byte ptr [eax], al
0040D090 8B1C24 mov ebx, dword ptr [esp]
注意:
请设置一下OD,选项--调试选项,除了"忽略在KERNEL32中的内存访问异常"这个打勾外,其他的都不要打!
然后按F9!
第一次异常:
0040D273 F3:AE repe scas byte ptr es:[edi]
SHIFT+F9,第2次异常
0040D3DD F6F3 div bl
SHIFT+F9,第3次异常
0040E944 FB sti
SHIFT+F9,第2次异常
0040E944 4B sti
SHIFT+F9,第5次异常
0040E908 D7 xlat byte ptr [ebx+al]
SHIFT+F9,第6次异常
0040D5AA 8918 mov dword ptr [eax], ebx
SHIFT+F9,第7次异常
004001C1 FFFF ??? ; 未知命令
再shift+f9的话程序就运行了,所以我们在第7次的时候查看堆栈。
SE句柄=0040E553 //到这个地址下断,SHIFR+F9
0040E553 2BDB sub ebx, ebx //停在这里
0040E555 8B6424 08 mov esp, dword ptr [esp+8]
0040E559 64:8F03 pop dword ptr fs:[ebx]
CTRL+B,查找"81 7E 10 ?? ?? ?? ?? 0F 84"
0040DA17 817E 10 00D00000 cmp dword ptr [esi+10], 0D000 //找到这里,在这里下断,SHIFT+F9
0040DA1E 0F84 82010000 je 0040DBA6 //输入表处理完毕就跳
=======================================================================================
跟踪程序发现如下代码:
0040D87B 57 push edi
0040D87C 51 push ecx
0040D87D BF 565E4000 mov edi, 00405E56 //edi=00405e56
0040D882 B9 50010000 mov ecx, 150
0040D887 3917 cmp dword ptr [edi], edx //和Firstthunk比较
0040D889 74 03 je short 0040D88E
0040D88B 47 inc edi
0040D88C ^ E2 F9 loopd short 0040D887 //循环
0040D88E 807F FF E9 cmp byte ptr [edi-1], 0E9 //比较是不是E9
0040D892 75 0A jnz short 0040D89E
0040D894 83C7 04 add edi, 4
0040D897 2BC7 sub eax, edi //函数地址减edi
0040D899 8947 FC mov dword ptr [edi-4], eax //这样就出错拉~!
0040D89C EB 02 jmp short 0040D8A0
0040D89E 8902 mov dword ptr [edx], eax //把正确的函数地址写到Firstthunk
0040D8A0 59 pop ecx
0040D8A1 5F pop edi
0040D8A2 C3 retn
edi是程序的IAT表,这段数据是有规律的:
E9-FIRSTTHUNK-FF
FF25-FIRSTTHUNK //这种形式我们将得到正确的一张跳转表
=======================================================================================
现在我们找一段空白的代码处,我找到如下的地方:
0040EC71 0000 add byte ptr [eax], al
0040EC73 0000 add byte ptr [eax], al
0040EC75 0000 add byte ptr [eax], al
0040EC77 0000 add byte ptr [eax], al //原来的
0040EC79 0000 add byte ptr [eax], al
0040EC7B 0000 add byte ptr [eax], al
0040EC7D 0000 add byte ptr [eax], al
0040EC7F 0000 add byte ptr [eax], al
0040EC81 0000 add byte ptr [eax], al
0040EC83 0000 add byte ptr [eax], al
写如我自己的代码:
0040EC71 50 push eax //这里右键--此处为新的EIP
0040EC72 BF 565E4000 mov edi, 00405E56
0040EC77 B9 50010000 mov ecx, 150
0040EC7C 803F E9 cmp byte ptr [edi], 0E9
0040EC7F 75 0D jnz short 0040EC8E
0040EC81 8B47 01 mov eax, dword ptr [edi+1]
0040EC84 C607 FF mov byte ptr [edi], 0FF //修改后的
0040EC87 C647 01 25 mov byte ptr [edi+1], 25
0040EC8B 8947 02 mov dword ptr [edi+2], eax
0040EC8E 47 inc edi
0040EC8F ^ E2 EB loopd short 0040EC7C
0040EC91 58 pop eax //这里F4完成循环
0040EC92 90 nop
0040EC93 90 nop
CTRL+G到0040DA1E,右键--此处为新的EIP,下断,F9直到跳转成功!
0040DBA6 F9 stc
0040DBA7 72 05 jb short 0040DBAE
0040DBA9 E8 D00A0000 call 0040E67E
0040DBAE EB 01 jmp short 0040DBB1
0040DBB0 FF8D BD372740 dec dword ptr [ebp+402737BD]
0040DBB6 00EB add bl, ch
0040DBB8 0168 F3 add dword ptr [eax-D], ebp
0040DBBB 0F31 rdtsc //注意这个
0040DBBD 50 push eax
0040DBBE F3: prefix rep:
0040DBBF 0F31 rdtsc //rdtsc检验
。。。。。。。。。。。。。。省略N句代码。。。。。。。。。。。。。。。
0040DBD7 3D FF0F0000 cmp eax, 0FFF
0040DBDC 76 1A jbe short 0040DBF8 //到这里修改zf=1,另跳转实现
。。。。。。。。。。。。。。省略N句代码。。。。。。。。。。。。。。。
0040DC0C 61 popad
0040DC0D - E9 E47EFFFF jmp 00405AF6 //跳到OEP
00405AF6 2BC0 sub eax, eax //OEP,在这里dump程序
00405AF8 68 255B4000 push 00405B25 ; ASCII "PE_SPIN_v03"
00405AFD 50 push eax
00405AFE 50 push eax
00405AFF E8 6A030000 call 00405E6E ; jmp 到 kernel32.CreateMutexA
00405B04 E8 8F030000 call 00405E98 ; jmp 到 ntdll.RtlGetLastWin32Error
00405B09 3D B7000000 cmp eax, 0B7
00405B0E 75 21 jnz short 00405B31
dump后的程序可以正常运行,脱壳成功!
--------------------------------------------------------------------------------
【经验总结】
这个壳的难点应该是避开IAT加密吧~!由于是默认的加壳方式,所以没有stolen code。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于xxxxxx论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年01月17日 16:59:28
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- ShellListView控件显示的文件如何拖拽它 6645
- [原创]PeSpinv0.3脱壳 2377
- 菜鸟玩壳第1篇,请高手指点 4481
- 无聊脱一个壳玩玩,顺便找师傅一名 6919
看原图
赞赏
雪币:
留言: