汇编基础

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指令

posted @ 2023-02-12 16:51  Hacker&Cat  阅读(308)  评论(0编辑  收藏  举报