[IDA教程]03-从零开始用IDA做逆向-寄存器知识

IDA加载文件过程

在IDA中打开可执行文件时使用静态分析器分析该文件,也称为Loader。在这种装载程序模式下,该程序将不会执行而是交给IDA静态分析,并最终创建一个.idb文件,分析过程中存储信息(包括重命名)的数据库。变量,函数名,标题...都存在这个文件里。

而.idb文件将是分析过程间产生成的5个文件(.id0,.id1,.nam,.id2和.til)融合在一起:

IDA不具有“撤消”功能,分析过程中所做的任何更改都不会撤消,而是直接保存。但是这些更改仅是存储在idb文件里,不会直接影响到正在分析的原始二进制文件。

在加载程序模式下,没有“寄存器”窗口,“堆栈”等窗口以及加载程序使用的内存模块列表。在Debugger模式下执行和调试程序时,这些信息才会出现。

寄存器知识

寄存器被称为内置在处理器中的小型存储区(易失性内存-仅在计算机仍处于活动状态时才保存数据)。CPU执行命令时,必须从内存中检索指令和对指令进行解码,然后执行与指令目的相对应的操作。

在32位架构中,使用的寄存器是EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI和EIP,而64位架构会多出几个寄存器。

通用寄存器:

  • EAX(寄存器寄存器-累加器):最常用于算术,逻辑和数据传输指令、乘法和除法运算使用此寄存器。对于Windows API函数,函数的返回值通常将存储在EAX寄存器中。
  • EBX(基址寄存器):EBX寄存器可以直接访问存储器数据,它也是一个通用寄存器。
  • ECX(计数寄存器):ECX是一个共享寄存器,可以用作各种命令的计数器。它还可能包含内存中的数据未对齐。使用计数器的命令是顺序,循环和LOOP / LOOPD指令。
  • EDX(数据寄存器):是一个通用寄存器,用于包含乘法结果或除法结果的一部分。它还可以直接访问内存中的数据地址。
  • EDI(目标索引):EDI通常用于处理字符串或数组的工作。该寄存器将指向目标字符串。此外它也是一个通用寄存器。
  • ESI(源索引):与EDI一样,ESI也经常用于处理字符串或数组的操作。该寄存器将指向源字符串。
  • EBP(基本指针):EBP指向内存位置,除了被共享外,还用作访问函数堆栈中的参数和局部变量的帧指针。
  • ESP(堆栈指针):该寄存器始终指向当前堆栈顶部。根据堆栈的工作原理,该寄存器将被定向到低位地址。

因此共有8个通用的32位寄存器,即EAX,EBX,ECX,EDX,ESP,EBP,ESI和EDI。另外这些寄存器可以细分为16位和8位寄存器,如下所示:

例如,如果EAX寄存器的值为0x12345678,则AX是包含最后四位数字的16位寄存器:

AX寄存器可以被分成2个8位寄存器,它们是一对寄存器:AH包含两个数字5和6以及AL所包含的最后两个数字7和8:

可以想象,32位EAX寄存器被拆分为一个16位寄存器,称为AX。AX被分为两个称为AH和AL的 8位寄存器。同样,对于EBX寄存器(BX,BH和BL),ECX(CX,CH和CL)和EDX(DX,DH和DL),其余寄存器仅分为16位寄存器,不再细分为8位寄存器:

特殊寄存器

除了上面的通用寄存器,还有特殊寄存器,包括:

  • EIP(指令指针):这是一个特殊的寄存器,它始终指向要执行的下一条指令。与其他寄存器不同,EIP不受指令直接影响。

另一个重要的寄存器是EFLAGS(标志寄存器),每个位用于反映操作的特定状态。根据计算结果启用这些标志寄存器,并根据这些标志来执行程序的执行分支。

零标志(ZF)是逆向中最常用的标志。通常用于条件分支指令中,根据先前的命令结果更改执行流程。

接下来是段寄存器,指向可执行文件的不同部分,例如CS = CODE,DS = DATA等。

使用寄存器和内存时,另一个重要的细节是最常用数据类型的大小:

重要的是要记住,BYTE为1字节,WORD为2字节,DWORD为4字节。

汇编(asm)指令

每个不同的系统/平台都会有自己的一套Asm命令。

IDA使用与调试器(例如OllyDbg / x64dbg)不同的多种语法来分解ASM命令,因此熟悉用OllyDbg的人都会发现有点混乱。

数据传输命令

  • MOV

MOV dest,src:将源操作数(src)的内容复制到目标(dest)。操作:dest <-src。此命令用于在寄存器之间,寄存器和存储单元之间传输数据。或直接将数字传输到寄存器或存储单元。基本上,此mov命令可以对应于高级语言中的assignment命令。

例子,第一步是将值从一个寄存器转移到另一个寄存器。

MOV EAX,EDI;EAX接收EDI的值;EDI不变,没有变化。

通常,只能将数据直接从寄存器传送或传送到寄存器,但EIP寄存器不能是任何活动的目的地或源。我们无法执行以下语句:

MOV EIP,EAX;此声明完全无效。

下一个示例将常量实现到寄存器中,如下所示:

MOV EAX,1;如果将数字1发送到EAX寄存器,则EAX寄存器的先前值将被覆盖(替换为新值)。

接下来是执行不是其内容的存储位置的值的传输的语句。下图是VEViewer.exe文件中的命令(在此处下载:https://mega.nz/#!CLIgmS5S!s5qrzoxbRP5W9xblRf8bgVz5UWRcR9yGoICF-PpJbR4 )

在上面的示例中,EAX寄存器现在将获取一个内存地址的值。前面的偏移量前缀表示必须使用地址,而不是存储单元的内容。因此,如果按Q,IDA会将此语句转换为:

MOV EAX,46f038h;这是一个类似于OllyDbg的命令,但没有提供任何有关该地址内容的信息。如果我们右键单击地址46f038,我们可以返回IDA显示的原始命令:

猜你喜欢

转载自www.cnblogs.com/17bdw/p/12903230.html
IDA