您的位置:首页 > 编程语言 > C语言/C++

C++ 读取PE文件并十六进制打印输出

2014-02-16 23:42 621 查看
分析PE结构的时候,想自己把里边的结构理解后打印LoadPE分析的东西,在此先把读取PE 结构的C++代码贴出来:

#include <iostream>
#include <iomanip>
#include <windows.h>
#include <fstream>
#define MAX 16*10000
using namespace std;
int value[MAX];

DWORD FileSize()
{
TCHAR szFileName[MAX_PATH]=TEXT("D:\\vs2010\\LoadPE\\Debug\\PE.exe");
HANDLE hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if (INVALID_HANDLE_VALUE==hFile)
{
if (0==GetLastError())
{
printf("file not exist");
}
return 0;
}
DWORD dwFileSize = 0;
dwFileSize = GetFileSize(hFile,NULL);
CloseHandle(hFile);
return dwFileSize;
}
int _tmain(int argc, _TCHAR* argv[])
{
ifstream fin("D:\\vs2010\\LoadPE\\Debug\\PE.exe",ios::binary);
if(!fin)
exit(0);
char c;
long i = 0,j = 0;
cout.setf(ios::uppercase);
cout<<setfill('0');
DWORD leng = FileSize();
while((j*16+i)<leng)//while((c=fin.get())!=EOF)
{
c=fin.get();
value[j*16+i] = (((int)c)&0x000000ff);
if(j % 150 == 0)
{
if(i == 0)
cout<<hex<<setw(7)<<j<<"0h: ";
cout<<hex<<setw(2)<<value[j*16+i]<<" ";
if(i++ == 15)
{
cout << endl;
i = 0;
j ++;
}
}
else
{
if(i++ == 15)
{
i = 0;
j ++;
}
}
}
fin.close();
return 0;
}运行结果:



使用LoadPE打开的结果:



我程序中是150行打印一次,因为全部打印的话,输出缓冲区的读写清除等等太慢,既然得到的想要的数据,那么分析就可以进行了,明天分析,哈哈。

参考:

C++格式化输出

C++  判断文件大小

继续分析可以参考:

C++获取PE文件的入口点

获取PE文件的导出函数列表
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ windows PE