ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM32F1] 傻瓜式STM32反汇编

[复制链接]
1680|8
 楼主 | 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




选择HEX文件


选ARM


参数设置








从复位向量进去


.s启动文件的跳转main的指令,他并不是直接跳转main而是要把堆栈清零,还把后面一下数据放在了内存里


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



挑转到main



终于到了main函数


按F5转C



流程图


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);
  }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2017-6-26 20:28 | 显示全部楼层
能动态调试吗?
| 2018-6-14 15:33 | 显示全部楼层
神一样的操作,不懂。
| 2018-6-18 17:33 | 显示全部楼层
还是玩我的c这根本不懂啊
| 2018-6-19 08:43 | 显示全部楼层
高手!
| 2018-6-19 09:32 | 显示全部楼层
个人玩反编译主要目的应该是熟悉汇编与C源码的对应关系、内存布局等等,以便写出更利于优化、开销更少的程序,如果达到了目的就可以歇歇了。
注意,这玩意对你提高程序设计经验并没有太大帮助,偶尔玩玩可以;当然如果你靠这个挣钱(比如静态破解等等)就另当别论了。
| 2018-6-19 10:08 | 显示全部楼层
靠这个挣过钱,不怎么会用
| 2018-6-19 14:11 | 显示全部楼层
对汇编不了解 楼主真高手也!
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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