[原创]菜鸟脱壳心得--PeShield v0.25
发表于:
2009-3-23 23:36
7111
[原创]菜鸟脱壳心得--PeShield v0.25
【文章标题】: 菜鸟脱壳--PeShield v0.25
【文章作者】: zyqex
【软件名称】: 记事本
【加壳方式】: PeShield v0.25
【使用工具】: od
【操作平台】: xp2
【作者声明】: 菜鸟的一点心得,失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
【一点啰嗦话】:
此文是我学二哥的《手动脱壳进阶第六篇PE-SHiELD V0.25 》后的自身探讨的脱壳方法,贻笑大方了!(一个老壳,
壳的简介就不说了,如有需要请参看附件里二哥的脱文)
【开始】
异常设置:只忽略“在kernel32中的内存访问异常”。
od载入加壳记事本,断在:
0040D000 N> 60 pushad (^_^ ESP定律? 行不通!)
0040D001 E8 2B000000 call 0040D031
0040D006 0D 0A0D0A0D or eax, 0D0A0D0A
F9运行后经过两次shilft+F9程序跑起来,所以我们重来(用到一点最后一次异常法的知识),
来到最后一次异常处:
0040D4D7 8DC0 lea eax, eax ; 非法使用寄存器
0040D4D9 CD20 648F038B vxdjump 8B038F64
0040D4DF ^ E0 8B loopdne short 0040D46C
此时堆栈窗口显示:
0013FF9C 0013FFE0 指向下一个 SEH 记录的指针
0013FFA0 0040D4AC SE处理程序 (地址0040D4AC下断)
bp 0040D4AC,F9运行
断在:
0040D4AC 8B4424 0C mov eax, dword ptr [esp+C] (CONTEXT结构地址)
0040D4B0 8380 B8000000 0>add dword ptr [eax+B8], 4 (改变CONTEXT.regEip的值)
0040D4B7 53 push ebx
0040D4B8 33DB xor ebx, ebx
0040D4BA 8958 04 mov dword ptr [eax+4], ebx
0040D4BD 8958 08 mov dword ptr [eax+8], ebx
0040D4C0 C740 18 5501000>mov dword ptr [eax+18], 155
0040D4C7 8958 0C mov dword ptr [eax+C], ebx
0040D4CA 8958 10 mov dword ptr [eax+10], ebx
0040D4CD 5B pop ebx
0040D4CE 33C0 xor eax, eax
0040D4D0 C3 retn
注意0040D4B0 8380 B8000000 0>add dword ptr [eax+B8], 4 这一行,程序将跳到[eax+B8]这个地址
去执行(当然不是马上)。
所以在这句步过后,d eax+0b8
bp [eax+0b8] ([eax+0b8]地址处下断)
F9运行,断下:
0040D4DB 64:8F03 pop dword ptr fs:[ebx] ; 0013FFE0
0040D4DE 8BE0 mov esp, eax
接下来用插件清一下花指令,F8继续,直到
0040D6BA 8D8D 1E080000 lea ecx, dword ptr [ebp+81E] ; Thread function address
0040D6C0 90 nop
0040D6C1 90 nop
0040D6C2 90 nop
0040D6C3 52 push edx
0040D6C4 90 nop
0040D6C5 90 nop
0040D6C6 90 nop
0040D6C7 6A 00 push 0
0040D6C9 90 nop
0040D6CA 90 nop
0040D6CB 90 nop
0040D6CC 83C2 04 add edx, 4
0040D6CF 90 nop
0040D6D0 90 nop
0040D6D1 90 nop
0040D6D2 52 push edx
0040D6D3 90 nop
0040D6D4 90 nop
0040D6D5 90 nop
0040D6D6 51 push ecx ; Thread function address
0040D6D7 90 nop
0040D6D8 90 nop
0040D6D9 90 nop
0040D6DA 6A 00 push 0
0040D6DC 90 nop
0040D6DD 90 nop
0040D6DE 90 nop
0040D6DF 6A 00 push 0
0040D6E1 90 nop
0040D6E2 90 nop
0040D6E3 90 nop
0040D6E4 8B85 6C110000 mov eax, dword ptr [ebp+116C] ; kernel32.CreateThread
0040D6EA 90 nop
0040D6EB 90 nop
0040D6EC 90 nop
0040D6ED E8 C9060000 call 0040DDBB (这里可跟进去看看,它会调用CreateThread函数)
(在脱壳脚本里我将CreateThread选为断点函数)
此时我们下断 bp ecx
如果再继续单步走,不久会进入系统领空,程序会跑起来,我为什么选择在这里下断呢?
因为我注意到了0040D6ED处将间接调用CreateThread函数,这个函数会创建一个线程,并跑到线程函数地址
处去执行。
断在此:
0040D81E BD 00D04000 mov ebp, offset <模块入口点>
0040D823 8DB5 C5100000 lea esi, dword ptr [ebp+10C5]
0040D829 83EC 20 sub esp, 20
下面就单步走吧,此过程中会遇到一些循环(要打断循环往下走,不然很是浪费时间),跳出循环的方法具体看
二哥的相关教程吧(^_^,偷下懒)
到此处:
0040DC00 894424 1C mov dword ptr [esp+1C], eax
看到寄存器窗口显示:EAX为004010CC ,不就是熟悉的记事本OEP吗?呵呵。
继续往下走,一小会到这里
0040DC3B FFE0 jmp eax ; eax=004010CC,脱壳脚本中我将此处选为特征性命令
够直接了吧!
F8步过后:
直接用插件dump后程序可以运行。
-------------------------------------------------
下面是针对此过程写的脱壳脚本:
//StrongOD 设置:全打勾(省点事吧,运行完脚本后不要忘记清除skip some exception这项哦,不然以后调试
//程序时可能会异常断不下来)
//异常设置:忽略所有异常
var temp
gpa "CreateThread","Kernel32.dll"
bp $RESULT+2 //加2是因为直接断不下来
run
bc $RESULT+2
bp ecx //此时ecx就是线程函数地址
mov temp,ecx
run
bc temp
find eip, #FFE0# //搜索jmp eax命令
go $RESULT
sto
MSG "Get to OEP ! ^_^"
经测试其他用PeShield v0.25加壳程序也适用(不排除存在bug 的可能性^_^)
-------------------------------------------------------------------------------
【结束】
--------------------------------------------------------------------------------
【经验总结】
再一点啰嗦,^_^,文章真是不好写 ,向论坛里无私奉献的所有朋友致敬!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: