硬编码
文章平均质量分 57
oalken
这个作者很懒,什么都没留下…
展开
-
【2021.01.09】Intel Table
Table 2-1. 16-Bit Addressing Forms with the ModR/M ByteTable 2-2. 32-Bit Addressing Forms with the ModR/M ByteTable 2-3. 32-Bit Addressing Forms with the SIB ByteA.2.1 Codes for Addressing Method字母 说明 A Direct address: the instruc原创 2021-01-09 23:54:11 · 393 阅读 · 0 评论 -
【2021.01.09】经典变长指令-SIB
有没有SIB是由ModR/M决定的。SIB结构例如:88 84 48,查表并拆分可得:88:是Opcode,所以查TableA-2表,得:MOV Eb, Gb。84:拆成二进制可得:10 000 100,查Table2-2表。MOD是10,RM是100,发现是:[--][--]+disp32。如果遇到这种格式,说明当前指令通过ModR/M没有办法确定,必须要再用ModR/M后面再跟一个字节,这个字节就是SIB。Gb通过中间的000来确定,如果当前宽度是4字节就是EAX,8字节是AL。..原创 2021-01-09 23:39:16 · 537 阅读 · 0 评论 -
【2021.01.09】经典变长指令-RegOpcode
回归ModR/M结构:Mod与R/M共同描述E的意义(内存或者通用寄存器)。Reg/Opcode描述了G的意义(通用寄存器),但3、4、5字段并不仅仅用来标识寄存器,有些时候用来标识Opcode。见Table A-2中:80、81、82、83这几个编码并没有明确给出具体的操作码是什么。特别说明:凡是出现Grp的,均参见TableA-6。例如:80 65 08 FF的查表步骤:第一个字节位80,查Table-2表,得到对应结构:Eb, lb。 第二个字节位ModR/M原创 2021-01-09 22:58:20 · 232 阅读 · 0 评论 -
【2021.01.09】经典变长指令-ModRM
回顾指令结构经典变长指令-ModRM硬编码 汇编 0x88 MOV Eb, Gb 0x89 MOV Ev, Gv 0x8A MOV Gb, Eb 0x8B MOV Gv, Ev G:通用寄存器 E:寄存器/内存 b:字节 v:Word、doubleword or quadword当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M。该字节的8个位被分成了三个部分:其中,Reg原创 2021-01-09 22:24:31 · 480 阅读 · 0 评论 -
【2021.01.09】经典定长指令-修改EIP
0x70 - 0x7F条件跳转,后跟一个字节立即数的偏移(有符号),共两个字节。 如果条件成立,跳转到 当前指令地址 + 当前指令长度 + lb。 最大值:向前跳7F,向后跳80。硬编码 汇编 0x70 JO 0x71 JNO 0x72 JB/JNAE/JC 0x73 JNB/JAE/JNC 0x74 JZ/JE 0x75 JNZ/JNE 0x76 JBE/JNA 0x77 JNBE/JA 0x78 J原创 2021-01-09 22:09:20 · 222 阅读 · 0 评论 -
【2021.01.09】经典定长指令-修改ERX
i64/o64/d64/f64i64:在32位下才有效。 o64:在64位下才有效。 d64:指令后面含有d64表示指令后面的操作数宽度默认是64位,且不支持32位操作数宽度。 f64:在64位模式下,要求操作数宽度必须是64位,即使加上改变操作数宽度的前缀指令也无法改变宽度。PUSH/POP硬编码 汇编 0x50 PUSH EAX 0x51 PUSH ECX 0x52 PUSH EDX 0x53 PUSH EBX 0x54 PUSH原创 2021-01-09 21:24:07 · 217 阅读 · 0 评论 -
【2021.01.09】定长指令与变长指令
x86指令编码(硬编码)的结构opcode最少1个字节,最多3个字节。 opcode是指令中最重要的组成部分。 前缀指令只能影响自己,而opcode、ModR/M、SIB决定了整条指令的长度。 有没有ModR/M是由opcode决定的,有没有SIB是由ModR/M决定的。定长指令、变长指令定长指令:它的长度永远没有变化,只要opcode的长度确定了,那么它的长度就确定了。变长指令:仅仅通过opcode是没有办法确定长度的。如何区分指令定长还是变长?opcode后面没有ModR原创 2021-01-09 00:41:49 · 3668 阅读 · 0 评论 -
【2021.01.08】前缀指令
x86指令编码(硬编码)的结构.可以看到前缀指令的说明有一个小括号里面写的optional,表示可以有,也可以没有。如何判断某个指令是前缀指令还是后面的opcode?CPU判断某个指令是否是前缀指令还是opcode,是根据当前指令的内容判断的。 当前指令如果是55,那就是opcode。 如果当前指令值是66,无论后面是什么,那就是前缀指令。 判断是否是前缀指令是根据当前指令它本身的内容来判断的。 前缀指令是有限的。 前缀指令最多4个,最少0个。前缀指令是分组的前缀指令原创 2021-01-08 23:30:42 · 265 阅读 · 0 评论 -
【2021.01.08】硬编码
指令编码(硬编码)的结构最短1个字节,最长不会超过15个字节。x86x64反汇编引擎将硬编码转换为汇编代码。 将汇编代码转换为硬编码。原创 2021-01-08 22:50:26 · 268 阅读 · 0 评论