intel x86 类NOP 指令列表
bkbll(bkbll@cnhonker.net)
2003/09/05
这篇文章是无聊的时候写的, 因为看到phrack 61上面的fake-nop的东东, 觉得有意思.
后来又受到eyas(cooleyas@21cn.com)的启发,从intel指令手册上找了找,下面是我试验通过可以替换NOP的指令.
注: 这里不考虑双字节或以上的指令的fake-nop编码.
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)
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. 上面利用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
//thx to eyas
参考资料:
1. <<Intel Assemble Instruction Set>> (不记得从哪里下载)
2. <<8086/8088指令与机器码转换对照表>> By 怜香(于2002-10-18发表) (不记得从哪里下载的)
|