汇编指令之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工程师的狡猾本质,为了尽可能的减少体积,所以它们的体积被设计的不尽相同
很多读者此时似乎已经想明白是怎么回事了,肯定是不同的指令对应的字节数不一样,恩……这样只要我们搞到一张表就可以了
一张可以描述每个指令所用二进制码的表格,然后我们就万事大吉了
但是很不幸,我在初次