最近在玩镇邪这款游戏,自己尝试着修改了一下游戏数据。突然我想自己是不是能用编程做一个外挂辅助出来玩玩,于是我学习CE,看看能不能用python整出来。
刚上手很多东西都不知道怎么弄。玩CE少不了用到反汇编,很多东西是莫名其妙啊。弄了很久,但编程思想是相通的。学起来也会简单很多。我现在就是想过关CE自带的教程,第九关刚接触比较难。前八关的知识在第九关时作用不大。第九关应该算是玩汇编刚起步吧。网上看了很多教程,和我的想法不同,我又想先自己研究一下。尝试了很多想法及尝试,最终还是过不了关,只能按网上的教程来了。教程中的思想很容易理解,汇编语法和PHP不一样,需要多研究研究,就比如这个CMP指令。网上搜索一阵子相关的教程后,发现他们语言太死板,说的我云里雾里的。
下面是教程中是通关需要注入的代码:
cmp [rbx+14],1 //比较两个数的大小 jne originalcode //当零标志位为0时执行 jmp exit //直接执行exit
相对PHP来说汇编语法格式太简单了,CMP是比较两个数的大小。这个CMP指令和PHP运算符有相似之处也有不同处。就我个人的理解,下面我来说说它们的区别。
CMP指令语法:
cmp a,b
和PHP一样,只是单纯的比较大小,并不会改变 变量a和b的 值。CMP差不多但又有不一样,它会用计算的结果去修改什么位,我也不知道这算是什么位,还没学到这些,也可能是看不懂。反正CMP比较的结果不会直接告诉你,出了结果它会去修改位,然后我们通过这些位来判断结果是怎样的。
PHP中比较大小,我们是先给出条件,像这样 if(a>b)、if(a=b)、if(a<b),结果是 true 或 false。先条件后结果。汇编CMP不一样,它无法先给出条件去作比较,它是直接先计算,然后用计算出的结果修改位。 流程是 先计算,后写入位。我们通过获取位的值来判断a和b是大于、小于还是等于。
9个位的排列如下图:
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||
溢 出 标 志 | 方 向 标 志 | 中 断 允 许 标 志 | 陷 阱 标 志 | 符 号 标 志 | 零 标 志 | 辅 助 进 位 标 志 | 奇 偶 标 志 | 进 位 标 志 | |||||||
运算结果标志位 | 状态控制标志位 |
标志位:CMP指令按照计算结果会修改橙色的 溢出标志、符号标志、零标志、辅助进位标志、奇偶标志、进位标志。
CMP比较又分两种情况:
第1种:比较两个无符号数,则零标志位和进位标志位 它们两关系如下表所示:
汇编比较 CMP A,B | 零标志位(ZF) | 进位标志位(CF) |
A>B | 0 | 0 |
A<B | 0 | 1 |
A=B | 1 | 0 |
第2种:比较的是两个有符号数,则符号标志位、零标志位和溢出标志位 它们的关系如下表所示:
汇编比较 CMP A,B | 运算关系 |
A>B | 符号标志(SF) = 溢出标志(OF) |
A<B | 符号标志(SF) ≠ 溢出标志(OF) |
A=B | 零标志位(ZF) = 1 |
从上面两张表格中可以发现,不管是哪种情况,我们只需要看零标志位是1还是0,就可以做简单的对比判断了。
再回到文章开头,需要注入的代码:
cmp [rbx+14],1 //比较两个数的大小 jne originalcode //当零标志位为0时执行 jmp exit //直接执行exit
JNE指令解释:如果 零标志位(ZF)=0,则跳转,反之,不跳转,直接执行下一条代码
一下就明白了。