汇编基础
1.基础概念
进制转换(牢记)
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 |
A | B | C | D | E | F |
1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
数据宽度
位(bit),0001占4b
字节(Byte),1B=8b
字(word),16b
双字(dword),32b
四字(qword),64b
2.寄存器
位于CPU中,运行速度快,用于传输和暂存数据、算术逻辑运算并保存结果等
通用寄存器(内容上的包含关系)
ESP、EBP 存 栈顶、栈底
32位 | 16位 | 8位 | 8位 |
31-0 | 15-0 | 15-8高位 | 7-0低位 |
EAX | AX | AH | AL |
ECX | CX | CH | CL |
EDX | DX | DH | DL |
EBX | BX | BH | BL |
ESP | SP | ||
EBP | BP | ||
ESI | SI | ||
EDI | DI |
指令寄存器
EIP,存当前程序运行到的内存地址
段寄存器
用户层(ring3)只起寻址作用,内核层(ring0)涉及到段、页
自己写语句一般用ds
cs,代码段寄存器
ds,数据段寄存器
ss,堆栈段寄存器
es,附加段寄存器
标志寄存器
EFL(32位)
例:EFL = 0x246 = 582 = 512+64+4+2=2^9+2^6+2^2+x^1 (9 IF、6 ZF、2 PF、1 1,其他为0)
CF,最高位进位或错位为1,否则为0,例:
mov al,0x7F,add al,0x1,0111 1111+0001(CF=0)
mov al,0xFF,add al,0x1,1111 1111+0001(CF=1)
PF,结果有偶数个1为1,否则为0,例:
mov eax,0x100,add al,0x1,0000 0000+0001(PF=0)
AF,最后四位进位或错位为1,否则为0,例:
mov eax,0xF,add eax,0x1,0000 0000 0000 0000 0000 0000 0000 1111+0001(AF=1)
ZF,结果为0为1,否则为0
SF,结果为负为1,否则为0
OF,同号相加、异号相减根据结果符号(最高位为0为正,最高位为1为负)判断溢出,溢出为1,否则为0,例:
mov al,0x7F,add al,0x1,0111 1111+0001(OF=1,正+正=负)
3.汇编指令
r8 代表 8位通用寄存器、m8 代表 8位内存、imm8 代表 8位立即数
and、or、xor、not 是对每一位进行运算
向指定内存地址写入、读取数据:
mov byte ptr ds:[0x19ff78],0x11
mov al,byte ptr ds:[0x19ff78]
向eax写入esp+0x1的结果:lea eax,dword ptr ds:[esp+0x1]
将table的偏移地址写入bx:lea bx,table
cmp,左操作数 - 右操作数,结果影响标志寄存器,如相等ZF=1:cmp r/m,r/m/imm
jmp,跳转到目标地址(硬编码E9,hook jmp:通过监测e9来判断函数是否被hook):jmp 0x0040122A
push,入栈:
push 0x01,相当于
提栈,lea esp,dword ptr ds:[esp-0x4]
向内存写入数据,mov byte ptr ds:[esp],0x01
esp | 0x01 |
esp+4 | 栈底数据 |
pop,出栈:
pop eax,相当于
向eax写入内存数据,mov eax,dword ptr ds:[esp]
压栈,lea esp,dword ptr ds:[esp+0x4]
call,像调用函数的地方会有(硬编码E8):
call 0x0040122A,相当于
入栈,push eip下一个地址
跳转,jmp 0x0040122A
retn,返回上一调用过程,一般和call一起用:
retn,相当于pop eip(实际不能这么写)
retn 0x4,相当于
pop eip(实际不能这么写)
add esp,0x4
stos,将eax的值存入[edi]的内存,然后edi+0x4:stos dword ptr es:[edi]
rep,重复ecx次后面的指令,ecx会自减:rep stos dword ptr es:[edi]
JCC指令