瑞星卡卡安全论坛

首页 » 技术交流区 » 反病毒/反流氓软件论坛 » 安全技术讨论 » 病毒分析学习笔记之一
newcenturymoon - 2009-5-18 13:05:00
首先介绍我们会经常看到的一些寄存器:
4个数据寄存器(EAXEBXECXEDX)
2
个变址和指针寄存器(ESIEDI)
2个指针寄存器(ESPEBP)


4个数据寄存器(EAXEBXECXEDX)
32CPU432位的通用寄存器EAXEBXECXEDX。对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AXBXCXDX,它和先前的CPU中的寄存器相一致。
416位寄存器又可分割成8个独立的8位寄存器(AXAH-ALBXBH-BLCXCH-CLDXDH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。

那么如何理解eax,ax,al(ah)之间的关系呢?
专业点可以这样解释:Eax32位寄存器,ax16位寄存器,al(ah)是八位寄存器。
那么eax存储的数据就是ax的两倍,axal(ah)的两倍。
Eax可以存储的数字是DWORD(双字)ax存储的是WORD(字)AL(AH)存储的是BYTE(字节),那么为什么又有AHAL呢,我们可以这样理解,AX=AH+ALAH存储的是AX的高8位数据,AL存储的是AX的低八位数据。H这里就是HIGH,L就是LOW.
假设eax是红色区域,那么eax现在就是64636261
那么ax就是eax的低十六位,也就是6261
Al61AH62

 附件: 您所在的用户组无法下载或查看附件

其他ebxecxedx也有类似的bx,bl,bh等对应的寄存器,原理和上面相同。

在用途方面,他们有各自默认的用途:
Eax用来保存所有API函数的返回值。
寄存器AXAL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;
寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;
寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

由于存储的数据大小关系,AXBXCXDX不能作为基址和变址寄存器来存放存储单元的地址, 32位寄存器EAXEBXECXEDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。(什么是基址,什么是变址以后会说到)

2个变址和指针寄存器(ESIEDI)
32CPU232位通用寄存器ESIEDI。其低16位对应先前CPU中的SIDI,对低16位数据的存取,不影响高16位的数据。

寄存器ESIEDISIDI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
变址寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。

2个重要的指针寄存器(ESPEBP)


这两个指针寄存器都和“栈”这个神秘的东东有关,那么什么是栈呢?这俩指针寄存器又有何作用呢?


从计算机科学的角度看,栈是一种数据结构,是一种先进后出的数据表。栈的最常见操作有两种:Push(入栈)和Pop(出栈)。


我们可以把栈想象成一摞扑克牌:
PUSH:为栈增加一个元素的操作是push,相当于在这摞扑克牌最上面再放一张

POP:从栈中取出一个元素的操作叫做POP,相当于从这摞扑克牌取出最上面的一


张。


TOP:标识栈顶位置,并且是动态变化的。每做一次PUSH 操作,它都会自增1


相反,每做一次POP 操作,它会自减1。栈顶元素相当于扑克牌最上面一张,只有


这张牌的花色是当前可以看到的。

BASE:标识栈底位置,它记录着扑克牌最下面一张的位置。BASE 用于防止栈空后


继续弹栈(牌发完时就不能再去揭牌了)。很明显,一般情况下,BASE 是不会变动


的。

用王爽《汇编语言》中的图说明一下push和pop操作
代码如下:
mov ax,0123H
push ax
mov bx,2266H
push bx
mov cx,1122H
pop ax
pop bx
pop cx

mov是传送数据的指令,mov ax,0123H表明把0123H这个值给ax
H代表0123是十六进制数


 附件: 您所在的用户组无法下载或查看附件

mov是传送数据的指令,mov ax,0123H表明把0123H这个值给ax
H代表0123是十六进制数
图中左边的10000H等数值表明内存地址
箭头指向栈顶位置

那么针对此例栈底就是1000FH
栈顶由于入栈和出栈操作在不断变化。

那么在这里栈底1000FH就是BP 栈顶(不断变化的箭头)就是SP
(BP和SP分别是16位下的寄存器,与ebp,esp类似)


内存的栈区实际上指的就是系统栈。系统栈由系统自动维护,它用于实现高级语言中函


数的调用。对于类似C 语言这样的高级语言,我们无需担心他们是如何操作的。一般说来,只有在使用汇编语言的时候,才需要和它直接打交道。




那么ESP和EBP指的分别是什么呢?


(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。


那么为什么在反汇编分析的时候会经常看到下面的代码,他们是什么意思呢?


Push ebp


Mov ebp,esp


Sub esp,xxx



Add esp,xxx


Pop ebp


Retn



这些ebp和esp操作究竟是对栈做了什么呢?我们下次再说。






本次重点内容:了解几个常见的寄存器名字,记住eax一般用来保存函数的返回值,记住esp是栈顶指针寄存器,ebp是栈底指针寄存器。






参考书目:《加密与解密》第三版


《Windows环境下32位汇编语言程序设计》


《0-day安全:软件漏洞分析技术》





用户系统信息:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)
networkedition - 2009-5-18 14:26:00
排队听课,学习了。:kaka1:
天月来了 - 2009-5-18 14:53:00
虽然不懂,也先强记一些吧:kaka1:
baohe - 2009-5-18 14:59:00
我来顶楼主一下:kaka12:
vistalong - 2009-5-18 15:25:00
排队听课
最硬的石头 - 2009-5-18 15:46:00
:kaka12: 哇,阳光讲课了,排队听课哈
zengjie5927 - 2009-5-18 15:50:00
学习了!蛮难懂的!
最硬的石头 - 2009-5-18 16:20:00

Push ebp  //保存原来的edp,因为ebp总是用来保存这个函数执行之前的esp


Mov ebp,esp //保存esp到ebp


Sub esp,xxx //esp减去一个数值,腾出一个空间,用来保存局部变量



Add esp,xxx //esp加上原来的数值,清空局部变量

Pop ebp //恢复ebp


Retn //返回

应该是一个函数的开始和结尾吧,阳光我爱你,收我做徒弟吧:kaka18:

newcenturymoon - 2009-5-18 17:05:00
:kaka11: 你都说了 下回我没的说了
A小可 - 2009-5-18 17:16:00
:kaka12: 偷师来了,这么好的老师讲课不能不听。
超级游戏迷 - 2009-5-18 17:29:00
来看代码来了……:default15:

晕,真难理解……:default20:
backway - 2009-5-18 18:32:00
大部分不懂。。。很想学这方面的东西。。。
阳光帅哥。。。也收我做徒弟吧。。。:default13: :default71:
smallyou93 - 2009-5-18 18:56:00
:kaka9: 好好学习,收藏
幸福耗子 - 2009-5-18 19:06:00
排队听课
轩辕小聪 - 2009-5-18 21:01:00
“对应上面的描述,ESP指的是TOP,也就是栈顶;而EBP指向BASE,也就是栈底。”
我对这句话觉得不对,EBP应该指的是当前栈帧的底部,而不是整个栈的底部。
按照阳光的参考文献,我翻了一下《0day安全:软件漏洞分析技术》,发现“从计算机科学的角度看,栈是一种数据结构……”等内容直接来自该书第40页,但是在该页却没有看到“ESP指的是TOP,也就是栈顶;而EBP指向BASE,也就是栈底”的描述。
再翻到该书第44页,上面有关于这两个指针寄存器的更准确的说明:

+++++++++++++引文开始++++++++++++
“(1)ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
(2)EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

注意:EBP指向当前位于系统栈上最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念,本书在叙述中将坚持使用“栈帧底部”这一提法以示区别;ESP所指的栈帧顶部和系统栈的顶部是同一个位置,所以后面叙述中并不严格区分“栈帧顶部”和“栈顶”的概念。请您注意这里的差异,不要产生概念混淆。”
+++++++++++引文结束+++++++++++++

显然作者特别提醒读者,不要将“栈帧底部”和“栈底”的概念搞混。因此我认为阳光在这里有必要区别清楚,严格来说ebp中的指针指向的是“栈帧底部”而非系统栈的“栈底”。
最硬的石头 - 2009-5-18 21:06:00
不会的,师傅如此多才,怎么会呢:kaka18:
天云一剑 - 2009-5-19 9:14:00
等课更新
6709的空 - 2009-6-5 16:09:00
拜读
1
查看完整版本: 病毒分析学习笔记之一