新手破解练习Crackme160之041 - defiler.1 (添加点击事件)
作者要求的破解规则:
defiler's reversme no.1
The task of this little, lame reverseme is to add some code to it.
The code you have to add will be triggered by the 'Exit' menu and should
look like this:
A messagebox should appear asking the user "Do you fickbirne really want to quit?".
Its buttons should be 'Yes' and 'No'. If the user clicks 'Yes', simply exit the
program in a clean way, if the user clicks 'No' just do NOT exit the program
(it's up to you what will happen when the user clicks 'No').
Valid solutions are solutions with a tutorial explaining what you did,
explaining the code you added and the modified binaries.
Mail your solution to defiler@immortaldescendants.org
Valid solutions will be published on http://immortaldescendants.org ,
the first solution will be on http://defiler.cjb.net
thats it.. i hope i didn't forget any more unimportant stuff 😉
best regards,
defiler
翻译:
这个任务是要在这个小小的、蹩脚的“reversme”程序里添加一些代码。
你需要向“Exit”菜单中添加一些代码,需要实现这些功能:
一个消息框,询问用户“你真的想退出fickbirne吗?”。
有两个按钮“是”和“否”。如果用户点击“是”,则直接退出程序。如果用户点击“否”,则不要退出程序(当用户点击“否”时会发生什么,这取决于你)。
有效的解决方案是带有教程的解决方案,解释你所做的内容,解释你添加的代码和修改后的二进制文件。
将你的解决方案发送到defiler@immortaldescendants.org
有效的解决方案将发布在 http://immortaldescendants.org ,第一个解决方案将发布在http://defiler.cjb.net
就这些了,我希望我没有忘记任何其他不重要的事情。
祝你好运,
defiler
这个Delphi的程序, 需要自己添加代码实现菜单中的退出功能, IDR分析源码可知, about菜单的点击事件入口是0043E270
OD载入程序, ctrl+g定位到0043E270, 下好断点, F9运行程序, 点击about在断点处停下, 同时我们在这个方法的retn处0043E288也下断点, 因为我们接下来要知道是哪里调用了这个方法, 从而分析确定Exit的点击入口, F9继续运行, 程序弹出对话框, 点确定后停在了retn处, F8单步运行可返回到上一层调用处, 在这个调用的方法入口0042F3C0处也下个断点, F8单步运行又返回到更上一层, 这个方法就几行代码比较简单, 我们就在这个方法入口00430528也下一个断点, F9运行程序, 重新点菜单About, 每个断点都能正常停下来
接下来, 我们试一下Exit菜单, 是否也能成功停在这些断点处, 结果发现我们点菜单Fichen就会断点在0042F3C0处, 所以我们先把这个断点去掉, 重来, 这时能成功进入到子菜单了, 点击Exit, 成功在00430528处停下了, F8单步向下执行, 记住右侧寄存器红值变化, 多次测试About和Exit可发现, edx=2时是about点进来的, edx=3时是exit点进来的, edx的值在00430539处会被改掉, 前面又没有空行可以被利用, 所以我们只有在这一行作相关修改了, 加一个判断代码, , 因为这行代码前后都没有空位可用, 所以我们只能直接跳到程序最后面的可用空位来操作了, 修改如下:
将00430539改为call 0043E4C0(程序后面000000...的地方都可以利用, 可自行决定用哪个地址) 注意, 这里不能改为jmp, 因为程序还需要执行下面的代码, 如果改为jmp还需要保证程序的堆栈平衡问题, 会变得更复制, 所以, call就简单了, 程序自己会返回来, 不需要考虑平衡问题了, 改完这行, 实现受影响的代码是两行, 所以我们需要把这两行补回去, 在新方法中添加
00430539 |. 8B10 mov edx,dword ptr ds:[eax] ; defiler_.0042BE04
0043053B |. FF52 40 call dword ptr ds:[edx+0x40] ; defiler_.0042F3C0
接下来, 来到0043E4C0处, 开始我们的判断之旅, 代码如下:
0043E4C0 |$ 83FA 03 cmp edx,0x3
0043E4C3 |. 8B10 mov edx,dword ptr ds:[eax] ; defiler_.0042BE04
0043E4C5 |. 75 0A jnz short defiler_.0043E4D1
0043E4C7 |. C780 80000000>mov dword ptr ds:[eax+0x80],defiler_.0043E4D5
0043E4D1 |> FF52 40 call dword ptr ds:[edx+0x40] ; defiler_.0042F3C0
0043E4D4 \. C3 retn
0043E4D5 . 6A 24 push 0x24 ; 这里与about不同, 0x40是一个确定, 0x24是确定与取消, 可以百度查看弹框函数入参
0043E4D7 . B9 FAE44300 mov ecx,defiler_.0043E4FA ; title
0043E4DC . BA 02E54300 mov edx,defiler_.0043E502 ; message
0043E4E1 . A1 D0FB4300 mov eax,dword ptr ds:[0x43FBD0]
0043E4E6 . 8B00 mov eax,dword ptr ds:[eax]
0043E4E8 . E8 27E7FFFF call defiler_.0043CC14
0043E4ED . 83F8 07 cmp eax,0x7 ; 0x6确定, 0x7取消
0043E4F0 . 74 05 je short defiler_.0043E4F7
0043E4F2 . E8 6253FCFF call defiler_.00403859 ; 确定后调用退出方法
0043E4F7 > C3 retn
0043E4F8 00 db 00
0043E4F9 00 db 00
0043E4FA . 45 78 69 74 0>ascii "Exit",0 ; 标题定义
0043E4FF 00 db 00
0043E500 00 db 00
0043E501 00 db 00
0043E502 . 44 6F 20 79 6>ascii "Do you fickbirne" ; 内容定义
0043E512 . 20 72 65 61 6>ascii " really want to "
0043E522 . 71 75 69 74 3>ascii "quit?",0
刚改完代码会很乱, 需要右键删除分析再重新分析, 退出程序的方法是关闭程序时OD会停在retn, 这时可以在堆栈界面(k)看到调用方法00403859
保存所有修改~ 测试一下exit事件弹框正常, 关闭正常
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号