PoEdu_反汇编002_寄存器

寄存器:

      上次,我们知道了eax、ebx、ecx、edx等,都是寄存器,寄存器实际上就是CPU中具有存储作用,存储速度极高的一个小内存(可以这么理解)。

      硬盘,内存,高速缓存,寄存器,都是用于存储,是计算机中的四大存储单元,从左到右存储速度越来越高,价格也越来越贵,硬盘适合长时间大量存储,但速度较慢。内存速度相对较快,主要负责运行时保存数据。高速缓存主要是用于对内存中的数据进行预读,如果CPU运行需要的数据在告诉缓存,则称之为catch命中,否则为catch未命中,需要高速缓存再去内存中读取一次。一般工作时,无需关注高速缓存,但如果需要进行程序优化,则catch未命中也是需要考虑的

      实际上,反汇编的过程就是我们观察计算机运行的过程,因此,内存和寄存器两个窗口格外重要,使我们要特别注意的地方。

      在x86平台下,CPU有10个寄存器,其中,有四个数据寄存器(EAX、EBX、ECX、EDX),两个寄存器(ESI、EDI)、两个指针寄存器(ESP、EBP)、EIP、EFlags。

      数据寄存器:每个数据寄存器都是32位的,例如EAX也是32位的,每个数据寄存器都分为高16位和低16位,实际上,低16位称为?X,例如EAX,低16位为AX,EBX的低16位为BX,此外,对于AX和BX等,还可以分为高八位和低八位,例如AX高低八位分别称为AH、AL。BX也是一样(BH、BL)。很多时候,EAX被称为累加寄存器,实际上,会根据编译器优化策略的不同,使用的寄存器也不同,我们只需要知道这四个寄存器就是数据寄存器就好了。

      寄存器(ESI、EDI):ESI,EDI这两个寄存器和数据寄存器功能类似,没有特别专一的用途,当其他功能需要时,就会使用

      指针寄存器:两个指针寄存器功能通常比较单一,ESP是用来保存当前栈底的地址,EBP会用来保存栈顶的地址。但这并不是绝对的,在寄存器不够时,这两个寄存器也可能另作他用。

      EIP:指令指针寄存器,这个寄存器永远不会当作数据寄存器使用,里面存储的是下一条指令的地址。存储的值本身意义不大,但是修改后会直接影响程序的执行

      EFlags:标志寄存器,里面存储的是计算结果的状态,也永远不可能当作数据寄存器使用。修改也会影响程序的执行。

逆向分析:

      逆向分析的目的在于,知道程序具体做了什么事。在VS的反汇编窗口下,有很多协助信息,可以先屏蔽掉,程序如下:


      对应的汇编代码如下:


分析:

      在最开始,我们还是将源码显示等辅助信息关闭,直接看原生的汇编源码,如上图。

      在rep stors指令前面的部分,都是程序之前的动作,先不做分析。

      后面蓝色框中的部分,两个mov指令实际上是将1和2两个数字放入到ebp-8和ebp-14h的位置,用于保存两个32位的值。可以理解为:dword ptr[ebp-8] = 1其中,dword是一个单位,代表32位长度,ptr是指针的意思,[]代表取地址的值,相当于C语言中的*号整个指令动作翻译成C语言就是:*(ebp-8) = 1其中ebp位地址,指向一个32位长的数据ebp本身是一个指向栈顶的寄存器,由此可知,这条指令就是新建一个32位的数据类型,并将其初始化为1,与上面C语言源码一个意思理解这一行汇编代码后,下一行也一样,初始化了一个32位长的数据,存放了2

      后面一行:mov eax,dword ptr[ebp - 8]。这一行实际上是将保存的第一个数据放在了eax中,翻译成C语言,就是:eax = *(ebp - 8)。由此可知,他是将保存的第一个值在放入eax中,但是,为什么步一开始就将第一个值放入eax呢?看了后面就会理解。

      再后面一行:add eax, dword ptr[ebp  14h]。add是加法指令,但作用相当于C语言中的+=可以看出整个指令作用是:eax = eax + *(ebp -14h)。即,将两个保存的数相加了,然后保存在eax数据寄存器当中。

      后面一行:mov dword ptr[ebp - 8], eax。可看出,将相加得到的结果又放入了原本用于保存第一个数据的地址中。这样的作用相当于 a = a+b。

      后面部分:异或操作会将eax清零,后面的代码是程序的收尾工作,暂时不做介绍。

总结:

      之前提出的,为什么不将第一个数据直接放在eax中,实际上,程序本身的作用是实现a = a + b。最开始就初始化了a和b,值分别为1和2。然而数据寄存器eax是CPU用于临时保存数据使用的,而不是初始化多少变量都要保存在CPU的寄存器中(如果真这样,就不需要三级缓存和内存了,但存储成本极高)。此外,如果我们不屏蔽掉辅助信息,会看待汇编代码如下,就能清晰地看出计算机在做什么:


      上面的n1实际上就是C代码中的n1,汇编代码中的:ebp-8



猜你喜欢

转载自blog.csdn.net/qq_31622605/article/details/80946886