首页
社区
课程
招聘
[求助]如何修改第14章3.3内存映像校验的代码实现DLL的内存映像校验
发表于: 2009-8-6 16:52 7134

[求助]如何修改第14章3.3内存映像校验的代码实现DLL的内存映像校验

2009-8-6 16:52
7134
看了第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直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 50161
活跃值: (20610)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
DLL内存校验有些麻烦,涉及到重定位,因此DLl加载到不同的内存地址时,其代码段的数据是不一样的。
2009-8-6 17:02
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢Kanxue坛主的指点,能提供一些通用的DLL内存校验代码吗?
2009-8-6 21:02
0
游客
登录 | 注册 方可回帖
返回
//