汇编指令和机器码的对应表

一、汇编速查
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(bkbll@cnhonker.net) 2003/09/10 这篇文章是无聊的时候写的, 因为看到phrack 61上面的fake-nop的东东, 觉得有意思. 后来又受到eyas(cooleyas@21cn.com)的启发,从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

Leave a Reply

Your email address will not be published. Required fields are marked *