鸿 网 互 联 www.68idc.cn

开始学习汇编+PE

来源:互联网 作者:佚名 时间:2015-08-28 08:04
非常感谢醒哥。让我有机会能跟着他参加信息安全的全国邀请赛。所以自己肯定是要好好 学习 汇编 和PE了。 这里由于自己的电脑是64位的win7,无法使用debug,搜索了一把发现下面这个CSDN的网站提供了一个dos模拟器来运行32位的debug。 这里给出个链接 http://b

非常感谢醒哥。让我有机会能跟着他参加信息安全的全国邀请赛。所以自己肯定是要好好学习汇编和PE了。

这里由于自己的电脑是64位的win7,无法使用debug,搜索了一把发现下面这个CSDN的网站提供了一个dos模拟器来运行32位的debug。
这里给出个链接

http://blog.csdn.net/ropin_os/article/details/6578794

 

接下来准备把自己电脑的win764位重装成win7 32位,顺便把opensuse给格了,最后等5月份的fedora17出来。

好了,废话不多说了,下面是自己学习汇编的一些笔记和问题。

开始看PE文件格式,真的是看不懂,所以自己决定还是先看下汇编,然后再一边看PE可能会好点。

对于我这个连CPU跟内存都分不清楚的人。。。哎,首先还是先了解下CPU和内存吧。

CPU由下面这三个部分组成:运算器,控制器,寄存器

运算器

运算逻辑部件,可以执行定点或浮点的算术运算操作、移位操作以及逻辑操作,也可执行地址的运算和转换。

寄存器

寄存器部件,包括通用寄存器、专用寄存器和控制寄存器。

  32位CPU的寄存器

 

控制器

控制部件,主要负责对指令译码,并且发出为完成每条指令所要执行的各个操作的控制信号。

与这三类对应的,分别有地址总线(对应运算器),数据总线(对应寄存器),控制总线(对应控制器)

地址总线:用来寻址。寻到内存的范围。

数据总线:进行数据的传送。自然是双向的。

控制总线:CPU对外部器件的控制

 

接下来了解下内存:

存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。 内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。

简单的来说,其实内存就是计算机内部的一个高速的存储空间。

下面是自己摘的一些汇编的笔记。摘自王爽的《汇编语言》

1.关于段地址*16+偏移地址的形式

为什么我们要使用段地址*16+偏移地址的形式?为了增大cpu的寻址长度。

本质含义:cpu在访问内存时,用一个基础地址和一个相对基础地址的偏移地址相加,给出内存单元的物理地址

 

2.CS代码 段寄存器  IP指令指针寄存器

使用CS:IP指向将要执行的指令在内存中的地址

偏移地址在什么时候自动增加?

当指令缓冲器读入一条指令后,IP自动增加读入指令的字节数。如果后面有(执行指令)修改IP的值,那么IP将会被覆盖掉。

 

3.mov指令 传送指令

jmp指令  转移指令 可以修改 IP

格式  jmp  某一合法寄存器

作用  修改IP为寄存器中的值

4.关于debug的使用

R 查看,改变寄存器的内容

D查看内存中的内容

E改写内存中的内容

U将内存中的机器指令翻译成汇编指令

T执行一条机器指令

A以汇编的格式在内存中写入一条机器指令

具体方式这里就不讲解了。

5.内存中的数据和代码没有任何区别。

那么如何判断呢?

指令执行的一定是代码段!

下面是自己遇到的一些问题:

1.关于IP自动增加溢出的问题

上面讲了,经过指令缓冲器以后IP会自动增加,那么有没有IP溢出的状况呢?这个时候CPU是如何处理的呢?

这个问题暂时先放一下,希望看到后面的时候能解答这个问题。

2.关于debug里的u指令查看汇编代码的问题

首先用-e命令修改内存中的内容


然后用-d查看一下


再用-u查看一下


原来1000 0  到1000 2存的是B8 23 01 对应的指令是mov ax,0123

这里自己产生了一个问题:如果-u的查看指针从1000:1开始呢?那么cpu默认的汇编代码是如何改变的呢?

下面这张截图就是从IP = 1开始的了。


可以看到 cpu对于23 01 对应的汇编代码改变了,而下面的指令由于没有改变,任然和原来的是一样的

下面在更改一下,使得IP从2开始指向内存

 

这里也是差不多的,只是将01 b8 00 00 的汇编改成了add [bx+si+0000], di

自己还不知道这条指令是什么意思。

但这里可以发现一点,由于没有01 这条指令对应的汇编代码,所以cpu自动寻找下面的指令,直到能够翻译成一条汇编代码为止。

 

不知道这样的推断是不是正确的,还请大家指教。。。。


网友评论
<