想仿制别人的产品但是作者只提供HEX文件,
并且有产品唯一身份标识的验证码,每换一片STM32就要跟原作者要验证码,原作者比较忙所以要验证码很不方便。
于是研究一下能不能破解一下。上一帖贴了IDA的基本用法,我是新手第一次搞破解, 我是小学学历不懂英文和C语言。。
这次破解全靠运气。
IDA的基本用法就不说了,直接切入分析。
既然程序用产品唯一身份标识那我们就从他开刀
打开IDA反汇编代码然后搜索0x1FFFF 然后看到0x8002950里面有,而且这个函数运算很繁琐可以确定这个就是主要目标
由于这个函数用了大了运算静态调试不容易,所以把我的最小系统板焊上了1602液晶跟键盘,按照他说的方法输入试用码成功后居然会在屏幕上显示Zero check...
这个英文是什么意思我不懂因为我不会英文, 但是我知道成功后会显示他,程序自己出卖了自己。 由于IDA反汇编ASCII有不准确的时候我们看十六进制代码搜索找Zero check...
然后到这个存放ASCII的数据区把原来不正确的反汇编按A键转换成ASCII
原来是sub_80012D8调用了他说明判断验证码在他前面
看他前面sub_80011C2 sub_8001280 sub_80011C2 这三个都不是,说明还是在sub_80012D8前面
原来不是死机是在0x8002B80死循环,找到0x8002B80
他左边的loc_8002A5C: 有POP正常返回说明他是正确的在往上找,找到loc_8002B58: 动态调试一下,在这里设个断点 ,随便输入一个数按键确认,调试后得知原来R10是计算后的 R7是我们输入的验证码
把bne loc_8002b6c改成 beq loc_8002b6c 改完以后结果就会时输入正确验证码死循环,输入错误验证码正常使用 。
把 06 D1 改成 04 D0 就可以了,06 D1 是BNE , 04 D0 是BEQ
许老师的一段帖子:
如果用户得到编译好的且未加密的hex程序,并且手上有stm32程序跟踪调试器的话,破解验证码就会变得比较容易。
具备以上条件,破解者找到读flash指令(整个程序,读flash指令只有几条),然后在该指令往下找跳转语句,会很快的找到验证是否通过的判断语句,直接把“是条件跳转”改为“否条件跳转”,这样就会跳过验证码。估计,一两天就破解完成。
如果,验证码计算的中间变量保留,也参与LCR主程序再次验证,当用户没有进行正确的验证码运算,中间变量自然不正确,那么就在LCR主程序中跳过几处误 差修正,这样破解者就会误以为破解成功,实际上没有突破第二层破解,要突破第二层破解,就得弄明白验证码算法,那么破解成本就会增加一些。
此外,也可以不公开基础校准的方法,这也就成了加密的一个方法。每个LCR,所需的基本校准值不一样,即每块stm32不单单ID号不一样,实际上,它的 ADC、端口参数等等,都有一些不同,这就造成了它们的64kB的HEX不同,这64kB HEX的生成方法(即校准方法)不公开,破解者就不会知道如何破解。这部分也可以看做“工厂校准”,如果这项校准是机器辅助完成的,保密性就很好,如果是 人工完成的,保密性就会严重下降。说白了,我不说校准方法,别人就难以知道如何校准,程序copy了,表却准不了。
主要是要加密到什么程度。我本来不想严格加密,不过浩其心希望严格加密。如果严格加密,成本高。比如,机器校准的话,还得高设计自动校准机。
一周热门 更多>