工具: FishC OD(点我下载)
样本程序:TraceMe(点我下载)
一、 观察程序 && 函数猜测
打开TraceMe,我们可以看到,弹出的登陆框:
首先输入伪造的用户名与密码
点击 Check 后,显然会出现错误的提示:
接下来,我们思考如何利用暴力破解技术,绕过程序的验证机制。而逆向算法,则会在以后提出。
我们通过猜想,可以大致将程序运行机制如下划分:
暴力破解旨在修改程序返回值来修改程序下一步执行动作,从流程图可知,我们只需要修改判断算法的返回值即可。
从输入ID与激活码,我们可以得知,判断函数的会接收这两个参数,所以我们从输入开始追踪程序,查看程序运行机制。
程序通常读取文本框内容的字符串用的是以下两个函数:
GetDlgItemTextA(GetDlgItemTextW)
GetWindowTextA(GetWindowTextW)
我们可以都试一试,很快找出相关函数
二、 破解过程
打开OD,载入TraceMe:
按下Ctrl+G,搜索 GetDlgItemTextA
我们已经找到了该函数,现在在此按F2下断点,然后按下Ctrl+F2刷新进程,并按下Ctrl+F8自动执行:
执行至登陆界面,程序暂停,我们输入伪造ID 与激活码,注意:激活码应当适当的长
当我们按下Check,程序开始执行,到达到该函数时,程序便会暂停。
我们继续按F8步过并观察,我们可以发现程序将ID与激活码传入参数并计算:
那么下一步就是程序的判断算法了,暴力破解的核心就是直接修改判断函数的返回值,所以我们步过函数,寻找下方的返回值语句
当我们查找到test时,发现他的Z值为0:
继续步过,进入je 语句,我们发现,该值变为 1,并且实现了跳转:
显而易见,这条语句的跳转,即是跳转到激活码错误的语句。
这是就是破解的关键,程序的期望返回值为0,而实际返回值为1,所以造成我们的伪ID无法通过:
因此,我们重新载入,再次执行到 je 修改其Z 值为 0:
可以看到,该语句的跳转成为了未实现:
继续步过,直到其出现提示音,我们可以看到,破解完成:
暴力破解就此完成,之后将实际返回值语句 je 设为nop:
之后保存修改后的程序即可。