有一次要把一份Delphi的代码转为C++Builder的。因为代码比较多,手工一条条地转很是费劲,于是在网上找了一款叫Delphi to C++Builder的小软件,该软件存在一些问题,转换后的代码有一些错误,需要手工核对和纠正。不过,使用这个软件还是减轻了不少重复的工作。今天,打开这个软件时却提示:

软件到期了,郁闷。这小软件价值39.50美元,俺是个穷人,于是就产生Crack it的念头。
OD载入,打开Windows窗口,都是些TEdit,TButton……据此判断该软件应该是用Delphi或C++Builder开发的。随便输入一个错误的注册码后提示:

可惜这个消息框不是通过调用MessageBox产生的,不然就可以直接bp MessageBoxA切入到核心代码了。Delphi/C++Builder程序中常使用vcl的函数ShowMessage来显示一个消息提示对话框。这种对话框是通过调用CreateWindowEx函数创建的,比如本例。但是在这个程序中对CreateWindowExA下断点会受到Phonetic、ImeStatusPHON等控件的干扰它们老是在那里不停地创建与销毁。    
还是不管这个ShowMessage了,我们把目标转向那个Register按钮的事件处理函数。(如果非要去断ShowMessage也是可以,对字符串"Invalid register"下内存访问断点,然后就可以人肉出来了。)常见的WndProc 202消息断点获取按钮的单击事件处理函数对Delphi/C++Builder程序并不是所有情况都有效。比如这个小软件就拦截不到。庆幸的是:Delphi/C++Builder中有个特征串可以很容易定位按钮的单击事件处理函数,就是:
FF93 20010000 call dword ptr [ebx+120]
现在只要把所有与它相同的命令都下个断点就可以了。下好断点后,随便输入一个注册码,点Register按钮,命中断点:
 
按F7单步步入,就进入了Register按钮的事件处理函数:
 
找到入口,一切就变得容易多了,一步步跟下来,很容易发现注册码验证的关键位置:

将je 004079D2直接用nop填充就爆破了。是不是太简单了。然而更意外的这个小软件居然用明文比较!跟随call 00472F4:
 
寄存器:
 
call 0042A674是调用一个字符串比较函数,用IDA Pro可以看到分析出其函数名称。crazychin是输入的错误注册码。ovmfSdsilo就是我们要找的正确的注册码。重新运行程序,输入正确的注册码,弹出期待已久的消息框:
 
注册后,就不能再次注册了,可以进注册表找到:
[HKEY_LOCAL_MACHINE\SOFTWARE\ahao's softwares\wenku\d2c\smtp]
把registed的值数据置0,就可以重新注册了。
至此,一个小软件的破解告捷。(ps:技术太烂了,只能拿这些软柿子捏,)。

上传的附件 d2c.rar