汇编指令之OpCode快速入门:最近一直被一些初学者问及有关于汇编指令的长度问题,因此为此专门撰写本文,以求为不知OpCode为何物,或者正为汇编长短不一的指令而烦恼的朋友一个最为快速的指引。其实,OpCode并不复杂,在本文中我不打算细致入微的告诉大家OpCode的原理,不会为大家带来一大堆有关于什么是定长指令、什么是变长指令的理论知识,更不会带着各位读者玩 OpCodeHacking,我只会告诉你“怎么了”、“为什么”以及“如何解决”。1、我的汇编指令怎么了?哦,天啊!怎么我今天突然发现汇编指令竟然是长短不一的!你还没发现吗?那么请过目:1E8 31880000 CALL 00430B862E9 17FEFFFF JMP 0042817138B4424 04 MOV EAX, DWORD PTR SS:[ESP+4]485C0 TEST EAX, EAX556 PUSH ESI68BF1 MOV ESI, ECX我们可以看见“CALL 00430B86”这条汇编指令竟然占用了 5 个字节,而“PUSH ESI”则只占用了 1 个字节,汇编指令的脾气犹如一只滑头的猴子一样让你摸不到头脑,它很明显的告诉了你“嘿!兄弟,你别想搞懂我!”你也许会感到很郁闷,但是我并不这么想,因为如果我要想自己搞一个反汇编引擎,或者是我要在我的壳里加上代码混淆功能……嗯,算了,就算是我想娱乐一下搞搞免杀吧,那么我终归是要搞懂它的,为什么?因为如果搞懂它的话,那么我就没办法做到这些!很明显我们的汇编指令继承了 Intel工程师的狡猾本质,为了尽可能的减少体积,所以它们的体积被设计的不尽相同。哇哦!很多读者此时似乎已经想明白是怎么回事了,肯定是不同的指令对应的字节数不一样,恩……这样只要我们搞到一张表就可以了!不是吗?一张可以描述每个指令所用二进制码的表格,然后我们就万事大吉了。但是很不幸,我在初次接触 OpCode时也想出了这个“超级点子”,但是很可惜我的“超级点子”与各位读者的一样,并没有为我解决任何问题,请过目:7B8 01000000 MOV EAX, 188BC3 MOV EAX, EBX98BC7 MOV EAX, EDI看到了吗,一样的指令,一样的目的操作数,得到的确是完全不同的机器码……2、这是为什么?嗯,我想这个问题是很明显的,源操作数如果是一个寄存器的话,那么能有几种可能呢?按照规则来讲貌似只有不超过 50 种可能,那么如果被操作数是一个数值呢?你想想,32 位能表示多少数,将其乘以2 就是最终的可能性了,这么多的可能性一定不是区区两个16 位数就能表示过来的。所以说我们的OpCode的长度不是一成不变是有道理的,那...