您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Cheat-Engine(CE)AA教程
CheatEngine(CE)AA教程适合CE初学者观看目录1.介绍2.寄存器2.a32位寄存器2.b16位寄存器3.指令3.aJMP3.bMOV3.cPush/Pop+TheStack3.dalloc/label/registersymbol3.eCallandRet3.f其他4.ArrayofBytes5.结尾6.人员名单/致谢词额外内容:写一个脚本1.介绍'哟,我猜你在读这个是因为下面两件事中的一个。1)你正在试图学习自动汇编(我不会叫你菜鸟,因为每个人都是从哪里开始的,对吧=))or2)你想测试你的自动汇编知识(作为扩展)。那么,如果你是前者,那就慢慢的体会好每个部分,并且在继续进行前确认自己已经明白了这章。DarkBytewrote:大多数人都认为AA很难,其实它可容易了。来自CE作者自己的话如果是后者,那我不会给你提任何的建议,即使我想帮忙。如果你发现有什么错了,或者含糊或者认为我可以做的更好,请告诉我。我一直处于自我学习的状态!等等!别问,我知道你在想什么。Youwrote:为什么我非要听一个还在学习的人的话?好,我来告诉你,我的朋友。即使我仍然在学习,我了解AA,并且我认为与你分享知识是一件很棒的事。=)Edit:这个是很久以前写的,但是现在我学到了很多,并且已经重新检查了。现在,让我们投身入奇幻的电脑世界2.寄存器这些也许你已经在一些脚本中看到过,它们被非常广泛的使用。有两种寄存器被使用,接下来来进行讲解。---------------2.a32Bit---------------首先,我将解释每个寄存器是如何得到它们的名字的,这会帮助你记住它们哪个是哪个。首先,以E开头(如果你注意了下面,你会发现所有的寄存器都是以E开头的)它告诉你这个寄存器是32位寄存器。而A,B,C,D的含义你看完描述就能明显得体会到了。像SI,DI,BP,SP,IP也是一样。在EAX,EBX,ECX,EDX后面的X,他简单的表示已经没有更多的字母了。有点像一个NOP命令(之后你将读到)。如果你注意了,你会发现每个32位寄存器都是3个字母。EAX:累加器(Acculmulatorregister)。能够用来当存储器EBX:从前,它是个基础寄存器,但现在只是个闲着的存储器ECX:计数器(Countingregister)。也能用来当存储器EDX:数据寄存器(Dataregister)。跟之前三个一样,能用来当存储器。ESI:源址变址寄存器(SourceIndexregister)。是字符串形式的指针变量,但你现在还不用担心那部分。能够用来当存储器。EDI:目的变址寄存器(DestinyIndexregister)。又一次,能够当作存储器,并且是个字符串形式的指针变量,但别担心。EBP:机制指针寄存器(BasePointerregister)。是用来临时存储ESP,当然也可以像常规的存储器那样使用。ESP:原址指针寄存器(SourcePointerregister)。它在堆栈里指向寄存器和地址(这个内容待会再说)。EIP:指令指针寄存器(InstructionPointerregister)。错误的使用会使你正在试图修改的程序崩溃。---------------2.b16Bit---------------16位寄存器和32位寄存器很相似,他们间有两个区别。一是,32位寄存器名字是三个字母,而16位寄存器是两个字母。还有一件事就是16位寄存器比32位寄存器多但别担心。16位寄存器我们一般都用不上。AX:参照EAXBX:参照EBXCX:参照ECXDX:参照EDXSI:参照ESIDI:参照EDIBP:参照EBPSP:参照ESPIP:参照EIP---------------关于寄存器的内容还很多。如果你想学习更多关于寄存器的只是,那就去拜Google大神吧。对于绝大多数的学习者来说求知欲都是很重要的。3.命令当今,什么语言没有它自己的函数和命令呢?与英文相比,命令像个单词,而操作代码像个句子。操作代码并不难,比如:Code:jmp00123EAA关于操作代码你应该知道两点。首先,在操作码里,一般都会有个地址或者寄存器,以及一个显而易见的命令。地址是Hex形式的,是Hexadecimal的缩写。Hexadecimal是16进制数。就如同10进制那样。按照这种思路想一想。如同上面提到的那样,我们一般使用十进制。这就意味着我们在一个列里不能有“10”,因为它占了两个地方。而16进制,10至15都可以放在一个列里头。但是你会发现,“10”并没有出现在列里头。先冷静,这是因为在Hex进制里,10是用A表示的,而11是用B,直到15是F。再往后,它就是10,然后11,直到1F,如果超过了20(十进制)就得从15(十六进制)往后算。有个简单的转换方法就是用操作系统自带的计算器,这里不赘述了。还有,每一个地址都有它的操作码和字节码。这个字节数就是代表操作码是什么,每一个命令都一一对应已经定义好的字节码。我知道那些常用函数的字节码是什么,如果你想知道那些字节码的话,你还是指望别人吧,推荐去拜Google大神=)最后,想注释很方便。要注释的话,就把//放在命令后边或某块空处,然后打上你想打的。如果你不打//,那电脑就会以为你在打命令呢。现在,让我们来了解每个命令都是干啥的。3.aJMPJMP命令是最常使用的命令之一(就如同MOV那样,接下来会讲)。也许你在操作码和脚本里看到的JMP不像MOV那么多,那是因为JMP命令有很多变种。下面就是列表。JMP:始终跳转(Alwaysjumpto)JE/JZ:相等则跳转(Jumptoifequal)JNE/JNZ:不等则跳转(Jumptoifnotequal)JA:无符号大于则跳转(JumptoifAbove)JG:有符号大于则跳转(JumptoifGreater)JNA:无符号不大于则跳转(JumptoifnotAbove)JNG:有符号不大于则跳转(JumptoifnotGreater)JB:无符号小于则跳转(JumptoifBelow)JL:有符号小于则跳转(JumptoifLower)JNB:无符号不小于则跳转(JumptoifnotBelow)JNL:有符号不小于则跳转(JumptoifnotLower)JAE:无符号大于等于则跳转(JumptoifAboveorEqual)JGE:有符号大于等于则跳转(JumptoifGreaterorEqual)JNAE:无符号不大于等于则跳转(JumptoifnotAboveorEqual(即JB))JNGE:有符号不大于等于则跳转(JumptoifnotgreaterthanorEqual(即JL))现在你大致了解了,应该有些疑惑。Jumptoifgreater或者JG都是条件跳转。条件跳转都如同它们名字所描述的那样,会在条件成立的情况下跳转。通常,都会有CMP或者其他的比较函数在上面,这个待会再提。以上大抵就是JMP的故事。3.bMOV前文已经提过,MOV命令是最被广泛实用的命令,因为它是那么给力。下面就是MOV的例子:Code:moveax,ebx这个的意思是把ebx里存的地址放到eax里。注意在两个寄存器之间还有个逗号,而不是空格。最开始这可能有些令人费解,但是它真的很容易,下面来好好解释一下。Mov是move的意思。寄存器自身表示这个寄存器里存的地址。基本上来说,把ebx里存的地址放到eax的地址里面去,这会把eax之前的值覆盖并彻底消灭掉。=D你可以通过这个方法复制ebx并把它粘贴到eax里。另一种Mov命令。Code:moveax,[ebx]这个的意思是把ebx里面的值存到eax所存的地址里,很简单,把寄存器或者地址用[]那么一括,就表示寄存器或者地址的值了。下面这段代码什么效果都没有。Code:mov[eax],[ebx]没效果,上面的代码啥用没有。你不能!你不能直接把一个值存在另一个值里面。你可以间接得先把值存在其他的东西里;)参考下面的代码。Code:pusheax//先让eax入栈—这个待会解释moveax,[0100200A]//把值0100200A存到eax里mov[ebx],eax//把(值0100200A)存到ebx的值里面popeax//然后让eax出栈,这个也待会讲解释这个是为了MOV函数。继续...3.cPushandPop+TheStack你已经看了上面的Push和Pop命令的用法。等等!我是尤里!我能读你的思想!Youwrote:那个push和pop都是干啥的?还有啥是stack?好,你读了前文,在Push之后,我是这么注释的。Code://Pusheaxontothestack(让eax入栈)这个基本上就是把eax存到堆栈里。而popeax基本上就是把eax从堆栈中清除。CEF的Skyone写了一个非常非常好的关于堆栈的解释,我甚至无法容忍自己不让你像我那样获得对此学习的快乐;)Skyonewrote:堆栈是用来存放可变的空白的值。它就如同:你有用来做作业的一张纸,但是之后你的朋友打电话叫你给Phil打电话,他的电话是555-6405。你慌了,没地方记啊,所以你把它写在了作业本上了。之后你撂下电话,就可以把Phil's电话写在电话薄上了。在写完号码之后,你就把号码从作业本用橡皮擦掉了,然后打电话给Phil,并且继续做作业。把值pushtostack(入栈)就是在作业本上写下Phil的电话号码而pop就是把电话号码录入到电话薄上,然后再从作业本上擦掉。3.dAlloc/Label/RegisterSymbol我一般喜欢用两种方法来区分AutoAssembler脚本1)简单的地址改变如同下面的简单代码:Code:[enable]00ABC123:moveax,ebx[disable]00ABC123:movebx,eax这是在改变地址00ABC123里面的操作码。但是也有非常复杂的脚本,就如同dICE或pID00的脚本。(我不会在这里介绍,因为那真的没什么必要去学)在非常复杂的脚本当中,你会在最顶上看到某些函数,(注意,我并没有经常使用)在一个复杂的脚本当中通常会出现alloc,label函数,有时还会出现registersymbol。Label我认为label函数是三个函数中最有重要的。他能够允许你用在脚本中使用label定义的变量,如同下面这样。(摸丸:label用于定义用于跳转的标签)Code:label(Continue)AutoAssembler:moveax,02cmpeax,03jneContinuejeSayWhatContinue://...//...SayWhat:jmp0//insta-crash!=D首先应该注意此脚本的一些问题,这个脚本没有alloc函数,之后我就讲接着,如果你明白为什么程序执行了对应jne的label,那你做得不错。注意所有的labels(跳转标签)都在我的脚本中定义了,否则他们不会编译。Alloc现在开始讲解alloc函数。它是用来按照你的设想来分配X量的内存的函数(hence,alloc,allocate)。这些内存不是那些用过的,而是那些你在运行程序中可以覆盖的没有被使用的内存。就如同我说的,它会分配X量的内存。X是个字节数的变量。1024bytes,或者1kb(kilobyte)一般就足够你用了。现在我们了解了alloc函数,让我来演示下如何来使用它,并利用之前所学到的一切。(摸丸:按照尺寸划分一块内存,并给它起个名字)Code:alloc(AutoAssembler,1024)alloc(SayWhat,1024)label(Continue)AutoAssembler:moveax,02cmpeax,03jneContinuejeSayWhatContinue://...SayWhat:jmp0注意为什么我不这么做Code:label(AutoAssembler)或者Code:label(SayWhat)因为当用alloc划分出内存的时候,他们在CheatEngine的
本文标题:Cheat-Engine(CE)AA教程
链接地址:https://www.777doc.com/doc-4453414 .html