Eden带你初识机器码

来源:Linuxeden 作者:c-aries
  

玩个游戏 :)


90 b8 01 00 00 00 bb 01 00 00 00 cd 80


大家知道上面一段机器码的含义吗?


出于对底层系统的好奇,我正着手编写一个C程序(未完成)分析可执行文件、动态链接库每一字节的含义。 然后就遇到了这段代码。




... ... 10分钟已经过去


时间到了,揭开谜底。


http://www.intel.com/products/processor/manuals/


下载intel指令手册2A卷

<<Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2A: Instruction Set Reference, A-M>>

Order Number: 253666-031US June 2009 更新的版本(以下简称2A卷)


下载intel指令手册2B卷

<<Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2B: Instruction Set Reference, N-Z>>

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指令的格式


综上所述,机器码相应的汇编代码为


90                               nop   
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



时间:2009-08-14 15:43 来源:Linuxeden 作者:c-aries 原文链接

好文,顶一下
(138)
99.3%
文章真差,踩一下
(1)
0.7%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量