接下来我们分析Canasta 5.0这个CrackMe。
Delphi是使用Pascal语言
该CrackMe属于那种OK按钮开始不可用,当用户输入的用户名与序列号相匹配的时候才可以单击的例子。
我们首先安装程序,然后用OD打开canasta.exe,程序停在:
之后运行程序,打开About对话框,之后单击Enter License按钮:
提示说只有当用户输入的用户名和序列号组合正确时,OK按钮才会变为可用。这样我们就没办法通过在GetDlgItemTextA等获取用户输入的文本的函数下断点的方式,找到程序中代码输入的位置。
但是这也说明程序会实时读取输入框中的License Name [type exactly as specified]和License Key [6 digits],并进行比较是否正确。所以我们可以换一种思路,直接在程序的内存中查找我们输入的License Key,先输入147:
之后打开内存映射:
右键->查找或者快捷键Ctrl+B:
找到输入的License在内存中的位置024B5F65,内存中的分配的地址每次运行程序的时候都是不一样的:
在数据窗口中按Ctrl+G跟随位置024B5F65:
找到输入的License:
同时,我们把输入的License改为1472:
数据窗口中的字符串:
接下来我们在024B5F65开始的连续六个字节内存单元设置一个内存访问断点:
接下来再输入一个字符‘5’:
程序停在了我们设的内存访问断点处:
004029A1 |. F3:A5 rep movs dword ptr es:[edi],dword ptr ds:[esi]
rep:重复执行
把esi指向的值逐双字复制给edi指向的值,esi指向的024AD189缓冲区,而edi指向的值就是输入的License所在的内存缓冲区024B5F65。
执行完复制之后:
缓冲区024AD189中的值也是:
这个函数的作用就是保存输入的License,下面就是retn,所以我们继续运行程序:
程序停在
004B3E9C |. F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi]
这一行的代码把esi指向输入的License所在的内存缓冲区024B5F65的值,逐字节复制给edi指向的0019E160缓冲区:
运行完之后0019E160缓冲区得到了License的值
之后我们就跟踪0019E160缓冲区,内存断点只能用一个,这里可以新设置一个硬件断点:
之后程序就会停在
004031C4 |. 8B1A |mov ebx,dword ptr ds:[edx]
这里的从两个缓冲区从0019E15F读取输入的License:14725,从0019E05F读取计算得到的License:151870,之后把他们进行比较,
此时的License是不相等的,所以跳转成立。
也就是说License Name为“qaz”,对应的输入License Key是“151870”
把这一对License输入软件:
成功!
另外这个软件也可以利用我们每按下一个键就发产生WM_KEYUP消息,通过OD捕捉这个发送给软件的消息来确定我们的输入Key的位置。