[STM32F1]

傻瓜式STM32反汇编

[复制链接]
10488|17
手机看帖
扫描二维码
随时随地手机跟帖
yjmwxwx|  楼主 | 2015-12-13 16:44 | 显示全部楼层 |阅读模式
本帖最后由 yjmwxwx 于 2015-12-13 16:47 编辑

为什么研究反汇编因为我技术不行写不出程序,真佩服那些能自己些程序的。  

研究了一下反汇编发现原来反汇编分析起来也不容易啊,要分清对应哪个库函数也不容易






拿原子哥的程序研究研究
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"

//ALIENTEK Mini STM32开发板范例代码15
//ADC实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
        
int main(void)
{
    u16 adcx;
    float temp;
    delay_init();             //延时函数初始化      
    uart_init(9600);         //串口初始化为9600
    LED_Init();                  //初始化与LED连接的硬件接口
     LCD_Init();
     Adc_Init();                  //ADC初始化        
    POINT_COLOR=RED;//设置字体为红色
    LCD_ShowString(60,50,200,16,16,"Mini STM32");     
    LCD_ShowString(60,70,200,16,16,"ADC TEST");     
    LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
    LCD_ShowString(60,110,200,16,16,"2014/3/9");     
    //显示提示信息
    POINT_COLOR=BLUE;//设置字体为蓝色
    LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");         
    LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");        
    while(1)
    {
        adcx=Get_Adc_Average(ADC_Channel_1,10);
        LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值
        temp=(float)adcx*(3.3/4096);
        adcx=temp;
        LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
        temp-=adcx;
        temp*=1000;
        LCD_ShowxNum(172,150,temp,3,16,0X80);
        LED0=!LED0;
        delay_ms(250);     
    }                                                
}   



打开IDA

2015-12-13 14:33:27屏幕截图.png


选择HEX文件
2015-12-13 14:34:11屏幕截图.png

选ARM
2015-12-13 14:35:07屏幕截图.png

参数设置
2015-12-13 14:35:50屏幕截图.png



2015-12-13 14:36:52屏幕截图.png 2015-12-13 14:37:55屏幕截图.png

2015-12-13 14:39:21屏幕截图.png

从复位向量进去
2015-12-13 14:39:41屏幕截图.png

.s启动文件的跳转main的指令,他并不是直接跳转main而是要把堆栈清零,还把后面一下数据放在了内存里
2015-12-13 14:40:06屏幕截图.png

繁琐的初始化不管他们直接找mian

2015-12-13 14:40:51屏幕截图.png

挑转到main
2015-12-13 14:41:10屏幕截图.png


终于到了main函数
2015-12-13 14:41:49屏幕截图.png

按F5转C

2015-12-13 14:42:55屏幕截图.png

流程图
2015-12-13 14:45:01屏幕截图.png

IDA反出来的程序

void __fastcall __noreturn sub_80001D4(int a1, int a2)
{
  int v2; // r0@1
  unsigned int v3; // r4@2
  unsigned int v4; // r0@2
  int v5; // r1@2
  int v6; // r0@2
  int v7; // r1@2
  int v8; // r0@2
  int v9; // r1@2
  int v10; // r9@2
  int v11; // r1@2
  unsigned int v12; // r4@2
  unsigned int v13; // r0@2
  int v14; // r0@2
  int v15; // r0@2
  int v16; // r1@2
  int v17; // r0@2

  sub_8005F68(a1, a2);
  sub_800605A(9600);
  sub_8000584();
  v2 = sub_8001E4E();
  sub_8005E80(v2);
  v20000014 = -2048;
  sub_8005E00(60, 50, 200, 16);
  sub_8005E00(60, 70, 200, 16);
  sub_8005E00(60, 90, 200, 16);
  sub_8005E00(60, 110, 200, 16);
  v20000014 = 31;
  sub_8005E00(60, 130, 200, 16);
  sub_8005E00(60, 150, 200, 16);
  while ( 1 )
  {
    v3 = sub_8005F32(1, 10);
    sub_8005D42(156, 130, v3, 4);
    v4 = sub_8007804(v3);
    v6 = sub_80076A8(v4, v5);
    v8 = sub_80074AC(v6, v7);
    v10 = sub_8007448(v8, v9);
    v12 = (unsigned __int16)sub_80077C4(v10, v11);
    sub_8005D42(156, 150, v12, 1);
    v13 = sub_8007804(v12);
    v14 = sub_80079C4(v13, v10);
    v15 = sub_800782C(v14, 1148846080);
    v17 = sub_80077C4(v15, v16);
    sub_8005D42(172, 150, v17, 3);
    v422101A0 = v422101A0 == 0;
    sub_8005FE2(250);
  }
}
2015-12-13 14:40:23屏幕截图.png
2015-12-13 14:43:08屏幕截图.png
2015-12-13 14:45:01屏幕截图.png
qq122881212| | 2017-6-26 20:28 | 显示全部楼层
能动态调试吗?

使用特权

评论回复
幸福小强| | 2018-6-14 15:33 | 显示全部楼层
神一样的操作,不懂。

使用特权

评论回复
dongliushui| | 2018-6-18 17:33 | 显示全部楼层
还是玩我的c这根本不懂啊

使用特权

评论回复
huixuesen| | 2018-6-19 08:43 | 显示全部楼层
高手!

使用特权

评论回复
john_lee| | 2018-6-19 09:32 | 显示全部楼层
个人玩反编译主要目的应该是熟悉汇编与C源码的对应关系、内存布局等等,以便写出更利于优化、开销更少的程序,如果达到了目的就可以歇歇了。
注意,这玩意对你提高程序设计经验并没有太大帮助,偶尔玩玩可以;当然如果你靠这个挣钱(比如静态**等等)就另当别论了。

使用特权

评论回复
study1234| | 2018-6-19 10:08 | 显示全部楼层
靠这个挣过钱,不怎么会用

使用特权

评论回复
renzheshengui| | 2018-6-19 14:11 | 显示全部楼层
对汇编不了解 楼主真高手也!

使用特权

评论回复
onepiece1987071| | 2018-12-12 17:09 | 显示全部楼层
哒哒哒哒哒哒多多多多多多多多多多多多多多多多多多多多多多多多多多多多多

使用特权

评论回复
meijc119| | 2020-7-17 13:32 | 显示全部楼层
可以把bin文件或是hex文件转换成汇编文件,汇编文件重新编译出来的文件与原文件每个字节都一样,Q5225016

使用特权

评论回复
工作狂QQ| | 2020-8-11 09:58 | 显示全部楼层
你好
,其中
LED0=!LED0;  ,反编译后   v422101A0 = v422101A0 == 0;,
原子教程里LED0 输出寄存器是PB5 ,按照映射表查询,PB端口基址是0x40010c00,  请问下  v422101A0 这个地址是怎么得来的 ?
谢谢

使用特权

评论回复
工作狂QQ| | 2020-8-11 14:17 | 显示全部楼层
谢谢 指教,  权限不够 没法回站内短信给你,在这里感谢了


使用特权

评论回复
工作狂QQ| | 2020-8-11 14:30 | 显示全部楼层
你好老师,在另一篇**里 看到你好像提到过 把反汇编文件 修改下 ,然后直接用KEIL 仿真调试, 这个 是怎么操作的 能不能指教指教,谢谢

使用特权

评论回复
yjmwxwx|  楼主 | 2020-8-11 15:44 | 显示全部楼层
工作狂QQ 发表于 2020-8-11 14:30
你好老师,在另一篇**里 看到你好像提到过 把反汇编文件 修改下 ,然后直接用KEIL 仿真调试, 这个 是怎么操 ...

首先我根本没怎么用过KEIL,我是说别人那样用,其次我开发都是用GNU ARM汇编,伪指令和KEIL上的不一样,这个对我来说根本没用,所以没仔细研究。

大概给你说说吧
下面是一个函数,可以看到红色的字是临时变量
1.png

改成下面这样
2.png

再就是函数结尾可能会有文字池,比如下面这个
3.png
把这个文字池定义成数据段,等到下面代码段再定义成代码段,KEIL上可能下面这两条伪指令
AREA RESET, DATA, READONLY
AREA |.text|, CODE, READONLY
我也不知道对不对的哦,GNU ARM汇编上是
.data
.text

原来汇编定义文字池就一条ltorg指令,但是反汇编后给加了标号,直接去掉文字池加LTORG指令可能会提示找不到标号,大概改这两个东西就差不多了,再就有的指令反汇编的不对改改就是了。

还有我不是老师也不是专业搞反汇编的,你看上面10楼不是有专业人员么,你问他多好,我这连工作都没有,种地也不挣钱,都快揭不开锅了,所以实在不能帮你什么了,再说我现在也对反汇编**别人的东西也没兴趣了,不想研究这个了。




使用特权

评论回复
工作狂QQ| | 2020-8-17 19:01 | 显示全部楼层
yjmwxwx 发表于 2020-8-11 15:44
首先我根本没怎么用过KEIL,我是说别人那样用,其次我开发都是用GNU ARM汇编,伪指令和KEIL上的不一样, ...

谢谢 你的指点
不好意思,这几天 出差 才回来
达者为先,你比我懂 你就是老师
其实 我也不是专门去反汇编**别人的东西, 只是我觉得 反向学习底层代码 比正向学习**更深刻,更容易 懂,
先整常编译程序,然后自己在反向解读, 可能有点另类吧,哈哈
      汇编语言 太难懂了!  现在也 刚刚学会简单的使用IDA  ,在想 如果能用IDA 反汇编出来的代码 ,可以跟踪仿真调试的话 应该会更容易 理解吧
不管怎么说 ,还是 谢谢你的 热心指导

使用特权

评论回复
meijc119| | 2021-10-19 12:56 | 显示全部楼层
可以反汇编的,反汇编出来的汇编程序,可以重新编译,并且编译出来的文件与原文件完全一样,每个字节都一样。QQ5225016

使用特权

评论回复
mutable| | 2021-10-19 13:53 | 显示全部楼层
这个是把HEx反过来弄成汇编?厉害了~

使用特权

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

本版积分规则

110

主题

2560

帖子

42

粉丝