1.察看源代码找到 EnableMenuItem 要害
4011E3
004011E3 6A 01 PUSH 1 ; |uEnable
004011E5 . 68 459C0000 PUSH 9C45 ; |ItemID = 9C45 (40005.)
004011EA . 50 PUSH EAX ; |hMenu
004011EB . FF15 9C404000 CALL EnableMenuItem ; \EnableMenuItem
模型
EnableMenuItem(HMENU hMenu,UINT uIDEnableMenuItem,UNIT uEnable)
uMenu 菜单句柄
uIDMenuItem 菜单句柄的标识符
uEnable 控制标志
0 允许
1 灰色,禁用
2 有色,禁用uEnable 控制标志
注意由此发现。汇编代码中出现的内容恰好与模型中出现的内容顺序相反.
2.破解方法
已知
004011E3 6A 01 PUSH 1 ; |uEnable
uEnable=1
uEnable 控制标志
0 允许
1 灰色,禁用
2 有色,禁用
把
PUSH 1 改成 PUSH 0 即可
3.破解
i. 爆破 4011e3 PUSH 0 复制到可执行文件保存即可.
ii.SMC
1.UPX JMP OEP SMC 法
JMP OEP
0040BCCE 61 POPAD
0040BCCF - E9 3C55FFFF JMP UPX加壳.00401210 ; OEP
0040BCD4 0000 ADD BYTE PTR DS:[EAX],AL
改成
0040BCCF /EB 00 JMP SHORT UPX+OEP_.0040BCD1
0040BCD1 \66:C705 E311400>MOV WORD PTR DS:[4011E3],6A ; 4011e3 处写上(字) 006a ~SMC补丁的核心代码
0040BCDA - E9 3155FFFF JMP UPX+OEP_.00401210 ; 恢复 OEP
0040BCDF 90 NOP
0040BCE0 0000 ADD BYTE PTR DS:[EAX],AL
2.UPX 解码中断法
4011e3 内存访问短点
F9 注意当 断点显示 4011e3 内存中断是住手.
F8 一下
Ctrl+G 4011e3
OK 代码刚好还原
双击 寄存器 EIP 返回我们中断的代码行
0040BC41 8907 MOV DWORD PTR DS:[EDI],EAX ; 断点显示 4011e3 内存中断
0040BC43 83C7 04 ADD EDI,4 ; F8 一下
0040BC46 83E9 04 SUB ECX,4
0040BC49 ^ 77 F1 JA SHORT UPX加壳.0040BC3C
0040BC4B 01CF ADD EDI,ECX
0040BC4D ^ E9 4CFFFFFF JMP UPX加壳.0040BB9E
0040BC52 5E POP ESI
Ctrl+G 4011e3
004011DD FF15 98404000 CALL DWORD PTR DS:[404098]
004011E3 6A 01 PUSH 1 ; OK 代码刚好还原
004011E5 68 11000000 PUSH 11
我看重
0040BC4D ^ E9 4CFFFFFF JMP UPX加壳.0040BB9E
让它跳到 0040BCD4
变成
0040BC4D ^ E9 4CFFFFFF JMP UPX加壳.0040BCD4
下面是SMC补丁代码
0040BCD4 66:C705 E311400>MOV WORD PTR DS:[4011E3],6A
最后返回
0040BCDD ^ E9 BCFEFFFF JMP UPX加壳.0040BB9E
让它正常解码
保存 EXE
我还有一个方法是
再我们让 UPX 解码段在解密
X 段时 SMC
X 段为 给4011e3 解码的代码段
不过比较复杂,本人善在理论的实际实现阶段,成功是成功了,可惜我记不起来了,我又得再研究一下,成熟后公布.
ASPack
没想到我居然...
6.9日以前我为高考奋斗...
没想到我居然 手动跟踪 ASPack 壳都不会了,14次跟丢,实在是丢人啊~
好我们手动跟踪
0040A3AF 61 POPAD
0040A3B0 75 08 JNZ SHORT eq.0040A3BA
0040A3B2 B8 01000000 MOV EAX,1
0040A3B7 C2 0C00 RETN 0C
0040A3BA 68 10124000 PUSH eq.00401210 ; 肯定和 OEP 有关西啦,到时改成 SMC地址吧~
0040A3BF C3 RETN
手动跟踪不难发现 ASpack 返回 OEP 不是象UPX通过 一个 JMp 完成的,是通过一个 retn 返回实现的,其实我感决都已样拉,不知那位汇编语言深厚 的大侠来指点 Retn 和 JMP 有什么不同啦~
自此我们玩个花样
topo 增加一个64字节的区段(我得在404425这)
现把 SMC 写好
00404425 66:C705 E311400>MOV WORD PTR DS:[4011E3],6A ; 修改 4011e3 push 1 (016a) 为 push 0 (006a)
0040442E - E9 DDCDFFFF JMP add-ASPA.00401210 ; 返回 OEP
00404433 90 NOP
今天太晚了,我先停笔了~
明天待续~
附件:smc.rar
[课程]FART 脱壳王!加量不加价!FART作者讲授!