本帖最后由 xiaoyu2032 于 2022-4-20 16:11 编辑
输入错误有错误弹窗提示,因此优先考虑在弹窗下断点,在CODE区按Ctrl+N查找当前模块中的名称,找到MessageBoxW函数,右键“在每个参考上设置断点”,这样可以下到3个断点。
运行,输入错误信息,登录,断在4036F8位置,该处即为错误弹窗。(另外两个断点一个是注册按钮的弹窗,一个是参数错误的弹窗)
一直往上翻,翻到4033E0位置,可以确定为关键函数的入口地址。
关键函数代码段很长,F8单步跟踪走一遍,应该能发现下图位置的代码在对字符串进行比较。
比较的内容看寄存器区域可以发现是两个长度为40的字符串,其中一个是随输入用户名变化而变化的,另一个是不变的。
初步猜测是sha1加密字符串,将用户名“111”做sha1加密,发现和其中一条一致,因此可以确定为sha1加密比较。
字符串搜索:常用字符串搜索大法,OD中使用智能搜索,找不到任何有效的提示字符串,但是用搜索UNICODE,可以搜索到“不可以为空”、“不可以空”、“为了美观,未实现”等提示字符串,意外的可以发现其中还有一个字符串是“wangzhiyu52pojie”,拿去sha1一下,发现命中,这个就是正确的用户名了。
其实在程序运行后,在内存中搜索“you are wrong”和“you Success”[UNICODE]也是能找到的,但是尝试过在内存中设断点,不大好用,断的次数太多,找不到位置(可能我没掌握技巧)。
以上是比较容易分析出来的结果,接下来的验证过程,由于程序里面设计了反反复复好多重的验证,F8单步跟踪很容易迷失方向,因此需要多找一些参照点来进行定位,包括错误提示代码段、正确提示代码段,这样才便于判断哪些是关键跳转,避免改错到程序异常。
错误弹窗代码段前面已经找到了,正确提示代码段怎么找呢?
根据作者给出的成功界面,成功时界面上的按钮和输入框等控件都不显示了,只显示“you Success”字符串,因此成功时程序应该是对这些字符串进行了隐藏操作(还有一种可能是对主界面进行了隐藏操作,然后另外显示一个界面)。
因此可以找个工具来查看一下程序的资源,ResScope(论坛虚拟机自带),打开后可以查看到主界面中的主要控件的ID编号,比如“用户名:”字符串,其ID为1003,其他还有1003,1005等。
根据一般的编程经验,无论VC、Delphi、VB还是易语言,对windows界面的控件状态的控制,一般都是是根据控件ID来设置其属性来实现的,因此要隐藏控件,程序代码中肯定要对赋值对应的ID常量。在OD中搜索常量1001(16进制3E9),可以看到共有4处。
分别双击过去查看,可以发现403731就在关键函数内,后面还有1002、1003等,基本可以确定这里就是输入正确时需要执行的代码,前面的跳转中凡是跳过这段的都是验证失败的跳转。
另外,通过IDA转成伪代码后,也很容易看出如下所示代码为控件属性设置代码。
有了以上信息,爆破就比较简单了,F8跟踪运行到403486处,有个跳转是跳到错误弹窗函数位置,此处可以配合4034B9处的大跳转(该处大跳转也是跳到错误处理流程去),先将403486行改成“jmp short 004034B9”,再将4034B9行改成“jmp 0040372C”,直接跳到正确处理流程代码位置。
[Asm] 纯文本查看 复制代码 00403486 /75 1E jnz short crackeMe.004034A6
004034B9 /E9 38020000 jmp crackeMe.004036F6
403726也是一个判断跳转,上面修改的代码直接跳到它的下一步。
这样,爆破就完成了。用户名和密码区输入任意内容(非空),点击“登录”,即可显示成功界面。
|