本帖最后由 ximo 于 2014-10-23 20:38 编辑
OD载入后随便输入用户名注册码出现信息框
点确定后在MessageBoxA下个断点
然后再次点击注册后成功断下
看了下堆栈窗口如图点击右键在调试窗口中跟随
如图然后来到这个CALL入口
然后跟进去分析发现关键跳转
在此处NOP即可
不过该CM的关键代码貌似是创建内存写入的 不能直接改着玩
然后继续在MessageBoxA下断回朔
来到
然后在CALL EAX前面00402868写个JMP根据EAX的值+偏移计算出补丁地址
保存两个nop即可
如代码
[Asm] 纯文本查看 复制代码 00408E21 60 pushad 入栈
00408E22 83E8 49 sub eax,0x49 根据偏移算出需要补丁的地址
00408E25 66:C700 9090 mov word ptr ds:[eax],0x9090 写入nop
00408E2A 61 popad 出栈
00408E2B 8D5424 3C lea edx,dword ptr ss:[esp+0x3C] 还原写JMP之前的代码1
00408E2F 52 push edx 还原写JMP之前的代码2
00408E30 ^ E9 389AFFFF jmp CrackMe.0040286D 跳回下一句继续执行
但写好补丁后小编发现该内存不可写的问题 于是在VirtualAlloc下断分析 回朔后如图
意思是创建内存的时候他传参数是可写的
那就只有一个可能了
他是创建内存后直接修改内存属性来实现内存不可写的
于是小编继续在VirtualProtect 下断回朔 如图
现在想想总算是找到问题所在
然后看了下寄存器 EDX的值为20 可读可执行 不可写
挺蛋疼的
于是在00401A2C push edx这里写HOOK 跳到空白地址改寄存器
代码:
[Asm] 纯文本查看 复制代码 00408E3F BA 40000000 mov edx,0x40 保存edx为40 可读可写可执行
00408E44 52 push edx 还原代码1
00408E45 51 push ecx 还原代码2
00408E46 8B0E mov ecx,dword ptr ds:[esi] 还原代码3
00408E48 51 push ecx 还原代码4
00408E49 ^ E9 E38BFFFF jmp CrackMe.00401A31 跳回继续执行
然后保存文件后输入随机账号注册码 出现注册成功提示 如图
CrackMe1.rar
(77.87 KB, 下载次数: 55)
|