Assembly 如何将十六进制序列翻译成汇编而不产生歧义?

Assembly 如何将十六进制序列翻译成汇编而不产生歧义?,assembly,x86,disassembly,machine-code,Assembly,X86,Disassembly,Machine Code,像上面这样的序列可以用各种方式进行分段,每个分段都可以转换为相应的汇编指令,但是每个二进制可执行文件都有其唯一的确定汇编,避免歧义的数学原理是什么 更新 得票最多的答案根本不能回答我的问题。知道你的出发点 换言之,给定一条指令的特定起始字节,指令结束的位置是明确的,因此给出下一条指令的起始字节并允许继续。给定一个任意的内存块,在不知道第一条指令从何处开始的情况下,不可能将其分解为单独的指令 从更数学的角度来看,没有一条有效指令的字节是另一条有效指令的前缀。因此,如果ab有效,则您知道ab cd无

像上面这样的序列可以用各种方式进行分段,每个分段都可以转换为相应的汇编指令,但是每个二进制可执行文件都有其唯一的确定汇编,避免歧义的数学原理是什么

更新


得票最多的答案根本不能回答我的问题。

知道你的出发点

换言之,给定一条指令的特定起始字节,指令结束的位置是明确的,因此给出下一条指令的起始字节并允许继续。给定一个任意的内存块,在不知道第一条指令从何处开始的情况下,不可能将其分解为单独的指令


从更数学的角度来看,没有一条有效指令的字节是另一条有效指令的前缀。因此,如果
ab
有效,则您知道
ab cd
无效,因此
ab
必须是一条指令,
cd
是下一条指令的开始。

您列出的序列正好显示一个数字。在二进制中,它是


10001011111011000101011010000101011111110100011010000000000111000001000000000011110000010000000011111100010101111100100001001000000
。十进制数为
7265227689388664460674442126658667072
。这些都是写完全相同的值的不同方式。特定体系结构的ISA会将位划分为字段并赋予其含义。大多数处理器都有易于获取的手册,其中描述了分配给这些字段中每个位的含义。

不要将试图反汇编与代码的执行顺序混淆。二进制文件按执行顺序解码,从已知位置开始。除了出于各种原因的故意黑客攻击之外,没有任何含糊不清之处

尝试为可变字长指令集编写反汇编程序。在一天结束时,它必须按照执行顺序完成,即使在那里,您也只能反汇编部分程序,因为一些分支可以基于运行时计算的地址。现代编译器生成的代码比旧的手工汇编代码要好得多。例如,在旧的单机游戏中,有一些条件分支,其前面有一条指令,保证只满足其中一个条件(为什么在那里?我们永远不会知道),并且条件分支后面的数据类似于操作码,以至于您会与其他操作码发生冲突

试图击败反汇编程序的旧dos程序将具有自修改代码,一条指令将提前修改另一条指令一条或两条指令,如果进行单步修改,但如果以全速运行,则该指令已在管道中提取,并且未使用内存中修改/中断的指令。很巧妙的把戏


无论如何,您的问题的答案是不要以线性顺序查看字节,而是从重置和向量表中其他向量定义的地址开始以执行顺序查看它们。

听起来您的问题的答案是有点轻率的“知道您的起点”,但也许你想要更详细一点的东西。鉴于您的字符串:

8B EC 56 8B F4 68 00 70 40 00 FF 15 BC 82 40   
一个起点(假设8B是您的起点)字节只有一种可能的解释

假设一个操作是8B EC 56 8B(取决于您的操作长度等),那么下一个操作是F4 68。。。在这种情况下,机器无法尝试解释操作56 8B F4 68,因为没有操作在该点结束

现在,如果你的起点是56,那么你可以得到这个组,但是不能得到前面提到的任何一个


内存的布局非常具体,起始点/跳转点是精确而不可原谅的——它们和代码本身一样需要。

首先,您必须区分RISCCISC体系结构

在RISC体系结构中,您通常有相同大小的指令,因此不能出现歧义。例如,您的CPU将为每个指令获取4个字节,并且由于它必须从某个地方开始(您的CPU没有像您所展示的那样的序列,它肯定会有一个起点),一旦它具有正确的对齐方式,就不会发生问题

CISC指令集的情况基本上是相同的:从程序的入口点开始,它将根据操作码获取指令。它不需要知道如何从数学上区分歧义,因为它不知道下一条指令有多长时间,也不知道最后一条指令在哪里完成

因此,询问如何区分每一条指令就像询问如何区分每一条指令中的每一个单词一样

主题表

没有数学证明,但你知道哪些字母在一起是正确的,哪些字母没有意义。上一句包含“son”,但您知道它是从“is on”中获得的。如果没有一个有意义的短语,你就不能这么说,但是你的CPU只执行有意义的程序,那有什么意义呢

因此,如果CPU能够处理前一句话,它将发现第一条有意义的指令“the”,然后“pen”、“is”、“on”和“son”无论如何都无法识别

编辑

需要澄清的是,在CISC体系结构中,您必须确保不存在歧义的唯一限制是避免指令是另一条指令的前缀。让我们假设一个由字母a-z组成的有限字母表,而不是十六进制数字(仅用于实际目的)

如果程序计数器指向

8B EC 56 8B F4 68 00 70 40 00 FF 15 BC 82 40
您可以使用abb的
abb
是一个完整的指令。在这种情况下,
ab
将不是有效的指令,否则CP
abbcbcaabdeffabd
Hex dump          Command
8BEC              mov ebp,esp
56                push esi
8BF4              mov esi,esp
68 00704000       push 407000
FF15 BC824000     call dword ptr ds:[4082bc]
Hex dump             Command
C08B EC568BF4 68     ror byte ptr ds:[ebx+f48b56ec],68
0070 40              add byte ptr ds:[eax+40],dh
00FF                 add bh,bh
15 BC824000          adc eax,4082bc