找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1880|回复: 0
打印 上一主题 下一主题
收起左侧

汇编语言(长了一点,想了解的慢慢看)

[复制链接]
跳转到指定楼层
楼主
ID:107189 发表于 2016-3-6 00:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 51黑tt 于 2016-3-6 00:22 编辑

我们前面提到汇编语言是破解的基础,这里我们简单介绍一些汇编的知识:
汇编语言用一些助记符来代替0和1的多种组合,也就是各个指令,这样的话,从一定程度上来说,比机器语言方便了许多,但是,汇编也同样不方便,同样写起来不方便,而且后期维护同样不方便,再加上人们慢慢地需要写一些更大的程序,在这样的情况下,高级语言就被人发明了出来,就是我们今天用的Basic、pascal、C、C++等等等等,这些语言的出现,一下了使程序的开发难度大大减低了,以前用汇编要很长时间才能开发出来的程序,现在只需要很短的时间且很轻松的就可以完成了,但是汇编还是有它先天的优势的,因为其与CPU内部的指令一一对应,所以在一些特殊的场合,必须由汇编来实现,比如访问硬件的端口、写病毒等等。而且生成的可执行文件效率巨高,且生成的可执行文件很小,写小程序是很方便的,而且用汇编写注册机,是件很轻松的事。
我们知道计算机只识别0和1,那么,所有存储在计算机上的文件,也都是以二进制的形式存放的,当然也包括可执行文件了。 所以,我们只要找一个十六进制编辑器比如Ultra Edit什么的,就可直接打开并查看可执行文件了,当然,其中就包括可执行文件的代码了。但是这些东西看起来很难看明白,但是我们可以利用相应的软件,可以将这些十六进制数值转换为相应的汇编代码,这样的话,我们就可以对别人的软件进行分析了。这就是所谓的逆向分析了。


所以,如果我们找到软件计算注册码的部分,并对其进行分析,弄懂它的计算方法,那么我们就破解成功了。当然,你也可以将此计算过程还原为任意一个你所熟悉的编程语言,那么,编译后的这个程序,就叫做注册机,它的功能就是计算某一特定软件的注册码。


上面提到的分析方法,就是所谓的静态分析,此类分析常用的工具有W32DASM、IDA和HIEW等。静态分析,顾名思义,就是只通过查看软件的反汇编代码来对软件进行分析。一般如果只是想暴破软件,只进行静态分析就够了。但要想真正的弄清注册算法,一般还是要进行动态分析的,即能过调试器来一边执行程序一边进行分析。


我们再来看看CPU的构成,CPU的任务就是执行存放在存储器里的指令序列。为此,除要完成算术逻辑操作外,还需要担负CPU和存储器以及I/O之间的数据传送任务。早期的CPU芯片只包括运算器和控制器两大部分。到了后来,为了使存储器速度能更好地与运算器的速度相匹配,又在芯片中引入了高速缓冲存储器。除了高速缓冲存储器之外的组成,


大体上可以分为3个部分:


1.算术逻辑部件ALU(arithmetic logic unit)用来进行算术和逻辑运算。这部分与我们的关系不太大,我们没必要管它。
2.控制逻辑。同样与我们的关系不大。

3.这个才是最最重要的。工作寄存器,它在计算机中起着重要的作用,每一个寄存器相当于运算器中的一个存储单元,但它的存取速度却贼快贼快,比存储器要快很多了。它用来存放计算过程中所需要的或所得到的各种信息,包括操作数地址、操作数及运算的中间结果等。下面我们专门的介绍这些寄存器。

在介绍之前,有必要说点儿基础性的知识。现在的寄存器一般是32位的,在CPU中,一个二进制位被看作是一位,八位就是一个字节,在内存中,就是以字节为单位来在存储信息的,每一个字节单元给以一唯一的存储器地址,称为物理地址,到时候访问相应的内存,就是通过这个地址。八个二进制位都能表达些什么呢?可以表达所有的ASCII码,也就是说一个内存单元可以存储一个英文字符或数字什么的,而中文要用Unicode码来表示,也就是说两个内存单元,才能装一个汉字。十六位就是两个字节这不难理解吧,当然,也有三十二位六十四位的,三十二位叫做双字,六十四位就叫做四字。 63/a 0Yn  
首先,介绍通用寄存器。 一共八个,分别是EAX、EBX、ECX、EDX、ESP、EBP、EDI、ESI。 其中,EAX—EDX这四个寄存器又可称为数据寄存器,你除了直接访问外,还可分别对其高十六位和低十六位进行访问。它们的低十六位就是把它们前边儿的E去掉,即EAX的低十六位就是AX。而且它们的低十六位又可以分别进行八位访问,也就是说,AX还可以再进行分解,即AX还可分为AH(高八位)AL(低八位)。其它三个寄存器请自行推断。这样的话,你就可以应付各种情况,如果你想操作的是一个八位数据,那么可以用 MOV AL (八位数据)或MOV AH (八位数据),如果你要操作的是一个十六位数据,可以用MOV AX (十六位数据)三十二位的话,就用MOV EAX (三十二位数据)。这四个寄存器,主要就是用来暂时存放计算过程中所用的操作数、结果或其它信息。 而ESP、EBP、EDI、ESI这四个呢,就只能用字来访问,它们的主要用途就是在存储器寻址时,提供偏移地址。因此,它们可以称为指针或变址寄存器。这就是说此时EBX中装的是一个内存地址,而真正要访问的,就是那那个内存单元中所存储的值。在这几个寄存器中,ESP称为堆栈指针寄存。堆栈是一个很重要的概念,它是以“后进先出“方式工作的一个存储区,它必须存在于堆栈段中,因而其段地址存放于SS寄存器中。它只有一个出入口,所以只有一个堆栈指针寄存器。ESP的内容在任何时候都指向当前的栈顶。堆栈时候,它的基址开始于一个高地址,然后每当有数据入栈,它就向低地址的方向进行存储。相应的入栈指令是PUSH。每当有数据入栈,ESP就跟着改变,总之,它永远指向最后一个压入栈的数据。之后,如果要用压入堆栈的数据,就用出栈指令将其取出。相应的指令是POP,POP指令执行后,ESP会加上相应的数据位数。

  
特别是现在到了Win32系统下面,堆栈的作用更是不可忽视,API所用的数据,均是靠堆栈来传送的,即先将要传送的数据压入堆栈,然后CALL至API函数,API函数会在函数体内用出栈指令将相应的数据出栈。然后进行操作。以后你就会知道这点的重要性了。许多明码比较的软件,一般都是在关键CALL前,将真假两个注册码压入栈。然后在CALL内出栈后进行比较。所以,只要找到个关键CALL,就能在压栈指令处,下d命令来查看真正的注册码。
另外还有EBP,它称为基址指针寄存器,它们都可以与堆栈段寄存器SS联用来确定堆栈中的某一存储单元的地址,ESP用来指示段顶的偏移地址,而EBP可作为堆栈区中的一个基地址以便访问堆栈中的信息。ESI(源变址寄存器)和EDI(目的变址寄存器)一般与数据段寄存器DS联用,用来确定数据段中某一存储单元的地址。这两个变址寄存器有自动增量和自动减量的功能,可以很方便地用于变址。在串处理指令中,ESI和EDI作为隐含的源变址和目的变址寄存器时,ESI和DS联用,EDI和附加段ES联用,分别达到在数据段和附加段中寻址的目的。


接下来,介绍一下专用寄存器,所谓的专用寄存器,有两个,一个是EIP,一个是FLAGS。 我们先来说这个EIP,可以说,EIP算是所有寄存器中最重要的一个了。它的意思就是指令指针寄存器,它用来存放代码段中的偏移地址。在程序运行的过程中,它始终指向下一条指令的首地址。它与段寄存器CS联用确定下一条指令的物理地址。当这一地址送到存储器后,控制器可以取得下一条要执行的指令,而控制器一旦取得这条指令就马上修改EIP的内容,使它始终指向下一条指令的首地址。可见,计算机就是用EIP寄存器来控制指令序列的执行流程的。


那些跳转指令,就是通过修改EIP的值来达到相应的目的的。再接着我们说一下这个FLAGS,标志寄存器,又称PSW(program status word),即程序状态寄存器。这一个是存放条件标志码、控制标志和系统标志的寄存器。


其实我们根本不需要太多的去了解它,你目前只需知道它的工作原理就成了,我们来看个例子:
Cmp EAX,EBX ;用EAX与EBX相减
JNZ 00470395 ;不相等的话,就跳到这里;


这两条指令很简单,就是用EAX寄存器装的数减去EBX寄存器中装的数。来比较这两个数是不是相等,当Cmp指令执行过后,就会在FLAGS的ZF(zero flag)零标志位上置相应值,如果结果为0,也就是他们两个相等的话,ZF置1,否则置0。其它还有OF(溢出标志)SF(符号标志)CF(进位标志)AF(辅助进位标志)PF(奇偶标志)等。


最后要介绍的就是段寄存器了。这部分寄存器一共六个,分别是CS代码段,DS数据段,ES附加段,SS堆栈段,FS以及GS这两个还是附加段。 其实现在到了Win32环境下,段寄存器以经不如DOS时代那样重要了。


相信现在大家对CPU已经有了个大概的了解了。我们接下来就再讲一讲一些常用的汇编指令。


CMP A,B 比较A与B其中A与B可以是寄存器或内存地址,也可同时是两个寄存器,但不能同都是内存地址。这个指令太长见了,许多明码比较的软件,就用这个指令。
MOV A,B 把B的值送给A其中,A与B可是寄存器或内存地址,也可同时是两个寄存器,但不能同都是内存地址。


Xor a,a异或操作,主要是用来将a清空
LEA装入地址,例如LEA DX,string 将字符的地址装入DX寄存器 :
PUSH 压栈
POP 出栈  
ADD 加法指令 格式:ADD DST,SRC 执行的操作:(DST)<-(SRC)+(DST)  
SUB 减法指令 格式:SUB DST,SRC 执行的操作:(DST)<-(DST)-(SRC)  
MUL 无符号乘法指令 格式: MUL SRC 执行的操作:字节操作(AX)<-(AL)*(SRC);   
操作(DX,AX)<-(AX)*(SRC);双字操作:(EDX,EAX)<-(EAX)*(SRC)
DIV 无符号除法指令 格式:DIV SRC 执行的操作:字节操作:16们被除数在AX中,
位除数为源操作数,结果的8位商在AL中,8位余数在AH中。表示为:
(AL)<-(AX)/(SRC)的商,(AH)<-(AX)/(SRC)的余数。字操作:32位被除数在DX,AX中。其中DX为高位字,16位除数为源操作数,结果的16位商在AX中,16位余数在D中。表示为:(AX)<-(DX,AX)/(SRC)的商,(DX)<-(DX,AX)/
(SRC)的余数。 双字操作:64位的被除数在EDX,EAX中。其中EDX为高位双字;32位除数为源操作数,结果的32位商在EAX中,32位余数在EDX中。表示为:(EAX)<-(EDX,EAX)/(SRC)的商,(EDX)<-(EDX,EAX)/(SRC)的余数。 NOP 无作用,可以用来抹去相应的语句,这样的话, CALL调用子程序,你可以把它当作高级语言中的过程来理解。


控制转移指令:
JE 或JZ 若相等则跳
JNE或JNZ 若不相等则跳
JMP 无条件跳
JB 若小于则跳
JA 若大于则跳
JG 若大于则跳  
JGE 若大于等于则跳
JL 若小于则跳
JLE 若小于等于则跳
总的来说,以上几个,都是比较常见的,需要掌握,但需要掌握的绝不止这几个,其它的指令希望你能在私下里再了解一下,可以找相应的教程来看。




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表