-
-
[求助]如何修改第14章3.3内存映像校验的代码实现DLL的内存映像校验
-
-
[求助]如何修改第14章3.3内存映像校验的代码实现DLL的内存映像校验
看了第14章 3.3 内存映像校验 的对PE的内存映像校验,想实现对DLL的内存校验
问题是DLL文件的VA如何计算?
下面是PE文件的内存映像校验
————————————————————————————————————————————
// 计算代码区块的CRC32值
//
BOOL CodeSectionCRC32( )
{
PIMAGE_DOS_HEADER pDosHeader=NULL;
PIMAGE_NT_HEADERS pNtHeader=NULL;
PIMAGE_SECTION_HEADER pSecHeader=NULL;
DWORD ImageBase,OriginalCRC32;
ImageBase=(DWORD)GetModuleHandle(NULL);//取基址,其实本例也可直接用0x4000000这个值
pDosHeader=(PIMAGE_DOS_HEADER)ImageBase;
pNtHeader=(PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew);
//定位到PE文件头(即字串“PE\0\0”处)前4个字节处,并读出储存在这里的CRC-32值:
OriginalCRC32 =*((DWORD *)((DWORD)pNtHeader-4));
pSecHeader=IMAGE_FIRST_SECTION(pNtHeader); //得到第一个区块的起始地址
//假设第一个区块就是代码区块
//是从磁盘文件得到代码块的地址和大小来计算CRC32值
if(OriginalCRC32==CRC32((BYTE*) (ImageBase+pSecHeader->VirtualAddress),pSecHeader->Misc.VirtualSize))
return TRUE;
else
return FALSE;
//如果程序从磁盘文件获取第一区块的数据,加壳后,数据将可能不准确,因此对于要加壳的程序来说,
//直接填上代码区块的地址和大小,方法是先随便填一数据,编译后用PE工具查看生成文件的代码区块的RVA和大小,
//再填进来重新编译
/*
if(OriginalCRC32==CRC32((BYTE*) 0x401000,0x36AE))
return TRUE;
else
return FALSE;
*/
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课