PIC单片机之反汇编

发布者:beta12最新更新时间:2018-08-04 来源: eefocus关键字:PIC单片机  反汇编 手机看文章 扫描二维码
随时随地手机看文章

前言 


反汇编 ,一般情况大家用的不多。但在一些行业确实比较常见。比如 破解加密算法,获得加密密钥,或者自己无法写出完全一致的程序又要修改一些地方的时候反汇编就是必不可少的。反汇编是比较枯燥,又有一定挑战性的东西下面我给大家讲解如何 从BIN文件->HEX文件->汇编->C语言的全部过程。


第一步破解芯片


这个作为一般是要找专业破解芯片的公司,帮我们把芯片内的  flash 和EEPROM 中的数据读出来,从而得到BIN文件或者HEX。这一步唯一的困难点就是你要花钱。。。


第二步BIN转HEX


因为PIC的老的MPLAB 或者MPLAB X IDE。都不支持读取BIN文件。所以你必须事先将BIN文件转为HEX文件。当然你如果已经有了HEX文件这一步可以忽略。 我个人是比较喜欢用QL-2006这款单片机烧器的烧写软件将BIN转成HEX。


第三步将HEX转成汇编


1,打开 MPLAB IDE  Configure->Select Chip 选择芯片型号。


2, 点击菜单栏File->Import 导入HEX文件。


3,查看程序存储空间点击菜单栏 View ->Progarm Memory 跳出Progarm Memory 窗口选择点击选择Machine,Machine显示的 就是每个机器码对应的汇编语言。


4,去掉LINE(行号) 去掉OpCode(机器码) 只留下Address(地址)和Disassemly(汇编)这两列。右击最上边的一栏就可以去掉 相应列的勾选。


5,右击文本框 点击Output To File (输出文件)。这样我们就得到了。反汇编之后的文本文件了。


6,然后用以上类似的方法输出 EEPROM中的数据


第四步 建立工程


1,将上一步得到的文件,将扩展名由 .TEXT 改为 .asm.我们就建立新的工程将改汇编文件添加进去。


第五步 最苦逼的阶段看懂汇编加注释。


1,这个阶段最重要的你本身必须懂汇编。


这一步最累了 就是吧 对应的 特殊功能寄存器,从机器码改为由意义的名称。

如  BSF 0x3.0 修改为 BSF STATUS,RP0

值得必须注意的是你一定要知道你所修改的的寄存器 是在那个页面的。

在BANK0 代表CLRF GPIO,在BANK1 代表 CLRF TRISIO(具体代表什么你要查看对应型号的数据手册)


2,区分那些数代表  数值  那些数 代表 寄存器 那些数 代表 程序地址。这个一定要注意。

如 :MOVLW 0x3 代表数值0x3

    MOVWF 0x3 代表寄存器STATUS

    GOTO  0x3   代表程序地址0x3

3,反汇编的难点和重点,就是看懂原作者 写的程序是什么意思。在这里我只是说分享一下我的做法。


1,一般大概猜测 对应 寄存器是什么意思 我多会将其取个有意义的名字。如计数器我就取CONTER。然后查找替换


2,大概猜测到 子程序是什么意思 也同样给他去个有意义的名字。


3,另外建立个文本。作为一种笔记。对于你猜测的 子程序 或者 寄存器的作用做一个记录。


4,然后就是耐心的死磕了。


最后变成下面的 这样子。当然要想能编译还要把前面多余的 地址列按ctrl+alt 选择去掉。

      

第六步    汇编转C


到这一步必须事先对汇编的意思几乎都看懂了才行你就将你所理解的汇编直接改写成C就行了。


汇编与C之间有许多明显的对应关系下来举个例子。


6.1 const 数组

             如 :

             汇编

                        ADDWF PCL,F

                         RETLW  0x00

                         RETLW  0x01

                         RETLW  0x02

                         RETLW  0x03

               对应C语言 const   unsigned char Tab[4]={0x00,0x01,0x02,0x03} 

              

             汇编  赋值语句

                MOVLW 0x1

                MOVWF  BUF

             C语言 赋值语句

                BUF = 0x1;


             汇编 与

              MOVLW  0X0F

              ANDWF  BUF

              C语言  与

              BUF  &= 0x0F

              

              汇编  左移

            MOVLW 0x4

            MOVWF  COUTER;  

             BCF  STATUS,C

RLF_LOOP

              RLF   BUF

             DECFSZ  COUTER,F

             GOTO     RLF_LOOP

             C语言 左移

             BUF <<=4;


           汇编   数据指针

            MOVLW   TEMP

             MOVWF  pBUF

             MOVFW  FSR

             MOVLW   0x2

             ADDWF  INDF.F

             C语言  数据指针

              unsigned char * pBUF;

              pBUF = &TEMP;

              *pBUF +=2; 

            

              汇编 判断相等

              MOVFW  A

              XORWF B,W

              BTFSS STATUS,Z

              GOTO    ELSE

              ..............................

ELSE

           ...............................

             C语言  判断相等

             if(A==B)

             {

                  ...........................

             }

             else

              {

                    ..........................

              }


等等等 这里就不在赘述了。


关键字:PIC单片机  反汇编 引用地址:PIC单片机之反汇编

上一篇:PIC单片机之AD转换
下一篇:PIC24串口发送和接收程序

推荐阅读最新更新时间:2024-03-16 16:10

PIC单片机的数制转换
如果使用PICC编译器对PIC单片机的数制进行转换,我认为嵌套汇编是最好的办法,这样可以节省更多的空间,相对PIC一般的小容量芯片来说是最好的,下面是我做的从BCD转到BIN和从BIN转到BCD的程序。本程序使用时还有个限制,那就是BINTOBCD的二进制数要小于0x64,这样转换出来的数据才能到99以内,另外一个就BCDTOBIN最好有个数据判断功能。可能写的不是很标准,请高手指正。 另外一个是数据的反转,比如高位在前反转到低位在前,我也认为这样的程序最好使用汇编,当然我没有看编译器编译出来的效率,估计会占用更多的FLASH。 下面是数制转换的程序: //在使用前要定义几个全局变量 volatile unchar FDATA
[单片机]
PIC单片机之定时器(TMR0)
什么是定时器? 定时器顾名思义就是用来定时的。在单片机应用中常常用于各种各样的定时。比如让LED灯每隔 1S 亮一次。 这个1S 就是由定时器做到的。 指令周期 指令周期就是单片机执行一个指令所花费的时间。这也是定时器定时的最小时间单位。时钟频率/4=指令频率。1/指令频率=指令周期。 假设现在的时钟是4MHZ ,4MHz的时钟经过4分频后变成了 1MHz 其周期为0.0000001s也就是1us,这个1us就是指令周期,这1us也就是定时器定时的最小单位。 定时器与预分频器 假设在没有预分频器情况下。开启定时器 每隔一个指令周期定时器就加一。假设时钟是4MHz 也就是每隔 1us 定时器加一。 如果有了预分频器
[单片机]
<font color='red'>PIC单片机</font>之定时器(TMR0)
用PICC编译器开发PIC单片机的代码
引言 目前,在市场上应用最广泛的应该属于8位单片机,Microchip Technoloogy公司推出的8位PIC系列单片机,目前在国内市场上深受用户欢迎,已经逐渐成为单片机应用的新潮流;但遗憾的是,目前国内介绍它的C语言开发工具的书籍和文章却比较少,而且用的人也不多,广大的程序员在用其开发的过程中都在慢慢摸索,可能会走一些弯路。笔者最近在用PIC的C语言时就遇到了好些问题,在这里想和最近一段时间用PIC的C语言的一些经验和广大的底层软件程序员做一下交流和介绍希望本文对用PICC开发PIC系列单片机的人有所帮助。 目前,在国内用得比较多的是Hi-Tech的Hi-Tech PICC编译器,而且目前市场上一些国内的PIC单片机仿真
[单片机]
PIC单片机定时器1的使用方法
#include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); void init(); uint intnum; void main() { init(); while(1) { /* if(intnum==20) { intnum=0; RD0=!RD0; }*/ } } void init() { TRISD=0; PORTD=0; INTCON=0xc0; PIE1=0x01; TMR1L=(65536-50000)%256; TMR1H=(65536-50000)/256;
[单片机]
PIC单片机PICC编程实现LED闪烁控制
  在很多设计中需要有精彩而实用的 LED 闪烁来表示设备工作正常与否和工作状态。在一些实时性要求不高的设计中可以用插入延时来控制LED闪烁。      它的缺点现而易见:      1、LED闪烁方式反映慢。      2、在延时过程不能干其它工作(中断除外).浪费了资源。      3、代码雍长,真正控制LED就几个个指令,其它的延时代码占了99%的空间。      如果用TMRI或TMR2来做一个时钟,上面的种种缺点就可以避免。      下面是用TMR1作时钟的C代码(RB1、RB2、RB3控制LED)示例:   这样的框架对于基于要求实时性高的软件查询的程序是很有效的。
[单片机]
用<font color='red'>PIC单片机</font>PICC编程实现LED闪烁控制
pic单片机采用定时器中断的闪灯实验报告
1. 实验目的 学习如何使用中断 2. 任务要求 用定时器中断 方式完成 闪灯 实验 设计验证外部 边沿 中断 /电平变化中断 睡眠唤醒 3. 实验器材 单片机PIC16F886一片、LED灯一只、电阻任选、下载器(及相关的线)一个 4. 实验方案 图 1 硬件设计图 图 2 定时器中断 软件流程图 图 3 电平变化 中断 流程图 图 4 睡眠唤醒流程图 5. 实验现象分析 基础 实验部分 : 仿真 模拟,在 反转PORTA的 代码部分加上 断点 ,用 STO
[单片机]
<font color='red'>pic单片机</font>采用定时器中断的闪灯实验报告
PIC单片机之通信协议
当人们晚上迷失在野外手上只有一个手电筒,此时有直升机飞过。人们用手电筒发出三短三长三短的光线。用这个国际通用的SOS求救信号,告诉飞行员来救你。人们规定的三短三长三短的光线,代表SOS就是一种通讯协议。 单片机处理通讯协议的方法其实也类似。只不过用的不是光线而是电平。比如我们完全可以模仿SOS求救信号的方法。来创造属于自己的通讯协议。 例如:我们模仿SOS ,用高电平代替亮,用低电平代替暗。10MS(毫秒)为短,20MS为长。A单片机从一个I/O输出如下的电平。可以看出单片机输出了三短三长三短的的高电平。 B单片机从一个I/O接收如下的电平。当B单片机接收到信号的后,就可以根据程序做任何事,这个信号的代表什么,可以是SOS
[单片机]
<font color='red'>PIC单片机</font>之通信协议
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved