前言:看到本论坛没有这类的脱文 我就发一个吧 (留个纪念) 为以后忘了或者学习手脱的朋友
我这里已windows 64位操作系统手脱 (大家可以在32位或xp下脱吧) 懒得点可以直接用脚本或脱壳机脱
查客:MoleBox V2.3X -> MoleStudio.com [Overlay] *
拖进od:点否
004E3BD3 > E8 00000000 call 多记忆桌.004E3BD8 //入口点
004E3BD8 60 pushad
004E3BD9 E8 4F000000 call 多记忆桌.004E3C2D //这里用ESP定律
004E3BDE ^ 74 A9 je short 多记忆桌.004E3B89
004E3BE0 44 inc esp
004E3BE1 27 daa
004E3BE2 815A A1 70BAB37>sbb dword ptr ds:[edx-0x5F],0x7EB3BA70
004E3BE9 1E push ds
004E3BEA 50 push eax
004E3BEB 4C dec esp
004E3BEC FFEE jmp far esi ; 非法使用寄存器
004E3BEE 6F outs dx,dword ptr es:[edi]
004E3BEF ^ 72 CF jb short 多记忆桌.004E3BC0
=======================万恶的分割线=============================================
跟随到数据窗口 下断点:硬件访问---word 在下一个bp VirtualProtect
运行几次来到图1所示
图1:
最佳返回时机 取消断点 注意(不要取消硬件断点 取消的是bp VirtualProtect这个断点) 64位好像不支持 ATL+F9
不过还是习惯了ATL+F9返回 64位下在是SHIFT+F9返回到用户代码 在F8单步一下
004EB645 51 push ecx
004EB646 8B0D 5CC14F00 mov ecx,dword ptr ds:[0x4FC15C]
004EB64C E8 13650000 call 多记忆桌.004F1B64
004EB651 8945 F8 mov dword ptr ss:[ebp-0x8],eax
004EB654 837D F8 00 cmp dword ptr ss:[ebp-0x8],0x0
004EB658 74 45 je short 多记忆桌.004EB69F ///这里就是前辈所说的魔术跳 JUMP 该JMP
004EB65A 8D55 F0 lea edx,dword ptr ss:[ebp-0x10]
004EB65D 52 push edx
004EB65E 6A 04 push 0x4
004EB660 6A 04 push 0x4
004EB662 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004EB665 50 push eax
004EB666 FF15 40784F00 call dword ptr ds:[0x4F7840] ; kernel32.VirtualProtect 这个断点怎么来的 等下就告诉你
004EB66C 85C0 test eax,eax
004EB66E 75 0A jnz short 多记忆桌.004EB67A
004EB670 B9 0B0000EF mov ecx,0xEF00000B
004EB675 E8 9D2F0000 call 多记忆桌.004EE617
004EB67A 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
004EB67D 8B55 F8 mov edx,dword ptr ss:[ebp-0x8]
004EB680 8B02 mov eax,dword ptr ds:[edx]
004EB682 8901 mov dword ptr ds:[ecx],eax //这里改NOP
004EB684 8D4D F4 lea ecx,dword ptr ss:[ebp-0xC]
004EB687 51 push ecx
004EB688 8B55 F0 mov edx,dword ptr ss:[ebp-0x10]
004EB68B 52 push edx
这两者 二选一
=======================万恶的分割线=============================================
004EB67D 8B55 F8 mov edx,dword ptr ss:[ebp-0x8]
004EB680 8B02 mov eax,dword ptr ds:[edx]
004EB682 90 nop //这里NOP掉 F9运行
004EB683 90 nop
004EB684 8D4D F4 lea ecx,dword ptr ss:[ebp-0xC]
004EB687 51 push ecx
=======================万恶的分割线=============================================
004E37B1 58 pop eax ; 多记忆桌.004E3BD8
004E37B2 58 pop eax
004E37B3 FFD0 call eax //F7进CALL 到达OEP
004E37B5 E8 F5CB0000 call 多记忆桌.004F03AF
004E37BA CC int3
004E37BB CC int3
004E37BC CC int3
004E37BD CC int3
004E37BE CC int3
004E37BF CC int3
图2:
此时用LordPE修正大小--完整转存,再用ImpREC FINAL 1.7汉化版 修复一下
图3:
无效函数 剪切 转存 程序成功运行
=======================万恶的分割线=============================================
VirtualProtect 这个断点怎么来的进行深入追踪
重载程序:
004E3BD3 > E8 00000000 call 多记忆桌.004E3BD8
004E3BD8 60 pushad
004E3BD9 E8 4F000000 call 多记忆桌.004E3C2D //ESP定律
004E3BDE ^ 74 A9 je short 多记忆桌.004E3B89
004E3BE0 44 inc esp
004E3BE1 27 daa
004E3BE2 815A A1 70BAB37>sbb dword ptr ds:[edx-0x5F],0x7EB3BA70
F9运行
004E37B1 58 pop eax
004E37B2 58 pop eax
004E37B3 FFD0 call eax //F7进call 到达OEP
004E37B5 E8 F5CB0000 call 多记忆桌.004F03AF
004E37BA CC int3
004E37BB CC int3
004E37BC CC int3
004E37BD CC int3
=======================万恶的分割线=============================================
到达OEP 此时用LordPE修正大小--完整转存,再用ImpREC FINAL 1.7汉化版 修复一下 发现有19个无效指针
图4:
此时发现有很多无效指针 点中第一个 反汇编-十进制查看
000711E4+基址00400000=004711E4
重载程序 内存转到crtl+G 004F1A70下断 硬件执行 shift+F9运行
图5:
运行9次来到这里 此时的IAP还未加密 F8单步走下去
=======================万恶的分割线=============================================
004EB645 51 push ecx ; kernel32.UnlockFile //来到这里 多么熟悉的界面
004EB646 8B0D 5CC14F00 mov ecx,dword ptr ds:[0x4FC15C]
004EB64C E8 13650000 call 多记忆桌.004F1B64
004EB651 8945 F8 mov dword ptr ss:[ebp-0x8],eax
004EB654 837D F8 00 cmp dword ptr ss:[ebp-0x8],0x0
004EB658 74 45 je short 多记忆桌.004EB69F //这里修改JMP 前辈们大牛们俗称的魔术跳
004EB65A 8D55 F0 lea edx,dword ptr ss:[ebp-0x10]
004EB65D 52 push edx
004EB65E 6A 04 push 0x4
004EB660 6A 04 push 0x4
004EB662 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004EB665 50 push eax
004EB666 FF15 40784F00 call dword ptr ds:[0x4F7840] ; kernel32.VirtualProtect 就是这个断点 由来的
004EB66C 85C0 test eax,eax
004EB66E 75 0A jnz short 多记忆桌.004EB67A
004EB670 B9 0B0000EF mov ecx,0xEF00000B
004EB675 E8 9D2F0000 call 多记忆桌.004EE617
004EB67A 8B4D 08 mov ecx,dword ptr ss:[ebp+0x8]
004EB67D 8B55 F8 mov edx,dword ptr ss:[ebp-0x8]
004EB680 8B02 mov eax,dword ptr ds:[edx]
004EB682 8901 mov dword ptr ds:[ecx],eax //这里NOP
004EB684 8D4D F4 lea ecx,dword ptr ss:[ebp-0xC]
004EB687 51 push ecx
004EB688 8B55 F0 mov edx,dword ptr ss:[ebp-0x10]
004EB68B 52 push edx
004EB68C 6A 04 push 0x4
004EB68E 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
004EB691 50 push eax
004EB692 FF15 40784F00 call dword ptr ds:[0x4F7840] ; kernel32.VirtualProtect
004EB698 C745 FC 0100000>mov dword ptr ss:[ebp-0x4],0x1
004EB69F 8B45 FC mov eax,dword ptr ss:[ebp-0x4]
004EB6A2 8BE5 mov esp,ebp
004EB6A4 5D pop ebp
004EB6A5 C3 retn
二选一
=======================万恶的分割线=============================================
取消硬件断点
ctrl+S 命令序列
pop eax
pop eax
call eax
004E37B1 58 pop eax //F2下断 SHIft+F9运行
004E37B2 58 pop eax
004E37B3 FFD0 call eax //F7进CALL 到达OEP
004E37B5 E8 F5CB0000 call 多记忆桌.004F03AF
004E37BA CC int3
=======================万恶的分割线=============================================
第一:ESP定律
第二:下bp VirtualProtect断点
第三:查找命令序列:
mov ecx,dword ptr ss:[ebp+0x8]
mov edx,dword ptr ss:[ebp-0x8]
mov eax,dword ptr ds:[edx]
mov dword ptr ds:[ecx],eax
或 二进制查找:8B 4D 08 8B 55 F8 8B 02 89 01
处理 magic jump
然后就可以脱壳了!!呵呵,对这个壳最快速的方法了
|