首页
社区
课程
招聘
[旧帖] [原创]查找Intel指令手册 0.00雪花
发表于: 2012-1-2 09:52 2256

[旧帖] [原创]查找Intel指令手册 0.00雪花

2012-1-2 09:52
2256
主要参考这一篇文章,写的太清晰了。博主真是大牛~

http://blog.ftofficer.com/2010/04/n-forms-of-call-instructions/



准备在内存中查找这一段给局部变量赋值的指令。

因为我需要把0xAAAAAAAA,0xBBBBBBBB之类的值根据程序的计算得到正确的值,

然后把函数写入目标文件。

然后没事去对应了一下指令手册。

先到指令手册的A-M那里找到mov指令,表太长了,只贴第二页:



这里是把32位立即数写到32位的内存地址上,也就是C7 /0 这一项。注意到后面有个/0的标记,

所以又要去找回手册的2.1.3  ModR/M and SIB Bytes。



找到对应/digit 的digit等于0的那一列。

看到[EBP] + disp8那一行和45对应。

于是就明白了,如果是要把32位立即数存到由EBP指向的带8位偏移的32位地址上,指令是C7 45 XX imm32

其中XX是相对EBP指向的地址值的8位地址偏移,imm32是一个32位立即数。

Intel手册下载:
这里有所有手册的下载:
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

但是3卷内容中,只需要查找卷2的内容就可以得到这里用到的全部知识:

Intel指令手册卷2下载
具体来说就是2.1.5节的
《Addressing-Mode Encoding of ModR/M and SIB Byte》。
需要里面的表2-2《32-Bit Addressing Forms with the ModR/M Byte》

还有就是指令参考中的mov指令的内容。

在老版本中,PDF把卷2分成2A,2B,2C三部分,卷2A有我们需要的指令格式参考,另外还有字母A-L开头的指令参考。卷2B有我们需要的字母M-Z开头的指令参考。
不过在上面给出的卷2的PDF中,Intel把整个卷2放到一个PDF中了,方便了很多。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
刚刚试了下,AMD的指令手册要怎么找。

AMD的全部X86和X86-64的编程手册在这里下载:
http://developer.amd.com/documentation/guides/Pages/default.aspx#manuals

说下用AMD手册为mov [ebp - 4],0xAABBCCDD指令查找机器码的步骤:

我们需要的是它手册的卷3:《General Purpose and System Instructions

先在卷三找到第三章《General-Purpose Instruction Reference》,
可以看到mov reg/mem32 , imm32 的格式是 C7 /0 id,也就是操作码是C7,后面跟一个Mod R/M字节,再后面跟一个双字。



那我们还是继续去找Mod R/M字节的格式:

它的Mod R/M的内容在1.4,《ModRM and SIB Byte》的1.4.3小节,《Operand Addressing in Legacy 32-bit and Compatibility Modes》

不像Intel手册有个方便的但是看起来有点恐怖的表,AMD手册这里,C7 45的这个45h是需要自己算出来的。

看到表1-13,《Operand Addressing Using ModRM and SIB Bytes》的开头:



看到,[rBP] + disp8对应的是Mod值01,R/M值101,这些都是2进制表示的值。

注意这里的disp8指的是相对rBP指示的地址的8位偏移,而不是指令用到的立即数。
而rBP指的是bp,ebp,rbp(64位模式下扩展到64位的ebp寄存器)这几个寄存器的统称。

刚刚Mod R/M字节里面,/digit的digit值是0(16进制;在二进制中是000),再考虑到这里查的是Mod值是01,R/M值是101,

合起来就是01000101,也就是1 + 4 + 64 = 69(dec) = 45(hex)
其中,中间的红色部分是/digit值,占3比特,前面是Mod码占2比特,后面是R/M码,占3比特。

这样,通过查找AMD手册也得到,mov [ebp - 4],0xAABBCCDD的机器码就是C7 45 FC DD CC BB AA
上传的附件:
2012-1-2 10:38
0
雪    币: 292
活跃值: (153)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
啊哈~~~~~  Very  Funny ~
2012-1-2 11:11
0
雪    币: 57
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看帖回帖是种美德
2012-1-2 16:54
0
游客
登录 | 注册 方可回帖
返回
//