本帖最后由 疯如初 于 2020-4-16 10:15 编辑
前言
我是一个学逆向的小白,大概可能学了几天时间,技术不好,希望大佬能帮忙指点下我的过程,谢谢!
有些跟着书上做的,因为刚学呢(最后伪代码是独立完成的)
这篇文章其实不是转载的,但由于感觉技术含量不高,而且初学文且大多数跟着书上做的,所以就放分享区了
工具
Ollydbg
被调试文件
TraceMe.exe(无壳)
难度
简单
过程
打开后,发现是需要通过序列号来授权的,取出文本框内的文本需要通过Win32API的GetDlgItemText或GetWindowText
这个是用GetDlgItemText的
ctrl+g然后找到GetDlgItemText的入口位置下int3断点
点击check后,程序被中断在74944390,F8走出win32api的子程序
F8一直向下走,在004011f5被条件转移到了0040122e
发现不太对劲,好像已经被发现我序列号输错了
判断如果不条件转移就破解成功了,所以现在就可以直接把004011f5改成nop就可以不管怎么输入都正确了
序列号算法分析
因此定位序列号检测算法在004011f5条件转移前面,在GetDlgItemText后面
经过分析后(分析见od注释)发现,004011e5处的call 00401340是唯一一个可能作为验证算法的地方,故判断00401340为序列号验证子程序的入口
004011e5处下断点,ctrl+f2重新开始,运行到004011e5处f7跟进子程序
看着汇编指令慢慢分析后,把注释也标在旁边,最后自己翻译成自创的伪代码(怎么舒服怎么写)
最后只要保证序列号和被这个算法一通算下来的[ebp]一样就行
note
读这段汇编的时候最后稍微卡了一下,因为neg这个指令没仔细了解,也没学过,看名字也就是个正转成负数这类的东西了
但我看到后面sbb的时候意识到问题不对劲,因为如果标志寄存器中的cf位为1的话会导致一个sbb要额外减去1
查了一通发现neg在弄不为0的操作数的时候cf会变成1
所以调用lstrcmpA这个Win32API的时候,目的根本就不是比谁大,而是看是否相同
因为sbb eax,eax不管怎样来说eax-eax都是为0的,但由于cf的存在,它就有可能变成-1或0
而neg操作的对象正是lstrcmpA的返回值(比较对象相同返回0,大于返回正数,小于返回负数)
然后执行完sbb eax,eax后,再来一手inc eax就把结果变成了0和1
所以只要[eax]和[ebp]相同的话,这个序列号检查子程序会返回1(意味着输入正确),不同就0(意味着输入错误)
总结
这个主要还是找下感觉看着书上做的,但发现这个不算难的,做着做着还是发现可以做出来的,分析也不算费劲,前面也说到发现关键子程序做到了唯一定位
后面的序列号检查算法分析(翻译成自己的伪代码)是自己独立做的,后来对比下这个程序的源码发现差不多
参考
段钢-加密与解密
小哈龙-影响标志位的汇编指令-https://blog.csdn.net/qq_22642239/article/details/51442739
|