可怕,别人把我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,一经查实,立即删除!

相关文章

GridView相关问题汇总

<asp:gridview id"gvData" runat"server" autogeneratecolumns"False"> <columns> <asp:templatefield headertext"所属系统"> <itemtemplate> <asp:label id…

带参数的宏定义

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

数据结构——堆栈

数据结构——堆栈 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、特性&#xff1a;先进后出&#xff08;FILO&#xff09; 2、应用&#xff1a; 子程序的调用 处理递归调用 表达式转换与求值 二叉树的遍历 图形的深度优化优先 3、用数组仿真堆栈 &a…

处理String类常用的方法1

public class Dome{public static void main(String[] args) {char[] chnew char[] {你,你,你};String strnew String(ch);System.out.println(str);char[] qwestr.toCharArray();} }此为数组转化为字符串&#xff0c;然后字符串又转回数组的方法。 public static void main(St…

电脑控制android手机神器,scrcpy

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

粗谈LINUX下的文件系统管理

在各网络操作系统中,都可分为系统理与网络管理两部分&#xff0c;而在LINUX下&#xff0c;若要向系统管理方面发展的话&#xff0c;就必须了解LINUX下的用户管理与文件管理。前面己经介绍了用户管理&#xff0c;下面将粗谈一下LINUX下的文件系统。那么究竟什么是文件系统呢&…

百钱买白鸡与啤酒饮料

第一题 标题&#xff1a;啤酒和饮料 啤酒每罐2.3元&#xff0c;饮料每罐1.9元。小明买了若干啤酒和饮料&#xff0c;一共花了82.3元。 我们还知道他买的啤酒比饮料的数量少&#xff0c;请你计算他买了几罐啤酒。 注意&#xff1a;答案是一个整数。请通过浏览器提交答案。 不…

Modbus协议概念最详细介绍

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

OpenvSwitch实现kubernetes依赖的底层网络

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

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

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

6月份Asp.net源码推荐

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

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

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

数独

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

初识Jedis

文章主要分两部分&#xff0c;第一部分&#xff1a;简单分析一些类&#xff0c;第二部分&#xff1a;代码示例 一、相关类分析 1、JedisPoolConfig类分析 JedisPoolConfig类是JedisPool的配置类 //最大空闲连接数, 默认8个 config.setMaxIdle(8);//最大连接数, 默认8个 config.…

Linux内存寻址方式

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

DotNetNuke 框架总揽

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

迷宫

描述一个由 n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数。输入第一行一个整数 T 表示有 T 组测试数据。(T < 110)对于每组测试数据:第一行两个整数 n, m,…

day3-python学习笔记(三)字典、元组

一.字典操作、元组操作&#xff08;字典增删改查以及数组&#xff0c;字典嵌套查询&#xff09;# 字符串&#xff0c;整型&#xff0c;list&#xff0c;字典# stus [ # [小傅,25,nan,xxx,20k]# [小傅,25,nan,xxx,20k]# [小傅,25,nan,xxx,20k]# [小傅,25,n…

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

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

选择排序法

选择排序法 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 思想&#xff1a; 线性查找的方式找出最小的元素和第一个元素交换&#xff0c;再从剩下的&#xff08;n - 1&#xff09;个数据中&#xff0c;找出最小的元素与第二个元素交换&#xff0c;以…