彙編語言
01.彙編語言簡介 02.進制 03.數據寄存器 04.指針寄存器 05.變址寄存器 06.指令指針寄存器 07.標誌寄存器 08.段寄存器 09.數據傳送指令 10.加減運算指令 11.邏輯運算 12.移位指令 13.test,cmp指令 14.push,pop指令 15.jmp,nop指令 16.jcc指令 17.call,retn指令 18.總結
學習彙編語言用處:遊戲外掛與反外掛,遊戲安全類,軟件破解,軟件暴力破解。。。
01.彙編語言簡介
彙編語言的由來:方便我們閱讀和記憶機器指令(硬編碼)
操作:寄存器ebx的內容移動到eax中
機器指令:1000100111011000
彙編指令:mov eax,ebx
機器語言(硬編碼):由0和1組成
寄存器:cpu上的一個元件,它可以暫時保存數據(0,1)
02.進制
十進制:0 1 2 3 4 5 6 7 8 9
10 11 12 13…19 20
二進制:0 1
10 11 100 //102 113 100==4
十六進制:0 1 2 3 4 5 6 7 8 9 a b c d e f
10 11 12 //1016 1218
一般反彙編引擎(OD)都是以十六進制的形式表達二進制。
03.數據寄存器
寄存器:cpu上的一個元件(部件),讀寫速度非常快。
數據寄存器:保存操作數,計算結果。
EAX (Accumulator):累加寄存器,也稱之爲累加器; EBX (Base):基地址寄存器; ECX (Count):計數器寄存器; EDX (Data):數據寄存器;
32位寄存器:EAX,EBX,ECX,EDX
16位寄存器:AX,BX,CX,DX
低八位:al
高八位:ah
04.指針寄存器
指針寄存器:操作棧的寄存器
棧:參數,變量
EBP:棧底的指針
ESP:棧頂的指針
05.變址寄存器
esi和edi :用來存放一個地址的寄存器。
06.指令指針寄存器
eip:cpu下一次將要執行的代碼的地址。
07.標誌寄存器
標誌寄存器:flag寄存器 16位
置爲1
08.段寄存器
段寄存器是因爲對內存的分段管理而設置的。計算機需要對內存分段,以分配給不同的程序使用。
mov dword ptr ds:[0x405528],edx
ds.base+0x405528
09.數據傳送指令
mov ax,bx
10.加減運算指令
add
sub
add eax,8 //int a=8; a= 8+0;
11.邏輯運算
邏輯與:and
同爲1就爲1,只要一個不爲1,就不爲1。
mov eax,1;
and eax,2;
01
10
00
邏輯或:or
只要一個爲1,就是1。
mov eax,1;
or eax,2;
01
10
11
邏輯異或:xor
同爲0,異爲1。
mov eax,1;
xor eax,2;
01
10
11
邏輯非:not
mov eax,3;
not eax;
11
00
12.移位指令
算術移位指令:
// 算術左移
mov eax,2 //10(二進制) == 2(十進制)
sal eax,1 //算術左移與邏輯左移 功能是一樣的
00000010
00000100 //100(二進制) == 4
// 算術右移
mov eax,2 //10(二進制) == 2(十進制)
sar eax,1 //
00000010
00000001
邏輯移位指令:
// 邏輯右移
mov eax,2 //10(二進制) == 2(十進制)
shr eax,1 //
00000010
00000001
13.test,cmp指令
test指令:實際就是作邏輯與運算
與邏輯與(and)不同點是:test指令不會改變值,只會改變z標誌位的值。
and eax,1
test eax,1
cmp指令:實際上作的是減法運算
與算術運算(sub)不同點是:cmp指令也是不會改變值,只會影響到z標誌位。
sub eax,1
cmp eax,1
14.push,pop指令
push 壓棧指令
pop 出棧指令
棧:先進後出,後進先出
push指令:
//push ebp
01.提升棧頂(esp-4)
02.把ebp裏面的內容壓到棧(esp-4)
pop指令:
//pop ebp
01.把棧頂裏面值取出來放到ebp
02.恢復棧原來的樣子(esp+4)
15.jmp,nop指令
jmp指令:無條件跳轉指令
nop指令:空指令(cpu執行到這個命令什麼也不幹)
16.jcc指令
JCC指條件跳轉指令,CC就是指條件碼。
JZ 如果表達式計算的結果等於0,那麼zf標誌位會置爲1,則jz指令跳轉。
17.call,retn指令
call:
①jmp + 函數地址
②push call函數指令的下一行指令的地址
retn: