逆向工程-CPU简介及最简函数

1 CPU简介 

CPU是执行程序机器码的硬件单元。简要地说,其相关概念主要有以下几项

1)指令码

CPU受理底层命令。典型的底层命令有:将数据在寄存器间转移、操作内存、计算运算等指令。

每类CPU都有自己的指令集架构(Instruction Set Architecture,ISA)。

2)机器码

发送给CPU的程序代码。一条指令通常被封闭为若干字节。

3)汇编语言

易读易记的代码,它有很多类亿宏的扩展功能。

4)CPU寄存器

Thumb模式指令集架构

同一个程序里可以同时存在ARM模式和Thumb模式两种指令

THumb-2指令集:基本都可封装在2个字节的机器码之中,2个字节封装不下的指令则由4字节封装。它是一种充分利用处理器性能、中以与ARM模式媲美的独立运行模式。在扩展了Thumb模式 的指令集之后,Thumb-2现在与ARM模式不相上下。由于Xcode编译器默认采用了Thumb-2指令集编译,所以现在主流的应用程序都采用了Thumb-2指令集。

64位的ARM处理器接踵而至。这种CPU指令集架构再次使用固定长度的4字节opccode,所以不再支持Thub模式的指令。相应地64位ARM工作于自己的指令集。受到指令集架构的影响,ARM指令集分为3类:ARM模式指令集、Thumb模式指令集和ARM64的指令集

2 最简函数

函数:

int f()

{

return 123;

};

x86

在开启优化功能之后,GCC编译器产生的汇编指令如下:

f:

mov eax,123

ret

msvc编译的程序和上述指令完全一致

这个函数仅由两条指令构成:

第一条指令把数值123存放到EAX寄存器里;

根据函数调用编写,后面一条指令会把EAX的值当作返回值传递给调用者函数,而调用者函数会从EAX寄存器里取值把它当作返回结果。

ARM模式

指令清单

f PROC

MOV r0,#0x7b; 123

BX lr

ENDP

ARM程序使用R0寄存器传递函数返回值,所以指令把数值123赋值给R0

 

ARM程序使用LR寄存器(Link Register)存储函数结束之后的返回地址(RA/Return Address)。X86程序使用“栈”x结构存储上述返回地址。可见,BX LR指令作用是中转到返回地址,即返回到调用者函数,然后继续执行调用体caller的后续指令。

MIPS

在MIPS指令里,寄存器有两种命名方式。一种是以数字命名($0~$31),另一种则以伪名称(pseudoname)命名($V0~VA0,依此类推)。在GCC编译器生成的汇编指令中,寄存器都采用数字方式命名。

j $31

li $2,123 #0x7b

然而IDA则会显示寄存器的伪名称

jr $ra

li v0,0x7B

根据伪名称和寄存器数字编号的关系可知,存储函数返回值的寄存器都是$2即$V0。此处LI指令是英文词组(Load Immediate(加载立即数))的缩写。

此处为什么赋值指令LI和转移指令J/JR的位置反过来了?这属于Risc精简指令集的特性之一:

分支转移指令延迟槽的现象。简单地说,不管分支转移发生与否,位于分支指令后面的一条指令(在延时槽里的指令,)总是被先于分支指令提交。

 

 

 

你可能感兴趣的:(汇编语言)