玩个游戏 :)
90 b8 01 00 00 00 bb 01 00 00 00 cd 80
大家知道上面一段机器码的含义吗?
出于对底层系统的好奇,我正着手编写一个C程序(未完成)分析可执行文件、动态链接库每一字节的含义。 然后就遇到了这段代码。
... ... 10分钟已经过去
时间到了,揭开谜底。
到http://www.intel.com/products/processor/manuals/
下载intel指令手册2A卷
Order Number: 253666-031US June 2009 更新的版本(以下简称2A卷)
下载intel指令手册2B卷
Order Number: 253667-031US June 2009 更新的版本(以下简称2B卷)
2A卷 第33页 说明了intel指令的格式
2B卷 第7页 说明了nop指令的格式
2A卷 第689页 说明了mov指令的格式
2A卷 第50-51页 说明了+rw的含义
"+rb, +rw, +rd, +ro — A register code, from 0 through 7, added to the hexadecimal byte given at the left of the plus sign to form a single opcode byte. See Table 3-1 for the codes. The +ro columns in the table are applicable only in 64-bit mode."
如: b8+3=bb 即 mov $imm32,%ebx
2A卷 第560页 说明了int指令的格式
综上所述,机器码相应的汇编代码为
b8 01 00 00 00 mov $0x1,%eax
bb 01 00 00 00 mov $0x1,%ebx
cd 80 int $0x80
分析上面机器码
90 为 nop
b8 为 mov $imm32,%eax
01 00 00 00 为 0x00000001 因为1为dword类型
bb 为 mov $imm32,%ebx
01 00 00 00 为 0x00000001 因为1为dword类型
cd 为 int imm8
80 为 0x80 因为80为byte类型
分析上面汇编代码
nop为空指令,不产生任何效果
$ grep " 1$" /usr/include/asm/unistd_32.h
#define __NR_exit 1
$ man 2 exit
...
void _exit(int status);
...
所以eax寄存器存入1,调用系统调用_exit函数
ebx寄存器存入1,_exit第一个参数status赋值为ebx中的值1
int $0x80调用系统调用_exit(1),程序退出并返回值1
人工分析觉得麻烦?
写程序代替上面人工阅读机器码的过程,加上elf文件格式的知识,我们便能得到一个汇编程序(类似于Linux下的as)。
在编写gcc编译器的过程中,汇编阶段需要机器码和elf文件格式知识的支持。
知道研究机器码的作用了吧
在学习的过程中,我又收获了一个经验。
以前看elf(可执行可链接格式 Executable and Linking Format)文件格式,是用hexdump -C显示文件的16进制形式,然后边看资料边人工阅读分析每个字节的含义。
现在的思路是写个C程序分析elf文件格式。
写程序真的好好玩
补充:
如果是 66 bb 则为 mov $imm16,%bx (参见instruction format中的instruction prefix,即2A卷 第34页)
"
Group 3
Operand-size override prefix is encoded using 66H (66H is also used as a mandatory prefix for some instructions).
"
网络参考资源
1) Intel® 64 and IA-32 Architectures Software Developer's Manuals
http://www.intel.com/products/processor/manuals/
2) intel指令格式
http://blog.chinaunix.net/u3/93907/showart_1871805.html
3) 新手入门:ELF 文件格式分析
http://www.linuxeden.com/plus/view.php?aid=66857
4) GCC编译过程分解
http://blog.linuxeden.com/index.php/196616/viewspace-7391.html
5) Professional_Assembly_Language.pdf
http://download.csdn.net/source/1250684