代码与数据分离的反汇编程序设计
反汇编——精选推荐

反汇编反汇编反汇编:把⽬标代码转为汇编代码的过程。
通常,编写程序是利⽤⾼级语⾔如C,Pascal等⾼级语⾔进⾏编程的,然后再经过编译程序⽣成可以被计算机系统直接执⾏的⽂件。
反汇编即是指将这些执⾏⽂件反编译还原成汇编语⾔或其他⾼级语⾔。
但通常反编译出来的程序与原程序会存在许多不同,虽然执⾏效果相同.gdb相关操作:b linenumber 设置断点run 运⾏disassemble 获取汇编代码⽤i(nfo) r(egisters)查看各寄存器的值⽤x查看内存地址中的值具体步骤:设置断点在main函数调⽤f函数的位置gdb> b maingdb> run运⾏gdb> disassemble反汇编display /i $pci rx查看内存中的内容si执⾏下⼀条汇编反汇编:使⽤gcc - g example.c -o example -m32指令在64位的机器上产⽣32位汇编,然后使⽤gdb example指令进⼊gdb调试器:⽤gcc在64位机器上编译⼀个32位的程序,遇到报错,具体如下图:这是因为编译64位Linux版本32位的⼆进制⽂件,需要安装⼀个库,使⽤指令sudo apt-get install libc6-dev-i386进⼊之后先在main函数处设置⼀个断点,再run⼀下,使⽤disassemble指令获取汇编代码,⽤i(info) r(registers)指令查看各寄存器的值:可见此时主函数的栈基址为0xffffd1e8,⽤x(examine)指令查看内存地址中的值,但⽬前%esp所指堆栈内容为0,%ebp所指内容也为0以上为⼊门⼩练习,接下来让我们直接进⼊f函数中,查看f函数的每⼀步汇编代码“display /i $pc” 其中 $pc 代表当前汇编指令,/i 表⽰以⼗六进⾏显⽰。
当需要关⼼汇编代码时,此命令相当有⽤。
这样在每次执⾏下⼀条汇编语句时,都会显⽰出当前执⾏的语句。
为什么要反汇编?反汇编文件的生成和解读

为什么要反汇编?反汇编文件的生成和解读为什么要反(汇编)反汇编顾名思义就是汇编的逆过程,将二进制文件反汇编成汇编代码。
(arm)-(linux)-objdump是交叉编译工具链里的一个工具,专门用来反汇编的,将二进制代码反汇编成汇编代码来查看。
为什么要反汇编1.逆向破解。
将可执行程序反汇编得到汇编代码,再根据汇编代码推理出整个程序的逻辑。
这个不是一般人能做的,能看懂大量汇编语言写的程序都很困难了,更别说反推别人的代码逻辑。
2.调试程序时可以帮助我们理解并(检测)生成的可执行程序是否正常,尤其是在理解链接脚本和链接地址等概念时。
3.(C语言)的源代码编译链接生成的可执行文件再反汇编,可以帮助我们理解C语言和汇编语言的对应关系,有助于深入理解C 语言。
反汇编文件的生成和解读反汇编文件的生成:上面是一个简单的Makefile,功能是把源文件.S和.c先编译成.o 文件,再把.o文件链接成.elf的可执行文件。
arm-linux-objdump -D (led).elf > led_elf.dis是将led.elf反汇编成ed_elf.dis。
源文件:star.s是一个汇编文件star.s是一个学习S5PV210开发板时点亮LED的汇编程序,由开始、点亮、延时和死循环组成,在这里并不关注具体实现的功能,重点是和反汇编生成的文件进行对照。
得到的反汇编文件:led_elf.dis解析:1.第一行:led.elf: file f(or)mat elf32-littlearm。
表明此汇编程序是由led.elf生成,程序是32的小端模式。
2.00000000 :前面的00000000是标号的地址,是标号,对应start.s的_start标号。
其实标号就相当于C语言中的函数名,在C语言中也可以用函数名代表函数的首地址,在这里可以得到印证。
反汇编的标号就是由汇编文件得来的,这样可以方便我们找到反汇编文件和汇编文件对应的部分。
反汇编入门经典教程

反汇编入门经典教程反汇编是一种通过逆向工程将机器码转换为可读的汇编代码的过程。
它是了解程序内部工作原理、检测和修复软件漏洞、进行逆向工程等任务的重要工具。
以下是一个反汇编入门经典教程。
第一步:安装反汇编工具要进行反汇编,您需要一个适当的反汇编工具。
一些常用的反汇编工具包括IDA Pro、OllyDbg和Ghidra。
选择其中一个工具,并按照其官方指南安装和配置。
第二步:了解基础知识在开始反汇编之前,您需要掌握一些基础知识。
首先了解汇编语言的基本概念,如寄存器、指令、内存等。
还应该了解不同的汇编指令以及它们的功能和用法。
您可以通过阅读相关的教程和文档来学习这些知识。
第三步:打开目标程序使用反汇编工具打开您要分析的目标程序。
您可以选择一个已编译的可执行文件或者一个在内存中运行的进程。
请确保您具有对该文件或进程的合法访问权限。
第四步:分析代码一旦您打开了目标程序,您将看到程序的汇编代码。
您可以使用工具提供的各种功能来分析代码。
以下是一些基本的分析技巧:1.寻找入口点:在大型程序中,找到程序的入口点是一个重要的第一步。
入口点通常是程序启动时执行的第一条指令。
2.跟踪程序流程:使用调试器功能可以帮助您了解程序的执行流程。
您可以设置断点,在执行到断点时暂停程序并检查寄存器和内存的值。
3.理解函数调用:函数调用是程序执行流程的重要部分。
您可以查看函数调用的汇编指令,并分析参数传递、返回值和栈操作等信息。
4.检查条件和跳转:程序中的条件和跳转指令对于控制程序流程起着重要作用。
您可以跟踪这些指令,以了解程序在不同情况下的执行路径。
第五步:理解代码功能一旦您分析了程序的汇编代码,您将能够了解程序的功能和工作原理。
您可以通过查看函数、变量和各种数据结构的命名来获得有关代码的更多上下文信息。
理解代码的功能将有助于您进行进一步的分析和调试。
第六步:修改代码在一些情况下,您可能希望修改程序的汇编代码。
例如,您可能希望修复一个软件漏洞或者修改程序的行为。
vb逆向反汇编 简单例

vb逆向反汇编简单例VB逆向反汇编简单例VB(Visual Basic)是一种面向对象的编程语言,广泛应用于Windows平台的软件开发。
在软件开发过程中,有时需要对已编译的程序进行逆向分析,以了解其内部实现或进行修改。
反汇编是一种逆向工程的技术,它可以将已编译的程序转换回可读的汇编代码,从而使开发者能够深入了解程序的内部结构和运行机制。
在VB中进行反汇编可以使用一些专业的工具,例如IDA Pro、OllyDbg等。
这些工具可以读取程序的二进制文件,将其转换为汇编代码,并提供一些高级的分析和调试功能。
下面我们以一个简单的例子来介绍如何使用VB进行反汇编。
假设我们有一个编译好的VB程序,它的功能是计算两个数的和。
我们想要了解这个程序的内部实现,以便对其进行修改或优化。
首先,我们需要使用反汇编工具打开这个程序的二进制文件。
在工具的界面上,我们可以看到程序的汇编代码。
汇编代码是一种低级的机器码表示方式,它使用一些特定的指令来操作计算机的硬件。
在VB程序的反汇编代码中,我们可以看到一些常见的指令,例如mov、add、sub等。
这些指令用于将数据从一个位置复制到另一个位置,进行加法、减法等基本的运算操作。
通过阅读汇编代码,我们可以了解到程序的执行流程和数据处理过程。
例如,我们可以看到程序中定义了一些变量和常量,它们用于存储计算过程中的中间结果。
我们还可以看到一些条件判断和循环结构,用于控制程序的执行流程。
通过分析这些结构,我们可以了解到程序的逻辑和算法。
在进行反汇编分析时,我们还可以使用一些调试功能来辅助我们的分析工作。
例如,我们可以设置断点,在程序运行到某个特定的位置时中断执行,并查看此时的内存状态和寄存器的值。
这些信息可以帮助我们理解程序的运行过程和数据变化情况。
除了分析程序的执行流程和数据处理过程,我们还可以通过反汇编了解程序的一些特性和功能。
例如,我们可以看到程序中使用的一些API函数或外部库函数的调用。
单片机反汇编

单片机反汇编单片机反汇编是指将单片机的机器码翻译成汇编代码的过程。
在程序调试或逆向工程中,反汇编技术是必不可少的。
本文将介绍单片机反汇编的基本原理和实际应用。
一、反汇编原理单片机的机器码是由指令和数据组成的二进制代码。
指令是CPU执行的基本操作,例如数据传输、算术运算、逻辑运算等。
不同的单片机芯片有不同的指令集,但它们都遵循一定的规则,例如指令的长度和格式。
在反汇编过程中,我们需要根据这些规则将机器码解析成汇编指令。
二、反汇编工具反汇编工具有很多种,例如IDA Pro、OllyDbg、Ghidra等。
这些工具可以自动将机器码翻译成汇编指令,并提供调试和逆向分析的功能。
不同的工具有不同的特点和优缺点,选择适合自己的工具是非常重要的。
三、反汇编实例以下是一个简单的反汇编实例,以AT89S52单片机为例。
假设我们要反汇编一个简单的LED闪烁程序。
78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0 78 F0 90 F0MOV P1,#0xFFL1: ACALL DELAYCPL P1.0SJMP L1解析:第一条指令MOV P1,#0xFF是将0xFF赋值给P1寄存器,即将P1所有引脚都输出高电平,点亮LED灯。
如何实现单片机程序代码的反汇编

如何实现单片机程序代码的反汇编要正确获取程序的目标代码,首先要明确程序代码的存放地点。
51单片机的程序存储器最大空间为64KB,在一个实际的应用系统中,程序存储器的分布情况可能有以下几种:(1)只使用了片内程序空间。
而没有使用片外的程序空间。
其硬件特征为:/EA引脚接VCC;/PSEN引脚为空脚。
这种情况比较简单,全部应用程序都在单片机内部的程序存储器中,我们只要使用编程器将程序代码读出来,保存为一个目标代码文件就可以了。
要注意的是,有一些新型的单片机具有加密功能,如果进行了加密,其中的程序代码就是不能读出。
(2)没有使用片内程序空间,片外程序空间由单个存储芯片构成。
其硬件特征为:/EA引脚接GND;/PSEN引脚接到一个存储芯片上。
这种情况下,全部应用程序都在单片机外部的程序存储器中,原则上我们只要使用编程器将程序代码读出来,保存为一个目标代码文件就可以了。
但要注意的是,这样得到的并不一定是真正的目标代码,因为,为了防止程序代码被读取、反汇编,很多设计人员都采取跳接线的方法,将某些地址线跳接或将某些数据线跳接或将地址线、数据线都进行跳接,从而保护自己的程序不被反汇编(参见图1~图4)。
这样一来,我们从存储器中读取的就不是真正的程序目标代码,必须进行某种变换,将其转换为真正的程序目标代码,才能进行反汇编。
要进行目标代码的变换,首先必须根据硬件画出实际的地址和数据的接线图,然后借助于工具软件进行变换。
在“51汇编集成开发环境”(其下载网址为www1.skycn.com/SOFt/15074/html)中,提供了一个变换工具,从软件界面的[辅助工具]—[目标代码转换]-[bin代码还原]就可以启动这个工具。
单击[浏览]可以选择要转换的代码文件,注意:这里的代码文件只能是二进制代码文件,。
汇编语言-反汇编
C语言在汇编语言层面的实现——以“Database”为例2013/5/18目录1C语言与汇编语言 (3)2程序“Database”简介 (4)2.1程序功能 (4)2.2实现效果 (4)3程序在汇编语言层面的实现 (6)3.1输入检查 (6)3.2指针操作 (10)3.3函数参数传递 (20)4小结 (21)5附件 (22)5.1C程序主函数 (22)5.2C程序反汇编所得代码 (22)1C语言与汇编语言我们所熟悉的是高级程序设计语言。
这些语言与自然语言相当接近,我们可以自如地使用它们来表述我们的算法。
而后,在汇编器、编译器的作用下,高级语言代码转化为机器语言代码,成为可供机器执行的程序。
高级语言是概念上的语言,并不依赖与具体机器,因而具备较强的移植性,且比较简洁。
汇编语言是用助记符表示的机器语言的操作码,每条汇编语言语句对应一条机器语言指令。
因此,汇编语言因机器而异,可移植性较差。
而由于Intel处理器的广泛使用,Intel汇编语言变成了事实上的标准汇编语言。
汇编语言与机器联系紧密,因而汇编语言有更高的效率,能调用更多的资源,具有强于高级语言的能力;但这种特性同时也决定了汇编语言更为繁杂,编写起来难度更大,也更繁琐。
高级语言的简洁性、可移植性与汇编语言的复杂性、不可移植性,似乎是矛盾的;然而,两种语言最终都能在相同的机器上生成相同功能的可执行文件。
这种矛盾背后的统一让人好奇。
为了探究这种统一,我们不妨限制矛盾:在统一使用Intel32处理器的时候,汇编语言的不可移植性显然可以忽略。
那么剩下来的问题就是,简洁的高级语言如何翻译成繁杂的汇编语言,在翻译的过程中我们会付出什么代价,而使用高级语言又能有什么优势。
C语言的功能在高级语言中不是最强大的;但是C语言应该是最好懂的,因为C语言能清晰地表现出代码书写者的算法。
而且,C语言在不少功能上接近硬件,甚至被称为“中级语言”,这样的语言在翻译过程中不会产生太多不同的代码,我们可以专注地研究:为了让繁杂的语言变简洁,我们要付出多少代价;这些代价,又是否值得。
Linux下简单C语言小程序的反汇编分析
Linux下简单C语⾔⼩程序的反汇编分析韩洋原创作品转载请注明出处《Linux内核分析》MOOC课程写在开始,本⽂为因为参加MOOC相关课程⽽写的作业,如有疏漏,还请指出。
选了⼀门Linux内核分析课程,因为阅读内核代码中或多或少要涉及到At&T汇编代码的阅读,所以这⾥写下⼀个对⼀个简单C命令⾏程序的反汇编分析过程,⼀⽅⾯完成作业,另⼀⽅⾯当作练⼿。
下⾯开始:1、编写我们的C语⾔⼩程序这⾥我们使⽤简单的例⼦,代码如下:1 #include <stdio.h>23int exG(int x)4 {5return x + 5;6 }78int exF(int x)9 {10return exG(x);11 }1213int main(void)14 {15return exF(10) + 2;16 }使⽤vim等编辑器写⼊上述代码,保存到main.c,然后使⽤下⾯命令⽣成汇编源⽂件:x86系统:$gcc -S -o main.s main.cx64系统:$gcc -m32 -S -o main.s main.c因为我们这⾥以32位平台为例⼦,所以在x64机器上要加上-m32来使GCC⽣成32位的汇编源⽂件。
2、处理源⽂件执⾏完上述命令后,当前⽬录下就会有⼀个main.s的⽂件,使⽤vim打开,不需要的链接信息[以"."开头的⾏],得到如下汇编代码:1 exG:2 pushl %ebp3 movl %esp, %ebp4 movl 8(%ebp), %eax5 addl $5, %eax6 popl %ebp7 ret8 exF:9 pushl %ebp10 movl %esp, %ebp11 pushl 8(%ebp)12 call exG13 addl $4, %esp14 leave15 ret16 main:17 pushl %ebp18 movl %esp, %ebp19 pushl $1020 call exF21 addl $4, %esp22 addl $2, %eax23 leave24 ret可以看到这个⽂件⾥是GCC帮我们⽣成的汇编代码,这⾥需要说明下AT&T格式和intel格式,这两种格式GCC是都可以⽣成的,如果要⽣成intel格式的汇编代码,只需要加上 -masm=intel选项即可,但是Linux下默认是使⽤AT&T格式来书写汇编代码,Linux Kernel代码中也是AT&T格式,我们要慢慢习惯使⽤AT&T格式书写汇编代码。
反汇编器设计
反汇编器设计1.传统静态反汇编算法静态反汇编是指在对可执行代码进行反汇编的过程中,不执行相关的代码,通过对代码的静态分析得到汇编程序,从而获得程序功能的方法。
传统静态反汇编算法有两种:线性遍历算法和递归遍历算法。
1.1线性遍历算法线性遍历算法是指从程序的起始字节处开始反汇编,简单地遍历程序的整个代码区,反汇编它遇到的每一条指令,若遇到非法指令则结束反汇编过程。
线性遍历算法的流程如下:Proceduer LineaDrisasm(addr){While (startAddr<=addr<=endAddr){I = 在地址addr处反汇编所得到的指令;Addr += length(); //继续遍历下一条指令}}线性遍历算法的优点在于它能在很大程度上对程序的每一条指令进行识别;但是由于没有考虑二进制代码的控制流信息,因而不能区分代码和数据:它会把遇到的每个字节转化为指令,所以嵌入到代码中的数据也会被误作为指令,因而会生成很多错误的反汇编指令,直到遇到与任何有效的操作码都不相匹配的字节才会停止反汇编过程。
如下面的例子所示:0x0F 0x85 0xC0 0x0F 0x85......如果把0x0F看作是代码字节,得到的反汇编结果如下:jne offset相反,如果把0x0F当作数据字节,而把0x85当作代码字节,会得到如下的反汇编结果:0x0F //数据test eax, eaxjne offset由此可见,单个反汇编错误不仅造成对嵌入代码中的数据的不正确转换,而且会造成许多后续的反汇编错误。
1.2递归遍历算法递归遍历算法试图用反汇编出来的控制流指令来指导反汇编过程,它以目标程序的入口地址为某个模块的起始地址并开始反汇编,若遇到非转移类指令,则反汇编过程顺序向下;若遇到转移类指令,则将转移的目标地址作为新的程序基本模块的起始地址,并从该地址处继续反汇编过程。
递归扫描的流程如下伪代码: RecursiveSweep(startAddr,endAddr){addr = startAddr;while(addr >= startAddr && addr <= endAddr){if(addr has been visited already)return;I = decode instruction at address addr;mark addr as visited;if(I is a branch or function call){for each possible target t of I{RecursiveSweep(t, endAddr);}}elseaddr += length(I);}}递归遍历算法的最大优点在于:它可提取程序的控制流,并以此为基础来指导反汇编过程,从而跳过嵌入在程序段中的数据,产生较为准确的反汇编结果。
C语言中的反汇编和逆向工程理解程序的实现和分析第三方代码
C语言中的反汇编和逆向工程理解程序的实现和分析第三方代码C语言中的反汇编和逆向工程:理解程序的实现和分析第三方代码在计算机科学领域中,反汇编(Disassembly)和逆向工程(Reverse Engineering)是重要的技术,能够帮助我们理解程序的实现和分析第三方代码。
特别是在C语言开发中,反汇编和逆向工程技术的运用具有重要意义。
本文将介绍C语言中的反汇编和逆向工程,并探讨如何正确利用这些技术实现对程序的深入分析。
一、反汇编的概念和作用反汇编是将机器代码(二进制代码)转换为汇编语言(Assembly Language)的过程。
在C语言开发中,使用反汇编可以将程序的二进制文件转换成可读性更高的汇编代码,帮助开发者了解程序的内部实现。
通过反汇编,开发者可以深入理解程序的工作原理,优化代码效率以及发现存在的问题。
二、逆向工程的概念和应用逆向工程是通过对已有程序代码的分析,推断其设计原理和实现逻辑的过程。
C语言的逆向工程技术可以帮助我们研究第三方代码,了解其功能实现和算法设计。
逆向工程主要应用于研究竞争对手的产品、发现潜在漏洞或弱点、修改源码以适应自己的需求等方面。
三、反汇编与逆向工程的关系反汇编和逆向工程是紧密相关的技术。
通过反汇编,我们能够将程序的二进制代码转换为汇编代码,并通过逆向工程技术来推断程序的实现和设计逻辑。
反汇编是逆向工程的基础步骤,为后续的逆向分析提供了必要的信息。
四、利用反汇编和逆向工程分析第三方代码1. 准备工作在分析第三方代码之前,我们首先需要获取目标程序的二进制文件。
通过使用反汇编工具,我们将目标程序转换为可读性更高的汇编代码。
2. 程序分析在获得汇编代码后,我们可以通过分析程序的指令执行顺序、重要函数的实现和数据结构的设计,来理解程序的功能和实现逻辑。
这一过程需要借助逆向工程技术,包括调试工具、静态和动态分析等方法。
3. 代码优化通过分析第三方代码,我们可以发现其中存在的性能瓶颈或者不合理之处。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
序设计时这种链表数据结构不再适台 。 通过对 目标代
码 结构 的分析 和 指令 控 制 模 型 的 建立 , 我们 发现 用 栈 或 队列 的数 据结 构 比链表 数 据 结 构 优越 : 序设 计逻 程 辑 清 晰 、 历 算法 易 于实 现 。 遍 图 1 转移 、 用指 令 流 调 勾 丁分离 指令 和代码 , 【 程 序 与汇 编 程 序 及 反{ 编 = 软件仿真程序不同, 它对转移指令和调用指 令佧同样 的处 理 , 因为 转移 指 每 的两 分 支 必 然 都 是 代 码 , 所
图 2给 出 由汇 编 程序生 成有 向图 G 的 一中 实铡
E
在 遍 历 转 移 指 令 的 两分 支 之 一 后 应 返 回到 另一 分 支 并遍 历该 分支 C U 的 指令 解 释 中转 移 指 令 和调 用 P
指 令对 P C的 操作 基 奉一一 . 存 在 下条 措 争地 址 迁 致 但 栈 与币 暑 栈 的 制 。 于 分离 代 码与 数 据 的反 汇 编程 E 对 宁 . 移 指令 的 蜀 一 转 分支 向地 址 也 必须 栈
吗 ?空 , ( O … 转 1) 一结 束 f ( ) 4 本节 点 已被 访 问
顺 序 执行 指 令 并 且其 地 址 不 为 任 伺转 移 指 令 的
目 的地址 —— 地址 作为 图 G的 节 点 , 在实 际 的反汇 编
一
3 d.
维普资讯
计算机工程 与应 用
一
l9 . 65 9
· 究与探讨 · 研
了 ]
西 北I亚 大学 刘卫束 高立娥 史 、 秀珍 /
丁’ ; 』, ;
A 摘 要
关键词
本 文 介 绍 1循 环 码 校验 的 基 本 原 理 , 详 细 地介 绍 j循 环 码 捩 验 在辁 并 洲 计 算 机 程 序存 储 器 故 障 中 的应 用 方 法 。
边。
0 O0I 0 ft l 帅V^ C ^. 0 # n
( ) 结 存 在 指 令 流 向 的 每两 节 点 生 成 图 G 的有 向 d联
茎 丧
.
x ̄ T ' R T 帅
J 】 l mp Z 』
A L RS T L E L
v uⅫ .
H u L oP P o
执 行后 P C不会返圊到该分支( 转移后 P C再执行刊 该 分支 不包 括在 内 ) 。调用操 作在 结束 后 ( 回指令 ) 返
将返 圊 到原 来的 P C流 向上
r一 一 ~ 厂 高_
传统 的方法中采用 了链表数 据结构对 P C值进行跟
踪记 录 - 的遍 历算 法 复 杂 、 程 实现 困难 , 链 表搜 它 编 且 索时 间和 分支 判 断数 量 呈 指数 增 长 。 大 的反汇 编 程 在
一
2 微处理机指 令控制 机制与汇编程序特 点
指令 计数 器 P c有两 种 基 本 的操 作方式 :
2 J 顺 序 执 行 .
.3 一 3
维普资讯
·
研 究与探讨 ·
19 . 计算机工程 与应用 65 9
程 序设 计 时应 特 它们 作 为图 G 的节 点 。
间大 、 测故 障 的种 类 较 少 、 测 故 障的概 率较 低 。 检 检 循 吗 ? , () ( ) 节 点被访 问标志 () 是 转 2 5置 6本节 点
有 两十 T节 点 吗 ?是 。 ( ) ( ) 一 十下节 点) : 转 8 7 ( 取下 节 点 。 ( ) ( ) 两节 点之 一入 栈 ( ) 另 一节 转 4 8 将 9琅 点 ,转 ( ) ( 0 结 柬 4 1 )
2 2 非顺序执行 .
} 调用
I
L 返 回
在 第 一种顺 序执 行 方式 中 , 执 行 一 条 顺 序指令 每 P C增 加该 指 令 的长度 ( 字节 数 或 字数 ) 。在 第二 种 非 顺 序执舸 方式 中 P c酶 操作 由程 序状 态 字 P W 、 址 S 寻 目标 地址 决定 。在汇编 程 序及 软 件 仿真 程 序 中 , 移 转 指 令 和 调 用 指令 的 操作 在 指 令 流 的 流 向上 有 一本 质
指令 流跟踪
代码遍 历算法
软 件仿 真
代码地址栈
r 转 移
搬 处 理 器 指令 的执 行 过 程 严 格 受 指 令计 数 器 指 针 P 的控 制 。程序 存 储器 空 间 中( 目标 代码 中 ) C 即 的 单元 是否为 指 令 由该 单 元 是 否 被 P c访 问或 P C是否 访 问该 单 元 的前 面 某 个单 元 并 且其 代 羁 长度 区 间是 否包 含此单 元 。 该原 则为 区 分代 码 与 数据 提供 丁 充分 必要 的判 断依 据 。 过 对 P 通 C值 的跟踪 记录 , P 将 C访
美 国 AD 公 司 的数 字 信 号 处 理 芯 片 D P一 2 X 系 列 、 S 1X MOTOLORA
公 司 的 6HC1 8 l系列 、 I NTE 公 司 的 8 5 L 0 1和 8 9 0 8系列 设 计 j代 码 与
数 据 分 离的 反 汇编 程 序 。
关 键 词
t 一引言
3 2 反 汇 编程 序 的 遍 历 算 法 .
分 离 存 储 器空 间 巾的 代码和 数 据在 反 舡编 程 l 牟 设计 中反 映 为 生 成 图 。 的 垒部 节 点 并寻 找 一种 苒 法 遍历 这 些节 点 以链表 数据 结构 为基 础 的多遍 扫 謦 疗 法 将 节 点 的生 成 和节 点 的遍 历分成 两 步 进行 , 种 两 这 步 方 法 的逻 辑 夏 杂 、 点 的链 表 记 录 数 据庞 大 、 所 节 遍 算法编 程 田难 。 立在 栈或 队列数 据 结构基 础 上 的指 建 奇流 跟 踪方 法 可 以实 时的 同时 生成 节 点 和遍 历 节 点 , 拽 的大 小 非常 有 限 , 程序 的逻 辑 处理 和 遍 历算 法 的 编 程都 易于 实现 .
度 慢 的 不 足 。本 文研 究 T目标 程 序 中 代码 与数 据 的特 点 、 P 指 令 的 C U 控 制 机 制 和 蝙程 序 菀编 制 程 序 时 的 基 本 原 则 , 出 j一 种 在 反 汇 煽 给
程 序 设 计 中 实现 代 码 与数 据 分 离 的 新 的 技 术 实现 方 法 。 并 用 该 方 法 对
掉有 限条 边后 它变换 为二 叉树 。 述汇 编 程 序 结构 的 描 模型 ( 即有 向图 G) 下 列算 法生 成 : 按
( ) 序 的起 始 地 址 为 图 G 的源 节 点 2 将转 1程 ) 移指 令 的 当前 地址 及 目的地 址作 为 图 G 的节 点 ( 无条 件转 移 指令 为 2 点 , 件 转 移 指 令 为 3节 点 ) 3 节 条 ;( )
比较方 法 与累 加和 方法 进 行 校验 , 这些 方 法 占存 储 空
2 循环 码校验原理
设 有位 数据 码 ( r - %- … - ) 用 多项式 M ( 表 。 x)
示 , 之 为数 据 多项 式 称
M ( = 一t·x 一 十 … … + 啦 ·X1 曲 x) . +
计 机 硷 码 堕 蝗 —_ 算 错 曼 墼 肄 毛 十 { L
环码 校验 主要 针对 串行 数据 传辅 进 行 误码 检测 , 测 检 误码 的种 类 较 多 , 检测 误码 概 率 高 [ 2 。本文 首 j 先介 绍循 环 码校 验 的基 本原 理 。 然后 介 绍在 计算 机 系 统故 障 检 测 中 . 用循 环 码 校 验 对 K M 中 的程 序 代 采 O
其 中: q∈( ,) i , , … -n 0 1 。二0 1 ¨ 。 一1
5 .闻接寻址 与软 件仿 真
在 反汇 编 程序 设 计 中存 在 一 个阻 碍 实 现 代 码 与 数 据分 离 的技 术 障碍 —— 转 移 指 令和 调 用 指令 中的 寄存 器 间接 寻址 。 用软 件仿 真技 术 可 以部 分地 克服 采 问 接 寻 址 的 障 碍 ,但 是 对 于与 硬 件 有 关 的 间 接寻 址 ( 由外 接 键 盘 输入 值 确 定 程序 流 向 ) 如 软件 仿 真 仍 然 无 法克 服 该障 碍 。 值得 注 意 的是 即使对 于纯 律 由软件 确 定 的寄 存 器 间 接寻 址 。 件 仿 真 也 可能 无 能 为 力。 软 转
问的程序存储器单元 ( 目标代码 )置代码标志而不被
P c访 问 的单元 置 数据 标 志 可 以 实现 程 序存 储 器 中代 码 与数据 的分 离 。 因此 为 丁对 目标代 码进 行数 据 与代 码 的分 离 - 须遍 历 P 的 所 有 可 能 的流 向及 路 径 必 C
§ ^口 Ⅱ I
对调 用指 令 以其 目标 地址 为源 节 点 生成 G 的 有 向子 图 G 、 用 指令 的 当 前地 址 和 下条 指 夸地 址 都 作 为 , 调 图 G 的节 点 , 分别 联 结子 图 G 、 的源 节 点 和 终 止 节 点 ( 个 有 向子 图都存 在 一 个源 节 点和 一 个 终 止节 点 ) 每 }
, 5 数据础 废 [ 蠼霹 r
维普资讯
代 码与数据分 离的反汇编程序设计
P 华 中理 l 大学计算机 系 肖正 文 工 张江陵 /胡学骏 贾连 兴
、
¨ /
摘
要
分 离 代 码 与数 据 是 反 编 程 序 的 重 要 设 计 目标 。 目前 在 反 编 程 序 设 计 中 广 泛 采 用 的 多遍 扫 描 方 法 在理 论 上 不 能 完全 实 现 代 码 与数 据 的 分 离 。 技 术 实现 上 又 存 在 算 法 复 杂 、 据 结 构赢 肿 、 码 效 率 低 、 行 连 在 数 代 运