1. 程式人生 > >C++ 讀取PE檔案並十六進位制列印輸出

C++ 讀取PE檔案並十六進位制列印輸出

分析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行列印一次,因為全部列印的話,輸出緩衝區的讀寫清除等等太慢,既然得到的想要的資料,那麼分析就可以進行了,明天分析,哈哈。

參考:

繼續分析可以參考: