OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14096|回复: 16

STM32反汇编实战破解开机验证码

[复制链接]

26

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2013-6-3
在线时间
49 小时
发表于 2015-12-17 18:12:19 | 显示全部楼层 |阅读模式
想仿制别人的产品但是作者只提供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



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

424

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1020
金钱
1020
注册时间
2014-9-4
在线时间
199 小时
发表于 2015-12-17 18:39:22 | 显示全部楼层
虽然看不懂,但是必须顶啊,,,
https://github.com/WZTENG
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-12-17 19:40:49 | 显示全部楼层
搞汇编的都是大神啊!
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

48

主题

132

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
359
金钱
359
注册时间
2015-4-6
在线时间
3 小时
发表于 2015-12-17 21:18:54 | 显示全部楼层
太牛,原来是这样子搞反汇编的。 还是不是可以破解别人的程序?
回复 支持 反对

使用道具 举报

26

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2013-6-3
在线时间
49 小时
 楼主| 发表于 2015-12-18 07:22:09 | 显示全部楼层
原作者许剑伟老师真是高手中的高手,原来还没有破解成功。

许老师的一段帖子:

如果用户得到编译好的且未加密的hex程序,并且手上有stm32程序跟踪调试器的话,破解验证码就会变得比较容易。
具备以上条件,破解者找到读flash指令(整个程序,读flash指令只有几条),然后在该指令往下找跳转语句,会很快的找到验证是否通过的判断语句,直接把“是条件跳转”改为“否条件跳转”,这样就会跳过验证码。估计,一两天就破解完成。

如果,验证码计算的中间变量保留,也参与LCR主程序再次验证,当用户没有进行正确的验证码运算,中间变量自然不正确,那么就在LCR主程序中跳过几处误 差修正,这样破解者就会误以为破解成功,实际上没有突破第二层破解,要突破第二层破解,就得弄明白验证码算法,那么破解成本就会增加一些。

此外,也可以不公开基础校准的方法,这也就成了加密的一个方法。每个LCR,所需的基本校准值不一样,即每块stm32不单单ID号不一样,实际上,它的 ADC、端口参数等等,都有一些不同,这就造成了它们的64kB的HEX不同,这64kB HEX的生成方法(即校准方法)不公开,破解者就不会知道如何破解。这部分也可以看做“工厂校准”,如果这项校准是机器辅助完成的,保密性就很好,如果是 人工完成的,保密性就会严重下降。说白了,我不说校准方法,别人就难以知道如何校准,程序copy了,表却准不了。

主要是要加密到什么程度。我本来不想严格加密,不过浩其心希望严格加密。如果严格加密,成本高。比如,机器校准的话,还得高设计自动校准机。



回复 支持 反对

使用道具 举报

26

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2013-6-3
在线时间
49 小时
 楼主| 发表于 2015-12-18 07:28:33 | 显示全部楼层
xjw01老师是顶尖高手,有感兴趣的可以搜一下
回复 支持 反对

使用道具 举报

26

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2013-6-3
在线时间
49 小时
 楼主| 发表于 2015-12-18 07:37:48 | 显示全部楼层
只有根据原来算法写个算号器才能大量复制, 这个是许老师的10K电桥的电路图

回复 支持 反对

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2067
金钱
2067
注册时间
2012-5-26
在线时间
292 小时
发表于 2015-12-18 08:45:21 | 显示全部楼层
回复【5楼】yjmwxwx:
---------------------------------
看来验证码这东西,只能防君子防不了小人呀
像那些大公司的软件产品,网上都有各种破解
可想而知,能加密就能解密,就看解密的成本高低了
活着才是王道!健康是一切的前提!
回复 支持 反对

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2015-12-18 09:20:41 | 显示全部楼层

破解别人的东西不好 呵

回复 支持 反对

使用道具 举报

0

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2014-6-5
在线时间
37 小时
发表于 2015-12-18 10:47:52 | 显示全部楼层
许老师的COG12864版本的电桥看着挺不错的,不过有网上很多版本的原理图,楼主发的是1602版本的,不知该如何下手。做一个出来也是平时工作的利器啊。
回复 支持 反对

使用道具 举报

26

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2013-6-3
在线时间
49 小时
 楼主| 发表于 2015-12-18 21:33:52 | 显示全部楼层
搞定了, 输入错误密码屏幕上显示出正确密码

0x8002b70 开始改几个数就行了

原来的


原来的


修改后的



写改的地方

回复 支持 反对

使用道具 举报

26

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2013-6-3
在线时间
49 小时
 楼主| 发表于 2015-12-19 11:38:21 | 显示全部楼层
BL 跳转计算
比如向前跳转 比如上边的fdf7 49fe 这样写不注意高地位容易弄混。 
计算要算这个f7fd fe49 , 取高三位7FD 和低三位e49
7fd左移12位 =   7fd000     e49左移1位 = 1c92

7fd000 | 1C92 = 7fdc92 

7fdc92 - 1 = 7fdc91 
然后取反 =  236e

BL语句所在的地址- 236e + 4 = 要跳转的地址

0x8002b7a - 0x236e + 4 = 0x8000810 

注意这是往前跳转,往后跳转计算不一样
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-19 13:29:36 | 显示全部楼层
恭喜.....
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-12-23
在线时间
2 小时
发表于 2015-12-23 08:45:35 | 显示全部楼层
楼主高手啊!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-7-1
在线时间
0 小时
发表于 2016-7-1 09:40:14 | 显示全部楼层
楼主请教下jlink那块怎么搞?
回复 支持 反对

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2016-10-26 16:48:45 | 显示全部楼层
所以啊,同学们,读UID不能直接用UID的地址啊,定义一个变量,在不同地方计算最后得到地址啊,
int a=0;
short buffer[6]; //96/16
  ....
a=UID_Addr-xxxx;
....
a+=xxxx;

memcpy( buffer,(char *)a,12);

回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-12-25
在线时间
20 小时
发表于 2017-9-7 15:18:49 | 显示全部楼层
一楼的图都挂了????
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 03:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表