打印

一个四年前产品引发的血案

[复制链接]
12400|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 tyw 于 2021-9-23 17:16 编辑

最近客户寄过来一个产品,一看,居然时4年前在上一个东家搞得产品,代码我都有,可惜不知道是哪个了。问其要技术图纸,答曰无。
在绝望之下,想起了N年以前沉迷于看雪论坛,搞**的那段日子。
搜了一下反汇编的软件,一看有老牌的ida pro 还有一个号称美国中情局出品的ghidra反汇编程序,好奇心陡然上升,下载之。
软件界面如下:
1、新建一个工程,随便弄,是个目录就行
2、import一个hex文件

3、进入一个反汇编的对话框,选择正确的cpu

4、点击language的。。。,如下,选择8051

5、点击ok,以后出现一个对话框表示成功,双击导入的main.hex

6.进入listing窗口,Ctrl+A,鼠标右键,点击反汇编

7.成功反汇编如下

使用特权

评论回复

相关帖子

沙发
叶春勇|  楼主 | 2021-9-23 17:17 | 只看该作者
单片机是老姚的stc15w404as
根据8051的中断向量表,第一行就是跳到main的,下面几行全是中断向量表。
往下翻,翻到一个io口的初始化代码

ghidra反汇编的伪代码如下:

比对一下自己的代码。

终于锁定自己的代码了。

使用特权

评论回复
板凳
叶春勇|  楼主 | 2021-9-23 17:23 | 只看该作者
这些老姚的寄存器,反汇编程序没有识别,看了一下stc15w404as写的头文件,以前stc15w404as改用sdcc开源编译器,自己写的头文件

把ghidra没有识别的特殊寄存器sfr,果断重命名

这样就清晰了。

使用特权

评论回复
地板
叶春勇|  楼主 | 2021-9-23 17:25 | 只看该作者
本帖最后由 叶春勇 于 2021-9-24 09:57 编辑

51单片机的前面是中断向量表,当然stc15w404as是增强型的51核,增加了很多功能,其中指令速度提高号称12T,中断也增加了很多。这个中断向量表,是分析程序的关键。下面的网友有说区分数据和代码的傻瓜**软件。据我的了解,通用的反汇编软件针对x86上的程序非常傻瓜,对于嵌入式就一般般。
下图是stc15w404as的中断图

我们按照stc,datasheet的描述,把反汇编程序的中断服务程序注释一下。这样结构就非常清晰了。
                             //
                             // CODE
                             // Generated by Intel Hex
                             // CODE:0000-CODE:0003
                             //
                             reset_routine
       CODE:0000 02 00 31        LJMP       start
                             INT0_ISR
       CODE:0003 32              RETI
                             //
                             // CODE
                             // Generated by Intel Hex
                             // CODE:000b-CODE:000d
                             //
                             timer0_isr_routine
       CODE:000b 02 06 c3        LJMP       timer0_isr
                             //
                             // CODE
                             // Generated by Intel Hex
                             // CODE:0013-CODE:0013
                             //
       CODE:0013 32              RETI
                             //
                             // CODE
                             // Generated by Intel Hex
                             // CODE:001b-CODE:001b
                             //
                             timer1_isr_routine
       CODE:001b 32              RETI
                             //
                             // CODE
                             // Generated by Intel Hex
                             // CODE:0023-CODE:0023
                             //
                             usart1_isr
       CODE:0023 32              RETI
                             //
                             // CODE
                             // Generated by Intel Hex
                             // CODE:002b-CODE:0816
                             //
                             adc_isr_routine
       CODE:002b 02 03 2d        LJMP       adc_isr
这个程序只使用timer0,adc中断,这些是我们分析程序的框架。程序框架清楚了,代码和数据就可以区分开来了。
裸奔的单片机程序,由若干中断和一个while循环构成。

使用特权

评论回复
5
athlon64fx| | 2021-9-23 17:42 | 只看该作者
弓虽

使用特权

评论回复
6
henangongda123| | 2021-9-23 17:57 | 只看该作者
老妖不是号称**不了吗?

使用特权

评论回复
评论
henangongda123 2021-9-23 20:03 回复TA
@huarana :哦 
huarana 2021-9-23 18:14 回复TA
楼主是已经有hex文件了吧。 老妖号称的是烧写到芯片里的程序搞不出来可以用的。 
7
xxdcq| | 2021-9-23 18:35 | 只看该作者
你试试你这个反汇编软件对于有大量的数据表的代码会反成数据还是代码?如果这个能完美区分开那就算是比较强的反汇编软件,另外反汇编之后再编译也能正确通过,并且对比最后生成的bin文件要完全一样这就是高质量的反汇编

使用特权

评论回复
8
fengok008| | 2021-9-23 19:47 | 只看该作者

使用特权

评论回复
9
地瓜patch| | 2021-9-23 21:47 | 只看该作者
牛牛

使用特权

评论回复
10
mbutterfly| | 2021-9-24 09:40 | 只看该作者
厉害,还没用过反汇编

使用特权

评论回复
11
叶春勇|  楼主 | 2021-9-24 10:08 | 只看该作者
这是老姚的寄存器表,通用的反汇编程序是无法识别的,所以得自己改成所需的寄存器

以老姚的看门狗寄存器位例子,下面是反汇编的代码段和伪代码,WDT_CONTR再sfr的0xC1,这里被错误识别成FI**1,需要改成

通过网上搜索,ghidra,有一个51的寄存器识别表。改写这个寄存器表,就能正确识别。
如下图所示


使用特权

评论回复
12
叶春勇|  楼主 | 2021-9-24 10:25 | 只看该作者
这张寄存器表,快速定位自己的单片机初始化程序,如下图,锁定寄存器即锁定初始化程序。

把所有的初始化程序全部注释一遍,最终找到一个init_all程序。看了一下伪代码,太残暴了。与自己写的程序几乎一摸一样。

使用特权

评论回复
13
叶春勇|  楼主 | 2021-9-24 10:34 | 只看该作者
对于工程师确定hex与源代码的对于关系,基本就完了,找到相应的关键设定参数。从start一直去追踪,以及软件给出的伪代码。轻松锁定自己的代码。

使用特权

评论回复
14
叶春勇|  楼主 | 2021-9-24 10:50 | 只看该作者
总结:
1、51单片机,前面的中断向量表,快速确定,中断服务程序和start程序(跟c不一样,包括编译器自带的初始化代码),把代码跑出来。剩下的都是数据区。
2、start程序,从初始化代码入手,最后返回start,借助伪代码,快速锁定while循环,while循环里基本都是关键代码。
3、如需进阶,对于c语言比较熟悉的人,需要了解如16bit和32bit的四则运算的汇编程序,汇编程序看着很长很吓人,都是这折腾这些16bit和32bit的四则运算。其中if语句,C语言中的判断,x大于y,被转换成四则运算,对于16bit或32bit,代码都是很长的。我这里都是sdcc编译的,跟keil c51编译的不同。一般来说,rom尺寸优先的优化代码好阅读,速度优先的代码就是天书(函数被优化掉了)。

使用特权

评论回复
15
数码小叶| | 2021-9-24 11:23 | 只看该作者
这波操作厉害了

使用特权

评论回复
16
叶春勇|  楼主 | 2021-9-24 11:45 | 只看该作者
来看看这段代码:
if(alarm_delay_timer_disable>TIMER_10S) alarm_disable_flag=0;

其中:
变量alarm_delay_timer_disable是两个字节
设定参数TIMER_10S=1000
变量alarm_disable为一个字节
反汇编出来的代码如下
       CODE:0178 c3              CLR        CY
       CODE:0179 74 e8           MOV        A,#0xe8
       CODE:017b 95 4d           SUBB       A,WORD_INTMEM_4d                                 = ??
       CODE:017d 74 03           MOV        A,#0x3
       CODE:017f 95 4e           SUBB       A,WORD_INTMEM_4d+1                               = null
       CODE:0181 50 03           JNC        LAB_CODE_0186
       CODE:0183 75 51 00        MOV        DAT_INTMEM_51,#0x0                               = ??


编译器还是给力的

使用特权

评论回复
17
ningling_21| | 2021-9-24 11:58 | 只看该作者
厉害了

使用特权

评论回复
18
天意无罪| | 2021-9-24 12:30 | 只看该作者
STC貌似也安于它现在的状态,能在细分市场占领一些份额,挣点*币也不错了。

使用特权

评论回复
19
叶春勇|  楼主 | 2021-9-24 13:24 | 只看该作者
天意无罪 发表于 2021-9-24 12:30
STC貌似也安于它现在的状态,能在细分市场占领一些份额,挣点*币也不错了。 ...

我本来是看一下程序的参数,好确定是哪个版本。
结果编译器优化的面目全非。还得分析程序。好好的设定值1000,被拦腰打断了。

使用特权

评论回复
20
圣骑士by| | 2021-9-24 13:25 | 只看该作者
厉害了 点赞

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

151

主题

4810

帖子

50

粉丝