首页
社区
课程
招聘
[讨论]关于软件加密技术内幕的第2章中遇到的问题!
发表于: 2009-11-28 23:01 4349

[讨论]关于软件加密技术内幕的第2章中遇到的问题!

2009-11-28 23:01
4349
最近在看 软件加密技术内幕的第2章 PE分析工具编写,遇到了麻烦,希望有人能提供帮助!

////////////////////////////////////////////////////////////////
//PE文件格式判断
BOOL CPEInfo::IsPEFile(LPVOID ImageBase)
{
        PIMAGE_DOS_HEADER pDosHead;
        PIMAGE_NT_HEADERS pNTHead;
        if(ImageBase==NULL)
                return FALSE;
        pDosHead=(PIMAGE_DOS_HEADER )ImageBase;
        //检测Dos头

        if(pDosHead->e_magic!=IMAGE_DOS_SIGNATURE)
                return FALSE;

        pNTHead=(IMAGE_NT_HEADERS32 )((DWORD)pDosHead+pDosHead->e_lfanew);
        //检测PE头
        if(pNTHead->Signature!=IMAGE_NT_SIGNATURE)
                return FALSE;

        return TRUE;
}

//该段代码 就是 查看一个指定文件是否是 PE文件, 和书上一样。
但是有一句代码有错误。
        pNTHead=(IMAGE_NT_HEADERS32 )((DWORD)pDosHead+pDosHead->e_lfanew);
事实上,我也觉得有问题,((DWORD)pDosHead+pDosHead->e_lfanew) 这个是unsigned long 类型的, 怎么能转换成 IMAGE_NT_HEADERS32类型呢。
编译器提示错误为:
--------------------Configuration: PE_Study - Win32 Debug--------------------
Compiling...
GetPeInfo.cpp
D:\MFC project\PE_Study\GetPeInfo.cpp(67) : error C2440: 'type cast' : cannot convert from 'unsigned long' to 'struct _IMAGE_NT_HEADERS'
        No constructor could take the source type, or constructor overload resolution was ambiguous
执行 cl.exe 时出错.

PE_Study.exe - 1 error(s), 0 warning(s)

但是。。。。。。。我在论坛看见有个哥们,写了个PE分析工具,我看了下源代码,
//代码如下
//////////////////////////////////////////////////////////////////////
//获取IMAGE_DOS_HEADER
//////////////////////////////////////////////////////////////////////

PIMAGE_DOS_HEADER CGetPE::GetDosHeader()
{
        if(m_lpFile==NULL)
        {
                return NULL;
        }
        else
        {
        return (IMAGE_DOS_HEADER *)m_lpFile;
        }

}
//////////////////////////////////////////////////////////////////////
// 获取IMAGE_NT_HEADERS
//////////////////////////////////////////////////////////////////////
PIMAGE_NT_HEADERS CGetPE::GetNTHeader()
{
        PIMAGE_DOS_HEADER pdosheader;
        PIMAGE_NT_HEADERS pNTHead;
        pdosheader=(IMAGE_DOS_HEADER *)m_lpFile;
        pNTHead=(IMAGE_NT_HEADERS32 *)((DWORD)pdosheader+pdosheader->e_lfanew);
        return pNTHead;
}

而以上代码在编译的时候没有错误。
我编程知识欠缺,希望高手指点下,这种问题该怎么解决?

////////////////////////////////////////////////////////////////

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 7325
活跃值: (3803)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
2
pNTHead=(IMAGE_NT_HEADERS32 *)((DWORD)pdosheader+pdosheader->e_lfanew);
2009-11-29 00:34
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不做评价!不熟悉!
2009-11-30 00:31
0
雪    币: 267
活跃值: (24)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
海风的正确解答!
2009-12-5 23:01
0
游客
登录 | 注册 方可回帖
返回
//