可怕,别人把我MCU固件给反汇编了!

相关文章

很多人都不清楚HEX文件格式

CPU怎么认识代码的?

一个超强的逆向分析软件

本文主要跟大家分享一个简单逆向stm32固件程序的实例,为了让大家在一款成熟的产品中去考虑加密这一块的技术,不然分分钟被别人copy!

2、情景再现

咬金,你们公司固件程序有加密处理吗 ?

额~,算了吧,我们公司的单片机程序炒鸡简单的,还加啥子密。

你这想法不对,假如产品卖得很好,如果没有任何加密措施,那岂不人家随便复制售卖。

没关系吧,反正他们没源码,应该也没那么容易复制吧。

一点加密都没有,盗取还是比较简单的。

我才不信~~!

那行,把你的板子给我,不用你的源码,跟你把波特率改了!

1 直接读取固件

这里以stm32单片机进行演示,如果MCU没有做flash读取或者熔断保护,则可以通过jlink等烧写工具直接读取其Flash上的固件,操作如下:

01

打开J-Flash软件并选择创建一个新的工程,并点击Start J-Flash : 

02

选择所对应的芯片类型,并点击连接芯片,并显示连接成功。

03

通过下面的选项路径,即可读取所选Flash区域或者所有Flash区域(Entire Chip)。

04

这样便获得了Flash上所有的固件数据,也就是我们的bin文件内容,当然这也就是逆向的最重要素材。

05

最后把数据保存为bin文件、hex文件等等即可,当然当你换一块芯片然后烧录该程序也是可以运行的。

2 逆向固件程序

一谈到逆向,估计各位小伙伴会联想到各种黑客、破译、非法等等情景,然而并非如此,世间万事万物都是双刃的。

就像开一把锁,当你学习了各种破解锁的技巧,如果使用这些技巧来盗窃,当然属于违法行为;但是当用来帮助破解犯罪现场,收集证据等等那这就大有作为的,当然本文旨在学习。

目前嵌入式行业比较流行的逆向工程技术有PCB抄板芯片解密

  • PCB抄板一般都会使用到相关的工具和电气测试等等,最终获得原电路板的原理图、BOM等等实现PCB的完整复制。

  • 芯片解密一般是通过相应的技术把执行程序(一般为机器码)反汇编成汇编代码,还可以更进一步反编译成高级语言伪代码(比如C代码),便于逆向人员理解和修改。

2.1 前期准备

在上一小节中我们轻松获得了芯片中的bin文件等,当然如果芯片有加密处理过,可能就需要更加先进的技术获取芯片的内部数据,这里就暂时不展开了,可以参考下面两篇文章 :

      【整理】一文带你了解"单片机解密"技术

      【MCU】用stm32的UID给固件加密(重点在加密)

今天我们主要是把前面获取的bin文件逆向一下,并把原来的波特率9600修改为57600,原来9600效果如下:

2 逆向过程

逆向技术发展其实挺长一段时间了,当然为了方便各逆向爱好者的使用也诞生了非常多的开发工具,其中IDA Pro算是非常流行的逆向工具,所以这里就选用该工具进行逆向。

01

首先安装IDA Pro逆向工具,网上搜索一下会有各种资源,然后点击安装,一路next基本上可以安装好,安装好以后便出现如下两个头像。

这里选择32bit版本,并创建工程:

02

这里选择上小节导出的bin文件,由于所使用的芯片为cortex-M3内核,这里选择ARM Little-endian模式:

03

设置内核架构,这里可以通过查阅对应的内核介绍进行选择。

04

然后设置bin文件对应的地址映射,由于bin文件是通过整片全部读出,所以这里与该芯片的Flash起始地址和大小是一致的。

05

很轻松便进入了IDA的反汇编代码,这样就完成了从机器码到汇编码的逆向过程。

同时你还可以通过IDA的图形调用试图来看到各种调用关系等。

06

然后我们随便找一个函数并使用F5,生成C伪代码。

然后你再看看C源程序,惊人的相似!!

07

假如闲9600的波特率太慢,却又苦于没有源代码修改烧录,于是便可以逆向修改bin文件进行烧录。

当然如果你对机器码和汇编非常的熟悉,只需要找到对应的机器码进行修改即可,然而找到对应的机器码还是通过IDA工具来得比较直接且方便。

同时可以在反汇编view中使用C和D来进行机器码和汇编的转化:

如下通过使用D可以把汇编转化为机器码:

   

这里按下D,即可转化为如下机器码 :

同时切到Hex视图,也可找到对应的机器码:

08

以上便找到了修改的位置,仅仅只需要把该机器码中的9600修改为57600即可,我们可以通过查找内核的指令集进行机器码的编写,并进行如下更改:

同样,其对应的汇编视图也发生了如下变化:

然后点击如下图所示菜单选项,从而把相应的修改更新到对应的bin文件中。

09

最后,当然是把修改以后的bin文件烧录到单片机中进行测试,测试结果如下图所示 :

波特率成功被修改为57600,整个过程到此结束,enjoy!!

咬金,你看不加密,程序几乎是完全暴露的!

小鲁班,你怎么变这么优秀了?那以后我得好好考虑这块了!

3 结束语

本文主要跟大家介绍了如何逆向一个MCU程序,当然还有很多高级的技巧有待挖掘,特别是IDA工具更是一款神器!上面bug菌也只是抛砖引玉,有感兴趣的小伙伴可以多多交流!

好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。

#推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带参数的宏定义

不是进行简单的字符串替换,还要进行参数替换。其定义的一般形式为#define 宏名(参数表) 字符串字符串中包含在括弧中所指定的参数。如:#define S(a,b) a*bareaS(3,2);定义矩形面积S,a 和 b 是边长。在程序中用了S(3,2),把3、2分别…

电脑控制android手机神器,scrcpy

我同事有一个华为手机,手机里内置了NFC,然后把手机靠近下电脑,当然的,一定需要是华为笔记本,然后电脑就弹出一个界面,控制手机的界面,这个功能非常好,加上NFC的功能,体验…

Modbus协议概念最详细介绍

★一文认识Modbus协议;”1 什么是Modbus?2 主从模式3 协议的分类3.1 Modbus ASCII3.2 Modbus RTU3.3 Modbus TCP3.4 Modbus Plus4 libmodbus5 freemodbus6 总结1 什么是Modbus?Modbus是Modicon(施耐德)公司于1979年开发…

OpenvSwitch实现kubernetes依赖的底层网络

kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,而且假定所有Pod都在一个可以直接连通的、扁平的网络空间中(在GCE里面是现成的网络模型)。在kubernetes中,IP是以Pod为单位进行分配的。一个Po…

该不该放弃嵌入式,单片机这条路?

知乎提问:本人,一个毕业工作两年在深圳工作的菜鸟单片机工程师。说说这两年来自己的一些看法。个人语言表述能力较差,加之经验不足,望见谅。1.程序编写1.1对架构能力要求较高。比如做一个自动售卖咖啡机,在开始写之前要…

6月份Asp.net源码推荐

整理了一下51aspx上6月份的Asp.net源码,特推荐一些给大家免费下载- 阿江酷站统计系统ASP.Net修正版Hits:262 2007-6-29阿江酷站单用户访问统计系统ASP.Net修正版 通过在要统计的页面潜入js脚本就可以对访问进行详细统计,可以按小时、日、月、年进行柱状图…

在家工作多年再回深圳找工作,会不会丢脸?

jiy发哥好。职场难题,江湖救急,请教你: 我刚毕业曾在深圳待过,那时候真是菜得什么都不会,折腾来折腾去一直没找到合适的坑,所以混了一两年又回老家小城市了。 小城市待遇普通,工作机会不多&…

数独

数独 时间限制:1000 ms | 内存限制:65535 KB难度:4描述数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据99盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个3*3宫内的数字均含1-9&…

Linux内存寻址方式

为什么要内存管理:早期的程序都是直接运行在物理地址上,也就是说这个程序所需要的空间不超过该机器的物理内存就不会有问题,但实际场景中都是多任务,多进程的,这种物理地址reserved给各个进程是不靠谱的。举个栗子&…

DotNetNuke 框架总揽

我总觉的学一样东东,最好是先在总体上对他有一个认识,而后才能更好的学习,最近刚好有机会学习DotNetNuke这个东西,就把所学到的都写下来,与大家一起分享,有不对的地方,大家一起讨论,…

超全!嵌入式必懂的CAN总线一文讲通了

嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信也广泛使用CAN,随着国家对海防的越来越重视,对CAN的需求也会越来越大。这个暑假,通过参加苏州社会实践,去某船舶电气公司实习几周,也…

Gentle中的数据表实体类相关自定义属性的设置和获得

1.自定义 表名属性 TableNameAttribute2.自定义 主键属性 PrimaryKeyAttribute3.自定义 列名属性 TableColumnAttribute 4.数据表person对应的实体类person.cs5.获得person.cs类型实体 对应的表名及字段名 下面的属性代码文件 都直接建立在App_Code下 以方便使用 1.自定义 表名…

WebSocket介绍

WebSocket协议是基于TCP的一种新的协议。WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符。它实现了浏览器与服务器全双工(full-duplex)通信。其本质是保持TCP连接,在浏览器和服务端通过Socket进行通信。 本文将使用Python编…

干,认识Audio框架还因此发现一个雷

我们最近出了一个问题,我们点击播放音乐,然后再点击停止播放的时候,喇叭还会输出一段杂音后喇叭才会停止输出。经过排查发现,在代码里面就做了这个功能代码在AudioFlinger.h 里frameworks/av/services/audioflinger/AudioFlinger.…

画图板-- 中点算法画圆

为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置)。圆心位于原点的圆有四条对称轴…

Linux 内核如何描述一个进程?

哈喽,我是吴同学,继续记录我的学习心得。一、关于写文章许多知识,书上或者网络上都有,就算这两个地方都没有,代码里也会有答案。但有时恰恰是 资料太多,反而让人难以检索出有用的信息。面对同样的资料&…

供应商关系管理SRM为企业的节流增贡献

在供应链下游的需求链上,企业为了增加市场份额、提高销售收入,更为重视面向客户的管理和信息化管理方面的投入,纷纷引入客户关系管理CRM的管理理念和信息化系统,在“客户第一”的经营策略下借助IT技术的手段来提高对客户的服务水平…

UART/I2C/SPI/1-wire四大通信接口的神解释

1、 裘千丈轻功水上漂之UART射雕英雄传中的裘千丈说,UART就是我的轻功水上漂过河。想从河上过(通信),提前布暗桩,行走时步伐按桩距固定(波特率提前确定),步幅太大或太小都会落水。为…

last_kmsg和ram console

相关文章Android 7.1使用脚本保存LOGCAT和KMSG日志到文件首先,在kernel里面通过printk吐log的时候会是下面的一个过程:printk会将信息格式化到kernel log buffer里面去。然后将这些格式化信息送到console去,在我们的系统里面有两个console&am…

字符串类

1.String类 常用方法: 参考:http://wenku.baidu.com/link?urltz-3Dpwj-JSJQdG6vSo0J1L1G9oJS4eQJjYgogieIzgjdNNLmj-U9EpWhOnVthz4egAKv0SNmLkqzNz2WsiZ2EmPGMu2UXhB6yy-E4yvMQ3 NB: 这里的”s1s2“是地址相等,而是s1.equals(s2)是内容相等…