C 讀取檔案 16 進製資料

2021-10-01 18:21:21 字數 3372 閱讀 2064

參考:

#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...