軟體測試基礎
彙編工具DTDebug
下載後設置好odd與外掛路徑,同時在屬性中設定為管理員身份執行(無Administrator許可權進入的時候一直在提示)
暫存器
儲存資料:
CPU>記憶體>硬碟
32位CPU: 8 16 32
64位CPU: 8 16 32 64
EIP:儲存CPU下一次執行的指令集,不能作他用
通用暫存器
32位暫存器
32位 | 16位 | 8位 |
---|---|---|
WAX | AX | AL(低8位) |
ECX | CX | CL |
EDX | DX | DL |
EBX | BX | BL |
ESP | SP | AH(高8位) |
EBP | BP | CH |
ESI | SI | DH |
EDI | DI | BH |
8位,16位暫存器同時存在於32位之中,8位指令改32位中的1位,16位改4位
MOV指令
-
立即數到暫存器
-
暫存器到暫存器
-
暫存器到記憶體
-
記憶體到暫存器
MOV EAX,1//把1儲存到EAX暫存器 MOV EDX,EAX//把EAX裡面的值存到EDX
記憶體相關
mov byte ptr ds[儲存地址]
已經申請過的地址,在堆疊視窗內找,可以直接使用
一個位元組-Byte
兩個位元組-WORD
四個位元組-DWORD
MOV DWORD PTR DS:[],EAX//前提需要保證寬度相同
記憶體地址的5種形式
-
[立即數]
讀取記憶體的值:
MOV EAX,DWORD PTR DS:[0x13FFC4]
向記憶體寫入資料
MOV DWORD PTR DS:[0x13FFC4],EAX
-
[reg] reg代表暫存器 可以是8個通用暫存器中的一個
讀取記憶體的值:
MOV ECX,0x13FFD0 MOV EAX,DWORD PTR DS:[ECX]
向記憶體中寫入資料:
MOV EDX,0x13FFD8 MOV DWORD PTR DS:[EDX],0x87654321
-
[reg+立即數]
讀取記憶體的值:
MOV ECX,0x13FFD0 MOV EAX,DWORD PTR DS:[ECX+4]
向記憶體中寫入資料:
MOV EDX,0x13FFD8 MOV DWORD PTR DS:[EDX+0xC],0x87654321
-
[reg+reg*{1,2,4,8}] (陣列的彙編形式)
代表八個32位的暫存器加上八個32位暫存器乘以1,2,4,8
讀取記憶體的值:
MOV EAX,13FFC4 MOV ECX,2 MOV EDX,DWORD PTR DS:[EAX+ECX*4]
向記憶體中寫入資料:
MOV EAX,13FFC4 MOV ECX,2 MOV DWORD PTR DS:[EAX+EAX*4],87654321
-
[reg+reg*{1,2,4,8}+立即數]
讀取記憶體的值:
MOV EAX,13FFC4 MOV ECX,2 MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
向記憶體中寫入資料:
MOV EAX,13FFC4 MOV ECX,2 MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
資料的儲存模式
大端模式:資料高位在低位,資料低位在高位
小端模式:資料低位在低位,資料高位在高位
MOVS指令
BYTE/WORD/DWORD分別簡寫為MOVSB MOVSW MOVSD
MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
DF位置:每次MOVS指令之後地址減少相應變更(加減具體看DF的值)位元組的地址
DF的值表示方向位:0為+,1為-
STOS指令:將AL/AX/EAX的值儲存到[EDI]的指定儲存單元
STOS BYTE PTR ES:[EDI]
REP指令
MAV ECX,10
REP MOVESD//ECX作為REP指令的計數器
EAX通常用作返回值
ESP,EBP通常用作堆疊
ESI,EDI通常用作串複製的首地址和目標地址
堆疊相關指令
堆疊的使用是從大地址向小地址使用
ESP 棧指標暫存器
堆疊的使用
堆疊使用之後要改變ESP指向的位置,防止被覆蓋
例如:
SUB ESP,8
使用之後取消:
ADD ESP,8
心得
C語言當中區域性變數為何賦初始值的原因也就昭然若揭了,因為在記憶體中ESP暫存器只是指向了未被使用的堆疊,堆疊裡面的內容會被覆蓋,但是不會被清空,因此建立變數以後他的初始值是未知的,因此建立區域性變數需要賦初值
PUSH&POP指令
功能:
- 將數壓入棧頂
- 棧頂指標+1
PUSH DWORD PTR DS:[18FFA4]
POP EAX
POP ECX
修改EIP的指令
KMP指令
MOV EIP簡寫為JMP