【转】CE自动汇编的一些常用命令收集及讲解

您所在的位置:网站首页 苹果常用命令是什么意思 【转】CE自动汇编的一些常用命令收集及讲解

【转】CE自动汇编的一些常用命令收集及讲解

2024-07-14 23:23| 来源: 网络整理| 查看: 265

I. 介绍------------------------------'哟,我猜你在读这个是因为下面两件事中的一个。1) 你正在试图学习自动汇编 (我不会叫你菜鸟,因为每个人都是从哪里开始的,对吧 =) )or2) 你想测试你的自动汇编知识 (作为扩展)。那么,如果你是前者,那就慢慢的体会好每个部分,并且在继续进行前确认自己已经明白了这章。Dark Byte wrote:大多数人都认为AA很难,其实它可容易了。来自CE作者自己的话如果是后者,那我不会给你提任何的建议,即使我想帮忙。如果你发现有什么错了,或者含糊或者认为我可以做的更好,请告诉我。我一直处于自我学习的状态! 等等!别问,我知道你在想什么。You wrote:为什么我非要听一个还在学习的人的话?好,我来告诉你,我的朋友。即使我仍然在学习,我了解AA,并且我认为与你分享知识是一件很棒的事。 =)Edit: 这个是很久以前写的,但是现在我学到了很多,并且已经重新检查了。现在,让我们投身入奇幻的电脑世界。

------------------------------II. 寄存器------------------------------这些也许你已经在一些脚本中看到过,它们被非常广泛的使用。有两种寄存器被使用,接下来来进行讲解。---------------II.a 32 Bit---------------首先,我将解释每个寄存器是如何得到它们的名字的,这会帮助你记住它们哪个是哪个。首先,以E开头 (如果你注意了下面,你会发现所有的寄存器都是以E开头的) 它告诉你这个寄存器是32位寄存器。而A,B,C,D的含义你看完描述就能明显得体会到了。像SI, DI, BP,SP,IP也是一样。在 EAX, EBX, ECX, EDX后面的X,他简单的表示已经没有更多的字母了。有点像一个 NOP 命令 (之后你将读到)。如果你注意了,你会发现每个32位寄存器都是3个字母。EAX: 累加器(Acculmulator register)。能够用来当存储器EBX: 从前, 它是个基础寄存器,但现在只是个闲着的存储器ECX: 计数器(Counting register)。也能用来当存储器EDX: 数据寄存器(Data register)。 跟之前三个一样,能用来当存储器。ESI: 源址变址寄存器(SourceIndex register)。 是字符串形式的指针变量,但你现在还不用担心那部分。 能够用来当存储器。EDI: 目的变址寄存器(DestinyIndex register)。又一次,能够当作存储器,并且是个字符串形式的指针变量, 但别担心。EBP: 机制指针寄存器(Base Pointer register)。 是用来临时存储ESP, 当然也可以像常规的存储器那样使用。ESP: 原址指针寄存器(Source Pointer register)。它在堆栈里指向寄存器和地址(这个内容待会再说)。EIP: 指令指针寄存器(Instruction Pointer register)。 错误的使用会使你正在试图修改的程序崩溃。---------------II.b 16 Bit---------------16位寄存器和32位寄存器很相似,他们间有两个区别。一是,32位寄存器名字是三个字母,而16位寄存器是两个字母。

---------------

III.a JMP

---------------JMP 命令是最常使用的命令之一 (就如同 MOV 那样, 接下来会讲)。 也许你在操作码和脚本里看到的"JMP" 不像"MOV" 那么多,那是因为 JMP 命令有很多变种。下面就是列表。JMP: 始终跳转(Always jump to)JE/JZ: 相等则跳转(Jump to if equal)JNE/JNZ: 不等则跳转(Jump to if not equal)JA: 无符号大于则跳转( Jump to if Above)JG: 有符号大于则跳转(Jump to if Greater)JNA: 无符号不大于则跳转(Jump to if not Above)JNG: 有符号不大于则跳转(Jump to if not Greater)JB: 无符号小于则跳转(Jump to if Below)JL: 有符号小于则跳转(Jump to if Lower)JNB: 无符号不小于则跳转(Jump to if not Below)JNL: 有符号不小于则跳转(Jump to if not Lower)JAE: 无符号大于等于则跳转(Jump to if Above or Equal)JGE: 有符号大于等于则跳转(Jump to if Greater orEqual)JNAE: 无符号不大于等于则跳转(Jump to if not Above orEqual (即 JB) )JNGE: 有符号不大于等于则跳转(Jump to if not greaterthan or Equal (即JL) )现在你大致了解了,应该有些疑惑。 "Jump to if greater"或者JG都是条件跳转。 条件跳转都如同它们名字所描述的那样,会在条件成立的情况下跳转。通常,都会有CMP或者其他的比较函数在上面,这个待会再提。以上大抵就是JMP的故事。

---------------III.d Alloc/Label/RegisterSymbol---------------我一般喜欢用两种方法来区分Auto Assembler脚本1) 简单的地址改变如同下面的简单代码:Code:[enable]00ABC123:mov eax,ebx[disable]00ABC123:mov ebx,eax这是在改变地址00ABC123里面的操作码。但是也有非常复杂的脚本,就如同dICE 或 pID00的脚本。 (我不会在这里介绍, 因为那真的没什么必要去学)在非常复杂的脚本当中,你会在最顶上看到某些函数,(注意,我并没有经常使用)在一个复杂的脚本当中通常会出现"alloc","label"函数,有时还会出现"registersymbol"。````````````Label````````````我认为"label"函数是三个函数中最有重要的。 他能够允许你用在脚本中使用"label"定义的变量,如同下面这样。 (摸丸:label用于定义用于跳转的标签)Code:label(Continue)AutoAssembler:mov eax,02cmp eax,03jne Continueje SayWhatContinue://...//...SayWhat:jmp 0 //insta-crash! =D首先应该注意此脚本的一些问题,这个脚本没有 "alloc" 函数, 之后我就讲接着,如果你明白为什么程序执行了对应jne的label,那你做得不错。注意所有的labels(跳转标签)都在我的脚本中定义了,否则他们不会编译。````````````Alloc````````````现在开始讲解"alloc"函数。 它是用来按照你的设想来分配X量的内存的函数 (hence,alloc,allocate)。 这些内存不是那些用过的, 而是那些你在运行程序中可以覆盖的没有被使用的内存。 就如同我说的,它会分配X量的内存。 X是个字节数的变量。1024bytes, 或者1 kb(kilobyte) 一般就足够你用了。现在我们了解了alloc函数,让我来演示下如何来使用。

那我们为什么不把学的加进脚本里呢?Code:[ENABLE]alloc(AutoAssembler,1024)alloc(SayWhat,1024)alloc(WooHoo,1024)label(Continue)registersymbol(WooHoo)AutoAssembler:mov eax,02cmp eax,03jne Continueje SayWhatContinue:cmp eax,[WooHoo][DISABLE]dealloc(AutoAssembler)dealloc(SayWhat)dealloc(WooHoo)unregistersymbol(WooHoo)哦这儿...还有个问题。You wrote:为什么你不用那个"1024"了?因为计算机知道你分配的AutoAssembler是大小为1024 bytes 的 (我们就把它当个例子试一试吧),你只是需要deallocAutoAssembler,它就知道应该取消分配AutoAssembler的全部1024 bytes了。(很抱歉,解释的有些迷糊)

---------------III.e Call and Ret---------------Call 函数和JMP 函数很相似。 唯一的不同是Call有个返回到之前代码的功能。这个简单例子利用了下面的两个函数。Code:mov [0100579C],10 //把地址的值改成10cmp [0100579C],0 //把它和0进行比较call NameGoesHere //调用或者跳转到 NameGoesHerejmp 01002FF5NameGoesHere:dec [0100579C] //地址的值减1cmp [0100579C],0 //跟0进行比较jne NameGoesHere //如果不相等就返回到//NameGoesHere的开始,否则 继续ret //返回到之前,刚好是调用(call)函数之后---------------III.f Others---------------现在,很显然,在Auto Assembler还有很多很多其他的函数,不然它就是个很局限的语言。我会继续尽我所能解释更多的函数。 (哦,老兄...)`````Nop`````Nop: 这个我之前提过。 它意味着 "无操作", 大体上它可以抵消它之前的代码。`````Inc/Dec`````Inc: 加一。 用于给寄存器或地址加一。 用法如下。Code:inc eaxDec: 减一,跟Inc似的`````Add/Sub`````Add: 加法。 用法如下。Code:add eax,02 //给eax加2,并且将结果保存在eax中Sub: 减法,用法类似Add`````Lea`````这个有点让人迷糊, 但还是继续吧。看下边的脚本。Code:mov eax,00123ABClea ebx,[eax+DEF]也许你分不清楚,[eax+DEF] 是一个指针。 LEA把后面被指向的[eax+DEF]的地址替换给前面被指向的ebx里。`````And/Or/Xor`````

好,我不知道如何清晰的说明“异或(xor)”在英文中的含义 –很多网站都只是用几行字这么描述的...Them wrote:我估计你明白这些逻辑操作符的行为如果谁能给我用英文为XOR做个定义我将感激不尽。即使如此,我还是不需要帮助就能解释它们是如何在汇编中工作的。 ;)首先,它们都有着类似于add、sub命令一样的语法,如下。Code:and eax,ebx每个eax 和 ebx 都可能是任何东西。哦不对, 他不可能是 "mymom"。 -。-;回到脚本。来处理这个,(对,我知道我们都不是电脑...) 我们先要给两个寄存器值。就把12给eax,把27给ebx吧。下面,我们把它换成二进制的—那个零和一的语言。 =O 有问题吗?You wrote:怎么把十进制转成二进制啊?我的傻朋友啊, 你怎么把你的好友计算器给忘了,用十进制把数输入,然后再点二进制啊! 有些事情需要注意,计算器不允许输入小数,它会简单的四舍五入下然后再转成二进制。我搞出了:Code:EAX = 1100&EBX = 11011好,还能回想起小学时做的数学填空题吗?让我们在这儿做下。Code:and eax,ebxEAX = 1100EBX = 11011------------现在,ADD(与)方法是如果都是1则是1,否则就是0。那就让我们来做出这道题吧。Code:and eax,ebxEAX = 01100 (加个0更轻松)     注:这里是二进制换成十进制也就是12EBX = 11011                             注:这里是二进制换成十进制也就是27-----------------01000现在我们把01000改成十进制,我们就会得到8,那个被存在EAX里的值。

窍门:为了方便记忆我们可以记住AND都假才假,看不懂也不要紧,确实需要一点编程基础。接下来, 是OR(或) 函数。 现在让我们用相同的方法来轻松一下Code:or eax,ebxEAX = 01100                                注:这里是二进制换成十进制也就是12EBX = 11011                                注:这里是二进制换成十进制也就是27

-----------------OR函数的功能与AND函数正相反。都是0,则得0, 否则就得1。Code:or eax,ebxEAX = 01100EBX = 11011------------------

11111把11111转成十进制,那会得到31,是EAX里存的值。最后,是XOR(异或)函数。还是用那个方法。Code:xor eax,ebxEAX = 01100EBX = 11011-----------------好,XOR函数是如果两个数相同就得0,不同就得1。Code:xor eax,ebxEAX = 01100EBX = 11011-----------------10111

总结:亦或,不难理解,编程经常用到,没基础的小伙伴可以记住XOR:比真为真我们把它转换成23,而23就是储存在EAX里的值。顺便一提,无论当我们写的是脚本、代码还是别的什么,你都不需要考虑EAX里面装的什么BlahBlahBlah的东西, 我之所以这么做是让你知道它是如何工作的。`````好,这就是你所有需要知道的命令,(伙计,这可真长...) 让我们开始下一章节吧...

------------------------------Bonus. Writing a Script------------------------------既然你读了教程,那也应该很了解了,但你还是想知道更多。 我明白, 就如同我体会过的—遗憾。我不认为有任何关于写脚本的教程是我用的上的。Code:[ENABLE]alloc(AutoAssembler,1024)alloc(SayWhat,1024)alloc(WooHoo,1024)label(Continue)registersymbol(WooHoo)AutoAssembler:mov eax,02cmp eax,03jne Continueje SayWhatContinue:cmp eax,[WooHoo]SayWhat:jmp 0[DISABLE]dealloc(AutoAssembler)dealloc(SayWhat)dealloc(WooHoo)unregistersymbol(WooHoo)还记得之前的这个脚本吗? 现在让我们用我们所学的大量内容把它弄完整。Code:[ENABLE]alloc(AutoAssembler,1024)alloc(SayWhat,1024)alloc(WooHoo,1024)label(Continue)registersymbol(WooHoo)AutoAssembler:mov eax,02cmp eax,03jne Continueje SayWhatContinue:cmp eax,[WooHoo]SayWhat:jmp 0[DISABLE]dealloc(AutoAssembler)dealloc(SayWhat)dealloc(WooHoo)unregistersymbol(WooHoo)对于脚本你需要有些东西, 一个你试图hack的程序的真实内存的地址。 无论如何, 它都不能是一个随机的地址, 或者是一些你不希望它发生但是会导致其发生的地址(崩溃,也许)。

这个地址对于这件事很重要。但是为什么我们需要一个地址? 就如同之前我所说的,alloc 函数在你的程序中分配一块未使用内存。因为这是未使用的,程序不会访问这里,所以,你要让程序访问它。当你干预这些地址时,你需要注意一些至关重要的事情。第一, 你必须用与源码相同总量的字节。 如何知道一个操作码字节的数量呢? 简单,看在地址和操作码中间,那儿应该有一堆两个一组两个一组的字符,他们被称为Array of Bytes。nop 函数对于这种情况非常有帮助。就如同我之前解释的那样,它的含义是“无操作”。并且它只用一个字节。这意味着,如果你用不了所有的字节位置,那你就可以用nop把它填满。当填字节时你可能会遇到三种情况。我已经描述了第一种你的代码比源码少的情况。剩下两种情况的一个是,你的代码所占的字节数和源码字节数相等,一切刚刚好。但最后一种情况有些令人困惑,那就是你的代码的字节比源码的多。现在,你的代码的字节会把下面的代码字节覆盖,直到字节的位置够用。为什么我们不玩Minesweeper呢? 一段时间之前,我还在学习写脚本的时候,我写了一小段代码(我还是我,但那时我还知道的很少)。Code:[enable]alloc(WhatNowMinesweeper,256) //分配...alloc(ChiliDog,4)label(ReturnHere)registersymbol(ChiliDog) //注册...ChiliDog:dd 0 //用于参考引用,表示ChiliDog的值是从0开始01002FF5: //这个地址是为MineSweeper写入时间的jmp WhatNowMinesweeper //我重写了操作码,让它跳转到我的脚本nop //填充了最后的字节ReturnHere: //这个是干什么的我待会告诉你WhatNowMinesweeper: //我的实际代码push eax //保存eax, 我们不这么做就会有问题mov eax,[ChiliDog] //把ChiliDog的值传入eaxmov [0100579C],eax //把存有ChiliDog值的eax存入时间pop eax //让eax出栈,因为我们已经用完了

jmp ReturnHere //跳转到ReturnHere, 待会解释[disable]dealloc(WhatNowMinesweeper) //取消分配内存dealloc(ChiliDog)unregistersymbol(ChiliDog) //反注册标识01002FF5: //这是我修改来跳入我的代码的地址inc [0100579C] //这是源操作码用以防止崩溃现在,最最先要做的。我要告诉你"ReturnHere"是什么。 如你所知,一个被告知要执行一个操作码的程序进程,他们会自动移动到下一个操作码,然后继续。 这就如同一个无限的轮回。这样,如果我们弄了条死路,即代码之后已经没有代码了,那这个程序几乎就会崩溃。因此, 我们要让它执行过我们的代码之后再返回到调用跳转之后的位置上,这样代码就可以继续了—并且我们也不会崩溃! =D



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3