本文主要是介绍160个Crackme之004 ajj.1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
作者:ajj
难度:★★
保护方式:Name/Serial(Delphi)
运行程序
程序没有确定按钮,所以直接丢到OD中分析。
虽然没有确定按钮,但是有输入框,所以应该调用了GetItemTextA,所以只要在OD中给这个API下断点就可以分析了,可是这个程序是Delphi程序,它的API并不是GetItemTextA,所以暂时放弃这个想法。
在OD中通过中文搜索引擎的智能搜索查找字符串,发现有用的字符串"恭喜恭喜!注册成功"
可问题是这个程序没有确定按钮,如何触发到代码?
OD对Delphi实在有点有心无力,我们还是用Delphi专门的反编译工具DarK吧,打开DarK并将程序打开,点击开始处理,处理完成后会进行一些拓展处理,一路点“是”。
分析好以后点击窗体,这个窗体包含了程序所有的窗口
可以看到有一个TForm1窗口,它就是程序的主窗口,双击它会弹出两个窗口,一个是模拟出来的主窗口,还有一个是控件绑定信息窗口,这个窗口包含了所有的控件信息,通过鼠标在模拟的主窗口上面移动,控件绑定信息窗口会选中当前控件。
Label1-Label6和Image1都是不可交互控件,所以重点看Edit1、Edit2和Panel1。
选中Edit1控件,可以看到右边的子窗口有一个成员OnKeyUp,当键盘按键弹起时会调用KeyUp函数。
选中Edit2控件,跟Edit1类似,不过它调用的是chkcode函数
选中Panel1控件,可以看到成员OnClick绑定的函数是Panel1Click,OnDblClick绑定的函数是Panel1DblClick,也就是说单击图片会调用Panel1Click,双击图片会调用Panel1DblClick。
回到DarK的主窗口点击“过程”,可以看到所有关联函数的RVA
通过这几个函数的RVA,在OD中找到代码,打断点。
运行程序后首先调试KeyUp函数,当Edit1处于激活状态时,键盘按键弹起时会触发这个函数。
输入tutucoo,当输入完第1个t时,程序断下,位于0x457e4c,这个函数没有核心算法,接着分析Edit2
Edit2绑定函数位于0x457c40,当Edit2中有任意输入时断下。
分析到0x457d2f处时,可以看到字符串"黑头Sun Bird12dseloffc-012-OK",猜测这个字符串就是注册码。
这个函数先分析到这,接着分析Panel1Click,它位于0x457fb8,当鼠标点击Panel时会触发。
这个函数的末尾可以看到注册成功的字样,因此可以认为这个函数是最终的比对函数。
根据目前分析到的信息,可以作这样的猜测:
1.注册码是否为“黑头Sun Bird12dseloffc-012-OK”(用户名为7位的情况)
2.内存某处是否是0x85
此时我们已经知道了注册码,那0x85是在哪里设置的呢?先不急,分析完最后一个函数,也许这个问题就解决了。
最后一个函数Panel1DblClick,在Panel上双击触发此函数,程序断在0x457e7c处。
这个函数会将esi+0x30c覆盖为0x85,不过前提是esi+0x30c保存的是0x3e。
在[ESI+0x30C]上右键点击查找参考->地址常量,打开常量窗口,找到赋值3E的位置下断点。
我们跳转过去发现赋值3E的位置位于Edit2函数中,之前分析单步时没有走到这一步直接跳过去了,所以没注意。可以猜测,在Edit2中输入注册码时这个函数会一直调用,直到注册码为正确。
调试,输入用户名:tutucoo,正确的注册码:黑头Sun Bird12dseloffc-012-OKtutucoo,程序断下,成功赋值3E。
总结下这个程序的算法:
1.任意输入一个用户名
2.根据用户名输入正确的注册码,程序会在这一步循环检测注册码是否正确,如果是正确的,将3E存储到esi+0x30c
3.用户双击Panel,程序会检测此时esi+0x30c处的值是否是3E,如果是3E,将esi+0x30c赋值为0x85
4.用户单击Panel,程序会检测用户名、注册码以及esi+0x30c处是否为0x85
以上几步全部顺利通过程序就被破解了
这篇关于160个Crackme之004 ajj.1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!