hex文件反编译成汇编语言外部中断1例子(汇编、hex、反汇编)
- 格式:doc
- 大小:82.00 KB
- 文档页数:21
recaf 反编译汇编语言
Recaf是一个开源的Java字节码编辑器,它提供了反编译Java
字节码的功能。
通过Recaf,你可以将Java字节码文件反编译成人
类可读的Java源代码,这样你就可以更好地理解和分析程序的工作
原理。
Recaf使用了一些反编译工具,比如Procyon和Fernflower,这些工具可以将字节码文件转换成高质量的Java源代码。
当涉及到汇编语言时,Recaf并不直接支持汇编语言的反编译。
汇编语言是一种低级语言,与Java字节码有着不同的结构和语法。
通常情况下,对于汇编语言的反编译,我们会使用专门针对特定架
构的反汇编工具,比如IDA Pro、Ghidra等。
这些工具可以将机器
码反汇编成汇编代码,但并不会直接将汇编代码转换成高级语言代码。
总的来说,Recaf是一个优秀的Java字节码编辑器,可以帮助
你分析和理解Java程序的工作原理,但对于汇编语言的反编译,你
可能需要使用其他专门的工具来实现。
希望这个回答能够帮助到你
理解Recaf和反编译的相关知识。
51单片机DIY做PLC编程有朋友想定制一个净水机控制器,有一些独特的功能要增加,但是商品控制板没有这样的功能,问我能否做一个,我觉得单片机完全能满足这种简单的控制需要,上手开始编程序时候突然感到,用PLC逻辑编这种功能是非常简单轻松的,而如果用汇编或C编却感觉有点棘手,编程效率不高,所以想为何不在单片机上实现PLC的逻辑呢?上网搜索尝试看能否找到合适的程序下载来稍微改改就能用的呢?方案几年前就有了,实际上是利用三菱的低档PLC编程软件编辑好梯形图,存盘后用专用的格式转换工具转换成HEX单片机烧写文件烧进去,尝试下载三菱PLC工具软件,但是在我的WIN7-64位系统上不能正常工作,好容易换了系统装好开发工具,但是初次上手这款开发工具,界面挺复杂的,懒得研究各个按钮的使用,由于是单片机的硬件,对于程序的编制和转换有很多限制条件,否则是转换不成功的,嫌麻烦,放弃!某宝倒是有百元PLC板出售,但是为了这么个简单的东西专门买个全功能板子有点浪费,而且其编程软件仍然是三菱的盗版软件,算了,再想办法把。
由于工作中经常接触PLC程序,对其工作原理也略知一二,网上也有相关的说明介绍,其实就是三个主要步骤,第一步扫描IO输入,第二步执行逻辑,第三步输出逻辑到IO,很简单的,最早PLC也是用单片机实现的,我为何不用汇编在51上搭建一个架构,简单的逻辑编制进去就能运转呢?其中逻辑执行步骤还是有点意思的,需要把PLC逻辑翻译成单片机的汇编语言执行,这块开始也没有把握,后来搜索到一篇百度文章,介绍了一下三菱PLC逻辑是如何翻译成汇编的,我看了下估计其实是利用反汇编工具把HEX反编译成的ASM代码,并不清晰明了,而且还带着反汇编时候的行号,仅供参考了。
搜索结果中也有几篇论文,涉及到在51单片机上实现PLC逻辑的内容,但是那些论文都是充数的,仅仅几个IO逻辑,没有什么定时器,计数器功能的体现,哎!仅供参考!看来这个PLC系统还是需要自己写了!OK!既然决定自己重写,那就开工吧!利用春节休假时间,编制了如下ASM51汇编PLC代码:代码主要架构如下:1、IO定义部分:根据所使用的单片机IO口数量,任意指定多少个I多少个O,那几个脚是I,哪几个是O都可以任意指定,在这个51系统里面设计了最大32个I,32个O,占用64个位寻址区域,其实用不到那么多,也可以分配给其它需要的标志位用,因为51系统总可位寻址地址只有128位,需要仔细分配.2、位寻址变量定义(包括各类标志位,临时变量寄存器等等)目前设计了8个计时器的Timer DN, Timer EN,共16位,8个计数器的counter reset 和counter DN 标志位共16个,专用于上升沿下降沿检测的标志位4对,占用8个,剩余用于临时变量,这些地址分配在这块变量定义区域可以根据需要任意调整3、内存规划,包括堆栈区的设置,定时器,计数器的累加值和预设值地址等等,目前初步定义8个计数器的当前计数值和预设值,8个计时器的当前计数值和预设值,共占用32个内存地址,也可根据需要调整,51单片机片内总的用户可用内存地址包括堆栈区只有128个,实际去除位寻址区和堆栈区可用的估计只有80个左右,不过对于小程序应该够用的。
ida反汇编使用方法IDA反汇编使用方法概述IDA(Interactive DisAssembler)是一款功能强大的反汇编工具,可用于逆向工程和分析二进制文件。
本文将介绍IDA的基本使用方法,帮助读者快速上手。
1. 安装与启动从官方网站下载IDA并安装到本地计算机。
安装完成后,双击打开IDA可执行文件,即可启动IDA。
2. 打开二进制文件在IDA界面中,选择“File”菜单,然后点击“Open”选项。
在弹出的文件选择对话框中,找到要分析的二进制文件并打开。
IDA将自动识别文件类型并加载相应的处理器模块。
3. 分析与反汇编一旦二进制文件加载完成,IDA会自动进行静态分析,并将二进制代码转换为可读的汇编指令。
用户可以在IDA界面的“Disassembly”窗口中查看反汇编结果。
4. 导航与搜索IDA提供了多种导航和搜索功能,帮助用户快速定位和浏览代码。
例如,按下“Ctrl+G”组合键可以跳转到指定地址;使用“Ctrl+F”组合键可以打开搜索框,快速搜索关键字。
5. 符号与变量IDA会自动识别并分析代码中的符号与变量,并在“Functions”窗口中显示。
用户可以双击函数名称,进一步查看函数的反汇编代码和相关信息。
6. 反汇编窗口IDA的主要工作区域是“Disassembly”窗口,其中显示了反汇编代码和数据。
用户可以通过调整窗口布局、设置字体大小等方式来自定义界面。
7. 交互式操作IDA支持交互式操作,在“Disassembly”窗口中可以进行多种编辑和分析操作。
例如,用户可以修改汇编代码、添加注释、标记地址等。
8. 插件与脚本IDA提供了丰富的插件和脚本接口,用户可以通过编写脚本或安装插件来扩展IDA的功能。
这些插件和脚本可以帮助用户自动化分析过程,提高工作效率。
9. 导出与保存在IDA中,用户可以将分析结果导出为多种格式,如文本、HTML、图像等。
此外,用户还可以保存IDA数据库文件,以便日后重新打开并继续分析工作。
静态库反编译
反编译静态库是一个专业的技术,它的目的是逆向分析应用程
序的源代码,以获取更多关于应用程序的信息。
静态库是一个由例行
编程组成的程序库,它包含了各种可以用来识别、翻译和改变特定机
器指令的函数、变量和常量。
首先,为了反编译静态库,我们需要从将它们编译为机器可以理
解的格式开始。
例如,我们可以使用PE文件格式来转换程序的源代码,以便将其编译为Windows可执行文件。
接下来,反编译静态库通常使用反汇编工具,例如IDA Pro,Hopper或OllyDbg。
这些工具可以帮助我们反汇编应用程序,以获取
更多关于程序中指令如何工作以及其他信息的信息。
此外,如果我们想要对源代码进行正确的深入分析,那么我们就
需要使用逆向工程工具,例如Hex-Rays反汇编器或Reverse-Engineer tools。
利用这些工具,我们可以将指令重新组合为可读的C或C++源
代码,并分析源代码的功能和结构。
最后,当我们完成源代码的分析之后,我们可以使用模拟器和调
试器来检查我们反编译改编后的源代码。
通过这种方式,我们可以更
了解应用程序的功能以及它如何与一个特定的平台交互,并确保源代
码的正确性和完整性。
总的来说,反编译静态库可以使我们更多地理解源代码的结构和
功能,并允许我们更深入地分析应用程序。
但是,反编译静态库需要
熟悉的技术,也将耗费大量的精力,因此必须慎重地考虑是否要继续
使用。
反编译初识⼀. 反编译(反汇编)简介 1.1. 为什么要反编译(汇编 assembly 反汇编 dissembly) 1.1.1. 反编译原因如下: a. 逆向破解程序,作为⼀个有逼格,素养的我肯定不会这么⼲的。
哈哈 b. 调试程序时,反汇编代码可以帮助我们理解程序(我们学习时使⽤objdump主要⽬的是这个),尤其是在理解链接脚本、链接地址等概念时 c. 把C语⾔源代码编译链接⽣成的可执⾏程序反汇编后得到对应的汇编代码,可以帮助我们理解C语⾔和汇编语⾔之间的对应关系。
⾮常有助于深⼊理解C语⾔。
1.2. 反编译命令 1.2.1. arm-linux-objdump -D led.elf > led_elf.dis 命令 a. objdump是gcc⼯具链中的反汇编⼯具,作⽤是由编译链接好的elf格式的可执⾏程序反过来得到汇编源代码 b. -D表⽰反汇编 1.2.1. 获得反编译⽂件过程 a. 此过程是基于上篇⽂章《》,前期准备参考此⽂章 b. 反编译后⽣成led_elf.disroot@ubuntu:/mnt/hgfs/windows_share/baseC/lesson1.4.13-LED# lsled.S Makefile mkv210_image.c write2sd 说明.txtroot@ubuntu:/mnt/hgfs/windows_share/baseC/lesson1.4.13-LED# makearm-linux-gcc -o led.o led.S -carm-linux-ld -Ttext 0x0 -o led.elf led.oarm-linux-objcopy -O binary led.elf led.binarm-linux-objdump -D led.elf > led_elf.disgcc mkv210_image.c -o mkx210./mkx210 led.bin 210.binroot@ubuntu:/mnt/hgfs/windows_share/baseC/lesson1.4.13-LED# ls210.bin led.elf led.o Makefile mkx210 说明.txtled.bin led_elf.dis led.S mkv210_image.c write2sdroot@ubuntu:/mnt/hgfs/windows_share/baseC/lesson1.4.13-LED#View Code 1.3. 反编译⽂件led_elf.dis分析 1.3.1. 我们选取⼀段分析 00000000 <_start>:0: e59f1060 ldr r1, [pc, #96] ; 68 <delay_loop+0x10> a. 00000000 <_start>: 表⽰标号地址、标号名字 b. 0: e59f1060表⽰指令地址、指令机器码 c. ldr r1, [pc, #96]表⽰指令机器码反汇编到的指令,由于有流⽔线的存在,此时PC值是当初指令地址+9; d. 68 <delay_loop+0x10>表⽰注释;0x68 = 96+8led.elf: file format elf32-littlearmDisassembly of section .text:00000000 <_start>:0: e59f1060 ldr r1, [pc, #96] ; 68 <delay_loop+0x10>4: e59f0060 ldr r0, [pc, #96] ; 6c <delay_loop+0x14>8: e5810000 str r0, [r1]0000000c <while>:c: e59f105c ldr r1, [pc, #92] ; 70 <delay_loop+0x18>10: e3e00008 mvn r0, #814: e5810000 str r0, [r1]18: eb00000c bl 50 <delay>1c: e59f104c ldr r1, [pc, #76] ; 70 <delay_loop+0x18> 20: e3e00010 mvn r0, #1624: e5810000 str r0, [r1]28: eb000008 bl 50 <delay>2c: e59f103c ldr r1, [pc, #60] ; 70 <delay_loop+0x18> 30: e3e00020 mvn r0, #3234: e5810000 str r0, [r1]38: eb000004 bl 50 <delay>3c: e59f102c ldr r1, [pc, #44] ; 70 <delay_loop+0x18> 40: e3e00010 mvn r0, #1644: e5810000 str r0, [r1]48: eb000000 bl 50 <delay>4c: eaffffee b c <while>00000050 <delay>:50: e59f201c ldr r2, [pc, #28] ; 74 <delay_loop+0x1c> 54: e3a03000 mov r3, #000000058 <delay_loop>:58: e2422001 sub r2, r2, #15c: e1520003 cmp r2, r360: 1afffffc bne 58 <delay_loop>64: e1a0f00e mov pc, lr68: e0200240 eor r0, r0, r0, asr #46c: 00111000 andseq r1, r1, r070: e0200244 eor r0, r0, r4, asr #474: 00895440 addeq r5, r9, r0, asr #8Disassembly of section .ARM.attributes:00000000 <.ARM.attributes>:0: 00001a41 andeq r1, r0, r1, asr #204: 61656100 cmnvs r5, r0, lsl #28: 01006962 tsteq r0, r2, ror #18c: 00000010 andeq r0, r0, r0, lsl r010: 45543505 ldrbmi r3, [r4, #-1285] ; 0x50514: 08040600 stmdaeq r4, {r9, sl}18: Address 0x00000018is out of bounds.View Code参考《朱⽼师.1.2ARM裸机课件》。
ida反汇编使用方法IDA反汇编使用方法IDA(Interactive DisAssembler)是一款强大的反汇编工具,广泛应用于逆向工程领域。
使用IDA可以将汇编代码还原为高级语言代码,方便分析和理解软件的运行机制。
本文将介绍IDA反汇编的使用方法,帮助读者快速上手。
一、安装和启动IDA我们需要下载和安装IDA软件。
在官方网站上选择适合自己操作系统的版本进行下载,并按照安装向导进行安装。
安装完成后,双击打开IDA软件。
根据操作系统的不同,可能会出现一些设置向导。
一般情况下,我们可以选择默认设置,然后点击“Finish”完成设置。
二、加载可执行文件在IDA的主界面中,点击“File”菜单,然后选择“Open”选项。
在弹出的对话框中,选择要反汇编的可执行文件,然后点击“OK”按钮。
IDA会自动识别可执行文件的类型,并加载到主界面中。
在加载过程中,IDA会分析可执行文件的结构,并生成反汇编代码。
三、查看反汇编代码在IDA的主界面中,我们可以看到左侧是反汇编代码的列表视图,右侧是对应的汇编代码。
我们可以通过双击列表视图中的函数或者地址,来查看对应的汇编代码。
在汇编代码窗口中,可以看到每行代码的地址、机器码和汇编指令。
四、分析反汇编代码在IDA的主界面中,我们可以通过一些功能来分析反汇编代码,以便更好地理解软件的运行机制。
1. 函数跳转:在汇编代码窗口中,可以看到一些跳转指令,如call、jmp等。
我们可以通过双击这些指令,来跳转到相应的函数或地址处。
2. 函数命名:在IDA中,可以给函数进行命名,以方便后续分析。
选中要命名的函数,点击右键,然后选择“Rename”选项进行命名。
3. 数据类型识别:IDA可以自动识别汇编代码中的数据类型,并在反汇编代码中进行标注。
我们可以通过双击数据标注,来查看详细的数据类型信息。
4. 交叉引用分析:在IDA中,可以通过交叉引用分析,查看函数或变量的调用关系。
选中要分析的函数或变量,点击右键,然后选择“Xrefs to”或“Xrefs from”选项进行分析。
objdump反汇编指令
objdump是一个反汇编工具,用于将一个二进制文件中的机器指令转化为汇编指令。
以下是objdump的一些常用选项以及对应的反汇编指令:
1. -d: 反汇编所有的代码段。
输出结果包括机器指令和对应的汇编指令。
2. -D: 类似于-d选项,但是输出结果还包括符号表、调试信息等。
3. -S: 反汇编代码段,并且将反汇编指令与源代码进行交替显示。
输出结果类似于源代码和对应的汇编指令的混合。
4. -M: 指定反汇编器的架构。
例如,使用-M x86-64选项可以指定反汇编目标为x86-64架构。
5. -m: 显示可执行文件的某一特定部分的反汇编结果。
6. -r: 显示重定位信息,包括重定位表和符号表。
7. -t: 显示BSS段的内容。
8. -j: 选择特定的代码段进行反汇编。
例如,-j .text可以只反汇编.text段。
9. -C: 还原由C++编译的函数名。
以上是一些常用的objdump选项和对应的反汇编指令。
使用objdump可以帮助我们查看二进制文件中的机器指令,以及对应的汇编指令,从而进行代码分析和调试。
汇编语言典型例子详解汇编语言例子汇编语言典型例子详解汇编语言是一种底层的编程语言,用于与计算机硬件进行交互和控制。
在计算机科学领域,学习汇编语言例子可以帮助我们深入了解计算机的工作原理和底层运行机制。
本文将详细解析几个典型的汇编语言例子,帮助读者更好地理解和掌握汇编语言编程。
1.加法运算的例子假设我们需要编写一个汇编语言程序来实现两个数字的加法运算。
以下是一个典型的汇编语言例子:```assemblysection .datanum1 db 5num2 db 3result db 0section .textglobal _start_start:mov al, [num1] ; 将num1的值加载到寄存器al中add al, [num2] ; 将num2的值与al中的值相加mov [result], al ; 将结果保存到result中; 输出结果到屏幕mov ah, 0x0E ; 设置打印字符的功能码mov al, [result] ; 将结果加载到al寄存器中add al, 30h ; 将结果加上字符'0'的ASCII码,使其变为可打印字符 int 10h ; 调用BIOS中断打印结果; 退出程序mov eax, 1 ; 设置退出系统调用号int 0x80 ; 调用系统调用中断退出程序```上述例子使用了汇编语言的指令和寄存器来完成加法运算,并将结果保存到result变量中。
最后,通过BIOS中断调用将结果打印到屏幕上,并使用系统调用中断退出程序。
2.循环控制的例子下面是一个使用汇编语言编写的简单循环控制的例子:```assemblysection .datacount db 10 ; 循环次数sum db 0 ; 计数器section .textglobal _start_start:xor rcx, rcx ; 清零计数寄存器rcxloop_start:cmp cl, [count] ; 比较计数寄存器和循环次数je loop_end ; 若相等,跳转到循环结束add cl, 1 ; 计数器自增1add [sum], cl ; 将计数器的值加到sum中jmp loop_start ; 无条件跳转到循环开始loop_end:; 输出结果到屏幕mov ah, 0x0E ; 设置打印字符的功能码mov al, [sum] ; 将sum加载到al寄存器中add al, 30h ; 将结果加上字符'0'的ASCII码,使其变为可打印字符 int 10h ; 调用BIOS中断打印结果; 退出程序mov eax, 1 ; 设置退出系统调用号int 0x80 ; 调用系统调用中断退出程序```上述例子使用了循环控制指令来实现对计数器和循环次数的操作。
本帖最后由yjmwxwx 于2014-12-11 00:12 编辑
想仿制别人的一款产品,但是只有固件没有源码无法修改程序,于是研究了一下反汇编。
下面把过程贴出来,方法对错我也不知道,我小学文化不懂英文操作这款软件有困难。
目标某开发的一个LED小程序
把HEX文件转为BIN文件
打开IDA
打开刚刚的BIN文件
选择ARM:
然后还有个高级选项选择Cortex-M (忘记截图)
ROM地址
反汇编
开头的是数据,第一个是站顶,第二个是复位向量,我们从他解开程序按D健转换
跳转到复位向量指向的地址
按C键转换成代码
反汇编完成,观看程序结构
2014-12-10 23:31 上传下载附件(72.81 KB)。
汇编程序: ORG 0000H LJMP MAIN ORG 0013H LJMP INT ORG 0030H MAIN: SETB EA SETB EX1 SETB PX1 SETB IT1 MOV A, #01H HERE: SJMP HERE ORG 0100H INT: MOV P1, A RL A RETI END
Hex文件 :020800F3 :0C0FE4F6D8FD758 :020030CB :020100E7 :0C003000D2AFD2AAD2BAD28A740180FEEC :04010000F1 :00000001FF
个人解释:(其实反汇编过程不能反映真实程序要执行的过程,因为外部中断1的触发需要配合硬件电路来实现才能产生,因此单纯执行汇编程序仅仅是顺序执行,并没有触发中断响应,进而执行中断服务程序。)
对hex文件进行反编译: ;========================================================================== ;====Power Disassembler for MCS-51 and 6502================================ ;========================================================================== ; Writen by: 覃远高 ; Copyright: 覃远高 ; HomePage: E-mail ; Tel: ; Update: ,2000 ;========================================================================== ;===========Disassemble information======================================== ;========================================================================== ; File Name: C:\Users\wugaochao\Desktop\ ; IC Body: MCS-51 ; Date: 2016/9/13 ;========================================================================== ;========================================================================== ;标号==============指令================================地址===机器码======= ;========================================================================== Q0000: LJMP Q0030 ;0000 02 00 30 ;========================================================================== Q0003: DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........ Q000B: DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........ Q0013: DB 02H, 01H, 00H, 00H, 00H, 00H, 00H, 00H ;........ Q001B: DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........ Q0023: DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........ Q002B: DB 00H, 00H, 00H, 00H, 00H ;..... ;========================================================================== Q0030: SETB EA ;0030 D2 AF SETB EX1 ;0032 D2 AA SETB PX1 ;0034 D2 BA SETB IT1 ;0036 D2 8A MOV A,#01H ;0038 74 01 SJMP $ ;003A 80 FE NOP ;003C 00 NOP ;003D 00 NOP ;003E 00 NOP ;003F 00 NOP ;0040 00 NOP ;0041 00 NOP ;0042 00 NOP ;0043 00 NOP ;0044 00 NOP ;0045 00 NOP ;0046 00 NOP ;0047 00 NOP ;0048 00 NOP ;0049 00 NOP ;004A 00 NOP ;004B 00 NOP ;004C 00 NOP ;004D 00 NOP ;004E 00 NOP ;004F 00 NOP ;0050 00 NOP ;0051 00 NOP ;0052 00 NOP ;0053 00 NOP ;0054 00 NOP ;0055 00 NOP ;0056 00 NOP ;0057 00 NOP ;0058 00 NOP ;0059 00 NOP ;005A 00 NOP ;005B 00 NOP ;005C 00 NOP ;005D 00 NOP ;005E 00 NOP ;005F 00 NOP ;0060 00 NOP ;0061 00 NOP ;0062 00 NOP ;0063 00 NOP ;0064 00 NOP ;0065 00 NOP ;0066 00 NOP ;0067 00 NOP ;0068 00 NOP ;0069 00 NOP ;006A 00 NOP ;006B 00 NOP ;006C 00 NOP ;006D 00 NOP ;006E 00 NOP ;006F 00 NOP ;0070 00 NOP ;0071 00 NOP ;0072 00 NOP ;0073 00 NOP ;0074 00 NOP ;0075 00 NOP ;0076 00 NOP ;0077 00 NOP ;0078 00 NOP ;0079 00 NOP ;007A 00 NOP ;007B 00 NOP ;007C 00 NOP ;007D 00 NOP ;007E 00 NOP ;007F 00 NOP ;0080 00 NOP ;0081 00 NOP ;0082 00 NOP ;0083 00 NOP ;0084 00 NOP ;0085 00 NOP ;0086 00 NOP ;0087 00 NOP ;0088 00 NOP ;0089 00 NOP ;008A 00 NOP ;008B 00 NOP ;008C 00 NOP ;008D 00 NOP ;008E 00 NOP ;008F 00 NOP ;0090 00 NOP ;0091 00 NOP ;0092 00 NOP ;0093 00 NOP ;0094 00 NOP ;0095 00 NOP ;0096 00 NOP ;0097 00 NOP ;0098 00 NOP ;0099 00 NOP ;009A 00 NOP ;009B 00 NOP ;009C 00 NOP ;009D 00 NOP ;009E 00 NOP ;009F 00 NOP ;00A0 00 NOP ;00A1 00 NOP ;00A2 00 NOP ;00A3 00 NOP ;00A4 00 NOP ;00A5 00 NOP ;00A6 00 NOP ;00A7 00 NOP ;00A8 00 NOP ;00A9 00 NOP ;00AA 00 NOP ;00AB 00 NOP ;00AC 00 NOP ;00AD 00 NOP ;00AE 00 NOP ;00AF 00 NOP ;00B0 00 NOP ;00B1 00 NOP ;00B2 00 NOP ;00B3 00 NOP ;00B4 00 NOP ;00B5 00