最近在看 软件加密技术内幕的第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;
}
而以上代码在编译的时候没有错误。
我编程知识欠缺,希望高手指点下,这种问题该怎么解决?
////////////////////////////////////////////////////////////////
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!