恶意软件分析基础-PE文件简单分析记录

PE文件简单分析记录

通常在分析一些样本时会遇到如下程序

Handle hImageBase=LoadLibraryA("Kernel32.dll");
void* aAddr =hImageBase+0x3c;
void* bAddr=aAddr++0x78;

的调用,为了能更理解在运行时的解析操作,使用010Editor进行分析了exe文件。

DosHeader

这个是整个PE文件的头部,通常加载一个exe或者dll获取的base地址就是这个头

恶意软件分析基础-PE文件简单分析记录_第1张图片
MZ标志开头,表示这个一个PE文件。如果要读取Rich的字符串头信息和ntheader,则需要

ptrRich = base+0x40,这里就指向了This is programe cannot be run in DOS mode 的信息
ntheader = base+0x3c ;这里会获得ntheader的地址

Dos Stub Header

这里是基本的特征信息This is program ..的信息节区,计算方式

ptrRich=base+0x40,例如这里的ptrRich=0x40

恶意软件分析基础-PE文件简单分析记录_第2张图片

NT _HEADERS

这里需要重点关注,因为整个PE文件的加载和重要信息都保存在这里,包括了子系统,导入表,导出表等,计算方式

ntheader=base+0x3c =>0xF0 前四个字节就是50 40 00 00 对应的PE

恶意软件分析基础-PE文件简单分析记录_第3张图片

在获取到了ntheader之后,就可以读取导入表、导出表等重要信息节区了。

OPTION_HEADE

在知道了ntheader=>0xF0的位置后,计算的option_header如下

opHeader = ntheader+sizeof(Signature)+sizeof(struct FILE_HEADER)
==>
opHeader = 0xF0+0x4+0x14=>0x108 ==>ntheader+0x18

恶意软件分析基础-PE文件简单分析记录_第4张图片

看出图中得出的结果和计算的保持一致。

DATA_DIRECTORIES_ARRAY

要获取导入或者导出目录信息,这里需要获取目录数组地址,依次解析,通常目录数组主要包括了

  • export
  • import
  • resource
  • exception
  • security
  • baseReloctionTable
  • debugdirectory
  • copyRightOrArchitecture
  • GlobalPtr
  • TLSDirectory
  • LoadConfigurationDirectory
  • BoundImportDirectory
  • ImportAddressTable
  • DelayLoadImportDescriptions
  • COMRuntimedescriptor
  • Reserved

每个目录大小是8字节,主要包括两个字段

struct directory{
    DWORD virturalAddr;
    DWORD size;
  };

目前在分析阶段主要关注了导入和导出表的偏移计算,其他的暂时不做关注。这里的virtualAddr只是指向了一个结构体的地址,size表示了这个目录有多少个条目,在遍历的时候会使用到。

IMPORT_DIRECTORY

导入表目录,这个主要是包括了当前PE文件导入的库信息。

根据上述的描述中可以知道,opheader=0x108,则对应的import_directory=0x170 ==>opheader+0x68

恶意软件分析基础-PE文件简单分析记录_第5张图片

EXPORT_DIECTTORY

导出表目录,主要是PE文件要导出的一些符号的目录。这里的export_directory=0x168 ==> option_header+0x60

恶意软件分析基础-PE文件简单分析记录_第6张图片

总结

根据上述的计算结果,可以得出

base = LoadLibrary(targetLib);
nt_header = base+0x3c 
option_headers=base+0x3c+0x18
import_directory= base+0x3c+0x18+0x68 ==>base+0x3c+0x80==>ImportDirectory
export_directory=base+0x3c+0x18+0x60 ==>base+0x3c+0x78 ==>ExportDirectory

通常会在程序内看到如下的计算方法

esi = targeLibHandle;
mov     edi, [esi+3Ch]
push    esi
add     edi, esi
push    edi
mov     [esp+5Ch+kernel_pe_header1], edi
mov     eax, [edi+78h]
push    eax

因此可以得知这里的edi =esi+0x3c==>nt_header eax=edi+0x78==>export_directory

通常这个手段主要是用来动态修复导出表和导出表以及一些修复工作。

你可能感兴趣的:(病毒分析)