C++ 讀取PE檔案並十六進位制列印輸出
阿新 • • 發佈:2019-02-09
分析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行列印一次,因為全部列印的話,輸出緩衝區的讀寫清除等等太慢,既然得到的想要的資料,那麼分析就可以進行了,明天分析,哈哈。
參考:
繼續分析可以參考: