程序概况
这个程序其实不应该叫做 Crackme,应该叫做 Patchme。因为这个程序并不是让人分析算法的,而是让你打补丁的。
打开程序,有两个按钮,一个是Aout,一个是Eit。点击 About按钮会出现一个弹窗,点击Exit按钮无反应
根据 Rules.txt 里的规则,要求我们添加代码。使得点击Exit按钮时会出现一个带有 'Yes" 和 "No" 的对话框,询问是否退出。如果点击 Yes 则退出程序,点击 No 则不退出。
程序分析
首先使用分析 Delphi 的神器 IDR 加载程序,可以看到只有一个事件
如果我们想要使程序符合规则,则必须再添加一个事件(我也不知道该怎么弄,只是添加了些代码使得符合要求)。
所以我们的目的有两个:
- 判断是否点击了 Exit 按钮
- 点击了 Exit 按钮之后程序要弹窗提示,根据点击的结果决定是否结束程序
首先要找到程序是如何判断点击了 About 按钮的,才能知道如何判断是否点击了 Exit 按钮。
使用 OD 载入程序,来到地址 43E270 处,下断点,点击About按钮,程序断了下来
执行到返回,进入上一层代码
在这块代码头部下断点,但是只要一点击 Ficken 按钮就会断下,所以在这里下断点不行,继续运行到返回,再次进入上一层代码
在地址 43053B 处下断点,点击 About 按钮,程序才断了下来
我们查看参数
可以看到参数为字符串 "About2"
然后程序根据各种比较判断是否要触发 About 事件
如果我们点击了 Exit 按钮,那么字符串就变成了 "Exit1"
所以我们可以根据此处的值判断是否点击了 Exit 按钮。
我的思路是,将 42F3C3 处的代码修改为 jmp xxxx,xxxx区域是我们自己的代码区域。每次点击按钮,程序都会跳转到我们的代码区域。
在我们的代码区域,首先判断字符串是否为 "Exit1",如果是则说明点击了 Exit 按钮,继续执行我们的代码;如果不是就跳转回去,继续程序自己的代码
0044E000 60 pushad
0044E001 68 EEEE4400 push 2defiler.0044EEEE ; ASCII "Exit1"
0044E006 FF73 08 push dword ptr ds:[ebx+0x8]
0044E009 E8 22977C77 call msvcrt.strcmp ; 是否是 Exit1 字符串
0044E00E 85C0 test eax,eax
0044E010 74 0F je short 2defiler.0044E021 ; 如果是,继续我们的代码
0044E012 83C4 08 add esp,0x8
0044E015 61 popad
0044E016 807B 2D 00 cmp byte ptr ds:[ebx+0x2D],0x0 ; 程序原本的代码,因为被我们修改了,所以在此处执行
0044E01A 74 61 je short 2defiler.0044E07D
0044E01C - E9 A813FEFF jmp 2defiler.0042F3C9 ; 跳转回原代码
0044E021 90 nop
0044E022 6A 04 push 0x4
0044E024 B9 8CE24300 mov ecx,2defiler.0043E28C
0044E029 BA F6EE4400 mov edx,2defiler.0044EEF6 ; ASCII "Do you fickbirne really want to quite?"
0044E02E A1 D0FB4300 mov eax,dword ptr ds:[0x43FBD0]
0044E033 8B00 mov eax,dword ptr ds:[eax] ; 2defiler.0042BE04
0044E035 E8 DAEBFEFF call <2defiler.Forms.TApplication.Messag>; 弹窗提示
0044E03A 83E8 06 sub eax,0x6
0044E03D 85C0 test eax,eax ; 根据返回值判断点击了 Yes 还是 No
0044E03F ^ 75 D1 jnz short 2defiler.0044E012 ; 点击了 No 跳转回去
0044E041 E8 38BE7B77 call msvcrt.exit ; 点击了 Yes 调用 Exit 函数
上面的代码就是我自己添加的代码,程序可以正常运行
在程序中添加代码,可以找空白的无用的区域,也可以自己手动增加区段,我就是自己又增加了一个区段。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。