MOV AA,BB 將 BB 放到 AA 裏
CALL 調用子程序 (相當於 BASIC 的 GOSUB)
RET 與 RETF 返回程序 (相當於 BASIC 的 RETURN)
CMP XX,YY 比較 XX 與 YY
JZ 若相等則轉移
JNZ 若不相等則轉移
JB 若小於則轉移
JG 若大於則轉移
JMP 無條件轉移
J??? (各種轉移指令)
LOOP 循環直到CX爲0
INT XX 類似 CALL 的中斷涵數
PUSH 推入棧(STACK)ESP:PUSH AX
POP 出棧ESP:POP CX
XCHG 交換ESP:XCHG AX,BX
IN、OUT 與PORT有關的IN/OUT
XLAT 查表
LEA 段內偏移量。ESP:LEA AX,AREA1=MOV AX,OFFSET AREA1
LAHF、SAHF與棋標有關的寄存器 AH
PUSHF、POPF將棋標入/出棧
ADD ESP ADD AX,CX (AX=AX+CX)
ADC 加入棋標C的ADD
INC ESP INC AX(AX=AX+1)
AAA 加法校正
SUB、SBB 減法
DEC ESP: DEC AX(AX=AX-1)
NEG 去補,
MUL、IMUL 乘
DIV、IDIV 除
SHR、SAR、SHL 算術、邏輯位移R=RIGHT L=LEFT
OR、XOR、AND 邏輯運算 ESP :XOR AX,AX(AX=0)
直接標誌轉移
指令格式 機器碼 測試條件 如...則轉移
JC 72 C=1 有進位
JNS 79 S=0 正號
JNC 73 C=0 無進位
JO 70 O=1 有溢出
JZ/JE 74 Z=1 零/等於
JNO 71 O=0 無溢出
JNZ/JNE 75 Z=0 不爲零/不等於
JP/JPE 7A P=1 奇偶位爲偶
JS 78 S=1 負號
JNP/IPO 7B P=0 奇偶位爲奇
間接標誌轉移
指令格式 機器碼 測試格式 如...則轉移
JA/JNBE(比較無符號數) 77 C或Z=0 > 高於/不低於或等於
JAE/JNB(比較無符號數) 73 C=0 >= 高於或等於/不低於
JB/JNAE(比較無符號數) 72 C=1 < 低於/不高於或等於
JBE/JNA(比較無符號數) 76 C或Z=1 <= 低於或等於/不高於
JG/JNLE(比較帶符號數) 7F (S異或O)或Z=0 > 大於/不小於或等於
JGE/JNL(比較帶符號數) 7D S異或O=0 >= 大於或等於/不小於
JL/JNGE(比較帶符號數) 7C S異或O=1 < 小於/不大於或等於
JLE/JNG(比較帶符號數) 7E (S異或O)或Z=1 <= 小於或等於/不大於
無條件轉移指令JMP
指令格式 執行操作 機器碼 說明
段內直接短轉移Jmp short (IP)←(IP)+8位位移量 EB 轉移範圍-128到+127字節
段內直接近轉移Jmp near (IP)←(IP)+16位位移量 E9 轉移到段內的任一位置
段內間接轉移Jmp word (IP)←(有效地址EA) FF
段間直接(遠)轉移Jmp far (IP)←(偏移地址)
(CS)←(段地址) EA
段間間接轉移 Jmp dword (IP)←(EA)
(CS)←(EA+2)
二、斷點設置表
一般處理:
bpx hmemcpy(萬能斷點)
bpx MessageBox bpx MessageBoxExA
bpx MessageBeep bpx SendMessage
bpx GetDlgItemText bpx GetDlgItemInt
bpx GetWindowText bpx GetWindowWord
bpx GetWindowInt bpx DialogBoxParamA
bpx CreateWindow bpx CreateWindowEx
bpx ShowWindow bpx UpdateWindow
bmsg xxxx wm_move bmsg xxxx wm_gettext
bmsg xxxx wm_command bmsg xxxx wm_activate
bmsg xxxx wm_create bmsg xxxx wm_destroy
時間相關:
bpint 21 if ah==2A (DOS)
bpx GetLocalTime
bpx GetFileTime
bpx GetSystemtime
CD-ROM 或 磁盤相關:
bpint 13 if ah==2 (DOS) bpint 13 if ah==3 (DOS)
bpint 13 if ah==4 (DOS)
bpx GetFileAttributesA bpx GetFileSize
bpx GetDriveType bpx GetLastError
bpx ReadFile
bpio -h (Your CD-ROM Port Address) R
軟件狗相關:
bpio -h 278 R bpio -h 378 R
文件訪問相關:
bpint 21 if ah==3dh (DOS) bpint 31 if ah==3fh (DOS)
bpint 21 if ah==3dh (DOS)
bpx ReadFile bpx WriteFile
bpx CreateFile bpx SetFilePointer
bpx GetSystemDirectory
INI 初始化文件相關:
bpx GetPrivateProfileString bpx GetPrivateProfileInt
bpx WritePrivateProfileString bpx WritePrivateProfileInt
註冊表相關:
bpx RegCreateKey bpx RegDeleteKey
bpx RegCloseKey bpx RegOpenKey
bpx RegQueryvalue
註冊標誌相關: bpx cs:eip if EAX==0
內存標準相關: bpmb cs:eip rw if 0x30:0x45AA==0
顯示相關: bpx 0x30:0x45AA do "d 0x30:0x44BB"
bpx CS:0x66CC do "? EAX"
利用S命令設斷:
S [-cu][address L length data-list]
address :搜索的起始地址
length :搜索的長度(字節長)
data-list :可以是一系列字節,也可以是字符串, 字符串可以用單引號或雙引號括住
例如:S 30:0 L ffffffff '********'
三、經典句式
1 mov eax [ ] 這裏可以是地址,也可以是其它寄存器
mov edx [ ] 同上 通常這兩個地址就儲存着重要信息
call 00??????
test eax eax
jz(jnz)
2 mov eax [ ] 這裏可以是地址,也可以是其它寄存器
mov edx [ ] 同上 通常這兩個地址就儲存着重要信息
call 00??????
jne(je)
3 mov eax [ ]
mov edx [ ]
cmp eax,edx
jnz(jz)
或者
begin: mov al [ ]
mov cl [ ]
cmp al,cl
jnz(jz)
mov al [ +1]
mov cl [ +1]
cmp al,cl
jnz(jz)
cmp eax ecx (eax爲計數器)
jnl begin
mov al 01
4 lea edi [ ]
lea esi [ ]
repz cmpsd
jz(jnz)
5 mov eax [ ] 這裏可以是地址,也可以是其它寄存器
mov edx [ ] 同上 通常這兩個地址就儲存着重要信息
call 00??????
setz (setnz) al (bl,cl…)
6 mov eax [ ] 這裏可以是地址,也可以是其它寄存器
mov edx [ ] 同上 通常這兩個地址就儲存着重要信息
call 00??????
test eax eax
setz (setnz) bl,cl…
7 call 00?????? ***
push eax (ebx,ecx…)
……
call 00??????
pop eax (ebx,ecx…)
test eax eax
jz(jnz)
intel x86 類NOP 指令列表(修訂版)
bkbll([email protected])
2003/09/10
這篇文章是無聊的時候寫的, 因爲看到phrack 61上面的fake-nop的東東, 覺得有意思.
後來又受到eyas([email protected])的啓發,從intel指令手冊上找了找,下面是我試驗通過可以替換NOP的指令.
注1: 這裏不考慮雙字節或以上的指令的fake-nop編碼.
注2: eyas加了xchg指令.
16進制機器碼 x86彙編指令 指令意義 可能影響的寄存器或標誌位
-------------- ------------- ------------------- ---------------------------
06 PUSHL %es es進棧 esp
0E PUSHL %cs cs進棧 esp
16 PUSHL %ss ss進棧 esp
1E PUSHL %ds ds進棧 esp
27 DAA 加法小數位調整 AF CF PF SF ZF AL
2F DAS 減法小數位調整 AF CF PF SF ZF AL
37 AAA 加法的ASCII調整 AF CF AL
3F AAS 減法小數位調整 AF CF AL
40 INC %eax %eax加1 AF OF PF SF ZF eax
41 INC %ecx %ecx加1 AF OF PF SF ZF ecx
42 INC %edx %edx加1 AF OF PF SF ZF edx
43 INC %ebx %ebx加1 AF OF PF SF ZF ebx
44 INC %esp %esp加1 AF OF PF SF ZF esp
45 INC %ebp %ebp加1 AF OF PF SF ZF ebp
46 INC %esi %esi加1 AF OF PF SF ZF esi
47 INC %edi %edi加1 AF OF PF SF ZF edi
48 DEC %eax %eax減1 AF OF PF SF ZF eax
49 DEC %ecx %ecx減1 AF OF PF SF ZF ecx
4A DEC %edx %edx減1 AF OF PF SF ZF edx
4B DEC %ebx %ebx減1 AF OF PF SF ZF ebx
4C DEC %esp %esp減1 AF OF PF SF ZF esp
4D DEC %ebp %ebp減1 AF OF PF SF ZF ebp
4E DEC %esi %esi減1 AF OF PF SF ZF esi
4F DEC %edi %edi減1 AF OF PF SF ZF edi
50 PUSHL %eax eax進棧 esp
51 PUSHL %ecx ecx進棧 esp
52 PUSHL %edx edx進棧 esp
53 PUSHL %ebx ebx進棧 esp
54 PUSHL %esp esp進棧 esp
55 PUSHL %ebp ebp進棧 esp
56 PUSHL %esi esi進棧 esp
57 PUSHL %edi edi進棧 esp
90 NOP (NULL) (NULL)
91 XCHG %ecx,%eax 交換寄存器內容 eax,ecx
92 XCHG %edx,%eax 交換寄存器內容 edx,eax
93 XCHG %ebx,%eax 交換寄存器內容 ebx,eax
95 XCHG %ebp,%eax 交換寄存器內容 ebp,eax
96 XCHG %esi,%eax 交換寄存器內容 esi,eax
97 XCHG %edi,%eax 交換寄存器內容 edi,eax
98 CBW 將byte的AL轉換成word的EAX EAX
9B WAIT 等待CPU處理完數據 (NULL)
D6 無效指令 (NULL) (NULL)
F5 CMC 轉換CF標誌位(開關) CF
F8 CLC 清CF位(CF=0) CF
F9 STC 設置CF位(CF=1) CF
FC CLD 設置DF位(DF=1) DF
FD STD 清理DF位(DF=0) DF
1. 上面利用XCHG/PUSHL/INC/DEC的方法程序應該不會出錯, 可以正常到目的, 但寄存器內容被改變了.inc eax就改變了eax的值,
只能算無奈的辦法.
2. 利用改變標誌寄存器位是個不錯的想法, 基本上不會影響流程, 但看到還是改變了CPU的東西還是不滿意.
3. \x90(NOP),\x9b(wait),\xd6(bad) 這三個指令不錯, 都不會改變程序的流程, 又不會改變寄存器的東東.
這裏尤其指明的是\xd6指令, 在intel手冊上沒查到對應什麼指令, 但在linux下和windows下發現系統對於這個是繼續
執行下一條指令,和NOP相似.
在我看來,上面這些指令利用順序優先級最好是:
\x90(NOP) > \xd6 > \x9b > 改變標誌寄存器的操作指令 > INC/DEC/PUSHL/XCHG
//thx to eyas