admin 管理员组

文章数量: 1086019


2024年3月10日发(作者:接口文档格式)

Windows的PE加载器在启动程序的时候,会将磁盘上的文件加载到内存,然后做很多操作,如函数导入表重定位,变量预处理之类的。这位仁兄等于是自己写了一

接将内存中的程序启动。记得以前的“红色代码”病毒也有相同的特性。

直接启动内存中的程序相当于加了一个壳,可以把程序加密保存,运行时解密到内存,然后启动,不过对于增加破解难度还要稍微复杂点。否则人家把内存中的进

后修复导入表就被拖出来了。

#include "stdafx.h"

typedef IMAGE_SECTION_HEADER (*PIMAGE_SECTION_HEADERS)[1];

// 计算对齐后的大小

unsigned long GetAlignedSize(unsigned long Origin, unsigned long Alignment)

{

return (Origin + Alignment - 1) / Alignment * Alignment;

}

// 计算加载pe并对齐需要占用多少内存

// 未直接使用Image作为结果是因为据说有的编译器生成的exe这个值会填0

unsigned long CalcTotalImageSize(PIMAGE_DOS_HEADER MzH

, unsigned long FileLen

, PIMAGE_NT_HEADERS peH

, PIMAGE_SECTION_HEADERS peSecH)

{

unsigned long res;

// 计算pe头的大小

res = GetAlignedSize( peH->Headers

, peH->nAlignment

);

// 计算所有节的大小

for( int i = 0; i < peH->OfSections; ++i)

{

// 超出文件范围

if(peSecH[i]->PointerToRawData + peSecH[i]->SizeOfRawData > FileLen)

return 0;

else if(peSecH[i]->VirtualAddress)//计算对齐后某节的大小

{

if(peSecH[i]->lSize)

{

res = GetAlignedSize( peSecH[i]->VirtualAddress + peSecH[i]->lSize

, peH->nAlignment

);

}

else

{

res = GetAlignedSize( peSecH[i]->VirtualAddress + peSecH[i]->SizeOfRawData

, peH->nAlignment

);

}

}

else if( peSecH[i]->lSize < peSecH[i]->SizeOfRawData )

{

res += GetAlignedSize( peSecH[i]->SizeOfRawData

, peH->nAlignment

);

}

else

{

res += GetAlignedSize( peSecH[i]->lSize

, peH->nAlignment

);

}// if_else

}// for

return res;

}

// 加载pe到内存并对齐所有节

BOOL AlignPEToMem( void *Buf

, long Len

, PIMAGE_NT_HEADERS &peH

, PIMAGE_SECTION_HEADERS &peSecH

, void *&Mem

, unsigned long &ImageSize)

{

PIMAGE_DOS_HEADER SrcMz;// DOS头

PIMAGE_NT_HEADERS SrcPeH;// PE头

PIMAGE_SECTION_HEADERS SrcPeSecH;// 节表

SrcMz = (PIMAGE_DOS_HEADER)Buf;

if( Len < sizeof(IMAGE_DOS_HEADER) )

return FALSE;

if( SrcMz->e_magic != IMAGE_DOS_SIGNATURE )

return FALSE;


本文标签: 内存 程序 启动 导入