參考:
#include
"stdafx.h"
#include
#include
#include
#include
#include
#include
using
namespace std;
char hex[16]
=;void
setindex
(int num,
char
* hexnumber)
// 設定新的行下標
int index =7;
while
(num !=
0&& index >=0)
}int
_tmain
(int argc, _tchar* ar**)
// 獲取檔案大小、檔名
long
long beg = in.
tellg()
; in.
seekg(0
, ios::end)
;long
long end = in.
tellg()
;long
long filesize = end - beg;
in.seekg(0
, ios::beg)
; cout <<
"file size: "
<< filesize /
1024.0
<<
"kb"
<< endl;
// 讀檔案(每次迴圈讀取 1 位元組)
int bytebeenread =0;
char hexnumber[9]
="00000000"
;unsigned
char temp;
while
(in.
read((
char*)
&temp,1)
) bytebeenread++
;// 讀 1 位元組
int hex =
(unsigned
)temp;
char a = hex[hex /16]
;char b = hex[hex %16]
; cout << a << b <<
" ";
}// 關閉檔案流
in.close()
; cout <<
"read successfully"
<< endl;
getchar()
;return0;
}
效果圖:
比如我想要找到記憶體裡 kiproces***piredtimerlist+0x102 的位置:
;在剛才的函式上稍作修改,找到這一串特徵碼在檔案內出現的位置:
int
get_pe_feature_rof
( string path_r,
// pe 檔案全路徑。我這裡是:"c:\\windows\\sysnative\\ntoskrnl.exe"
int codearr,
// 上面提到的第乙個陣列
int codectrl,
// 上面提到的第二個陣列
int len // 陣列的長度
)// 獲取檔案大小、檔名
long
long beg = in.
tellg()
; in.
seekg(0
, ios::end)
;long
long end = in.
tellg()
;long
long filesize = end - beg;
in.seekg(0
, ios::beg)
;// 讀檔案(每次迴圈讀取 1 位元組)
int bytebeenread =0;
// 已經讀取的位元組數
unsigned
char temp;
// 存放讀取內容的緩衝區
int rof_feature =0;
// 特徵 rof
int codearrsub =0;
// 要對比的 codearr 下標
bool isfound = false;
// 是否找到特徵
while
(in.
read((
char*)
&temp,1)
&& isfound == false)
else
}else
}else}}
//cout << "rof_feature = " << hex << rof_feature << endl;
in.close()
;return rof_feature;
}
函式返回後成功拿到這個位置的 rof:
0x30f42) 屬於 pe 檔案的哪乙個區段。因為 .text 的 roffset 小於 0x30f42 ,且 roffset + rsize 大於 0x30f42 ,所以可知這段**處於 .text 區段:
所以最終的偏移 = 我們**的 rof - .text區段的rof + .text區段的vaddr = 0x30f42 - 0x600 + 0x1000 = 0x31942
用 pchunter 看下 ntoskrnl.exe 的核心基位址(這裡不講怎麼獲取了)
試下 fffff8000421c000 + 0x31942 = fffff8000424d942
計算出的值剛好等於 windbg 中的值:
c 讀取16進製制檔案
1.為什麼有這種需求 因為有些情況需要避免出現亂碼。不管什麼編碼都是二進位制的,這樣表示為16進製制就可以啦。2.如何讀取16進製制檔案 最近程式設計用這一問題,網上查了一下,感覺還是自己寫吧。16進製制資料一般是 text 0x340xb5.就是0x開頭,之後是兩個數字十六進製制數。如果直接使用s...
C C 讀取16進製制檔案
1.為什麼有這種需求 因為有些情況需要避免出現亂碼。不管什麼編碼都是二進位制的,這樣表示為16進製制就可以啦。2.如何讀取16進製制檔案 最近程式設計用這一問題,網上查了一下,感覺還是自己寫吧。16進製制資料一般是 text 0x340xb5.就是0x開頭,之後是兩個數字十六進製制數。如果直接使用s...
ruby 通過16進製制讀取檔案
通過file.sysread 讀取單個byte或多個bytes 在進行一些字串對比時是無法直接對比的 source file file open e test.pcap rb destination file file new e output.pcap wb while true begin by...