硬编码概述
当一个程序编译完以后,它就转化成了二进制文件,其内部只有二进制数据,而这二进制数据可以分为数据和机器指令两个部分,它们都有各自的格式。在实际中,数据和机器指令并没有严格的区分,如果数据的格式是机器指令的格式,那么该数据也会被当做机器指令执行,但是会出错。其中机器指令就是硬编码。
逆向分析分为两个阶段:1.C代码和汇编的转换。2.汇编和硬编码的转换。因此要想学习好逆向分析的第二个阶段,就需要好好学习硬编码
在我们常用的软件,如VS,IDA,都可以将我们所写的代码翻译成汇编代码,而这都是由软件自带的反汇编引擎将硬编码转化成汇编代码而实现的。
硬编码的格式如下图所示,其由六部分组成,本质上取决于计算机的CPU类型:
通常不同的硬编码的字节数都有所不同,其组成部分也不同,主要取决于该硬编码实现的功能,但必须有Opcode部分,字节数在1-15之间浮动
经典定长指令
接下来我们观察一个汇编代码:PUSH EAX,其中PUSH为操作码,EAX为操作数,这是最简单的汇编代码,同样由最简单的一字节的硬编码相对应:50
接下来我们将列举常见的经典定长指令:
//INC/DEC
//INC:加1,DEC:减1
40: INC EAX
41: INC ECX
42: INC EDX
43: INC EBX
44: INC ESP
45: INC EBP
46: INC ESI
47: INC EDI
48: DEC EAX
49: DEC ECX
4A: DEC EDX
4B: DEC EBX
4C: DEC ESP
4D: DEC EBP
4E: DEC ESI
4F: DEC EDI//PUSH/POP
//PUSH:压栈;POP:出堆
50: PUSH EAX
51: PUSH ECX
52: PUSH EDX
53: PUSH EBX
54: PUSH ESP
55: PUSH EBP
56: PUSH ESI
57: PUSH EDI
58: POP EAX
59: POP ECX
5A: POP EDX
5B: POP EBX
5C: POP ESP
5D: POP EBP
5E: POP ESI
5F: POP EDI//MOV Rb, XX
//MOV:数据传送。
B0 XX: MOV AL, XX
B1 XX: MOV CL, XX
B2 XX: MOV DL, XX
B3 XX: MOV BL, XX
B4 XX: MOV AH, XX
B5 XX: MOV CH, XX
B6 XX: MOV DH, XX
B7 XX: MOV BH, XX
B8 XX: MOV EAX, XX
B9 XX: MOV ECX, XX
BA: MOV EDX, XX
BB: MOV EBX, XX
BC: MOV ESP, XX
BD: MOV EBP, XX
BE: MOV ESI, XX
BF: MOV EDI, XX//XCHG EAX, ERX
//XCHG:内容交换
//只有EAX可以和其他寄存器交换
90: NOP(XCHG EAX, EAX)
91: XCHG EAX, ECX
92: XCHG EAX, EDX
93: XCHG EAX, EBX
94: XCHG EAX, ESP
95: XCHG EAX, EBP
96: XCHG EAX, ESI
97: XCHG EAX, EDI
经典定长指令要背会!!
注意:在32位程序下,寄存器只有8位和32位两种类型。通过在指令前添加前缀的方式,在不改变指令的情况下,可以将32位寄存器切换成16位寄存器,同样的方式可以将16位寄存器切换成8位寄存器