Crackme041

程序概况

这个程序其实不应该叫做 Crackme,应该叫做 Patchme。因为这个程序并不是让人分析算法的,而是让你打补丁的。

打开程序,有两个按钮,一个是Aout,一个是Eit。点击 About按钮会出现一个弹窗,点击Exit按钮无反应

根据 Rules.txt 里的规则,要求我们添加代码。使得点击Exit按钮时会出现一个带有 'Yes" 和 "No" 的对话框,询问是否退出。如果点击 Yes 则退出程序,点击 No 则不退出。

程序分析

首先使用分析 Delphi 的神器 IDR 加载程序,可以看到只有一个事件

如果我们想要使程序符合规则,则必须再添加一个事件(我也不知道该怎么弄,只是添加了些代码使得符合要求)。

所以我们的目的有两个:

  1. 判断是否点击了 Exit 按钮
  2. 点击了 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 函数

上面的代码就是我自己添加的代码,程序可以正常运行

在程序中添加代码,可以找空白的无用的区域,也可以自己手动增加区段,我就是自己又增加了一个区段。

相关文件在我的 Github

你可能感兴趣的:(windows)