涉及道PE的小程式。

2021-04-21 12:29:15 字數 1326 閱讀 3626

看雪有啊 我都摘過來吧

前兩天看到這麼乙個程式。**如下:

#include

int main()

執行這個程式,螢幕上會出現乙個 :)

很多人不懂其中的道理,在這裡我給大家分析下**。

先看這兩句:

const short int c1 = 49920;

const int c2 = 1073742008;

定義了兩個區域性變數,數值轉換成16進製為:

const short int c1 = 0xc300;

const int c2 = 0x400000b8;

其中變數c1的位址為:0x0012ff7c ,佔兩個位元組,c2的位址為:0x0012ff78,佔四個位元組。這兩個變數佔據了連續的空間。變數賦值後,從0x12ff78開始的記憶體單元儲存的位元組碼為:b8 00 00 40 00 c3 。對應的彙編碼是:

mov        eax,400000h

ret

接下來的這句:

int (*pf)() = (int (*)())&c2;

分析如下:

定義了乙個函式指標,引數為null,返回值為int型別。 這個函式指標,指向上面的彙編碼。這樣,後面執行pf(),就執行了這段彙編碼。

繼續分析下面這句**:

printf("%c%c/n", *(char*)pf()-19, *((char*)pf()+1)-49);

先看*(char*)pf()-19這個表示式, 執行了了pf指向的彙編**,從彙編**看,

這個函式呼叫後的返回值是0x400000,pf()前面的char *是把函式的返回值轉換成乙個

char*型指標,這個指標指向0x400000,前面再加個*號,表示取0x400000位址的內容,

由於是char *型指標,因此從這個位址取乙個位元組。

*(char*)pf()-19 表示的是從0x400000取出的位元組內容再減去19。

熟悉pe檔案結構的朋友一定知道,對於exe檔案0x400000是記憶體載入的基位址。

也就是說,0x400000 位元組的內容對應的是0x4d,0x400001 位元組的內容對應的是0x5a.

這是我們常說的pe檔案起始的兩個位元組,"mz"

這樣,表示式*(char*)pf()-19的結果是0x3a ,表示式*((char*)pf()+1)-49的結果是0x29

察看ascii碼表,輸出就是我們看到的樣子。

總結:

別看乙個這麼小的程式,但是其中涉及的知識面比較廣

檔案 偏移 基址 PE檔案涉及的位址概念

旋風火雞 pe可執行檔案格式詳解 zhuanlan.zhihu.com 在pe檔案中的節等模組載入到記憶體時,節的資料布局和檔案中的記憶體布局基本保持不變。所以可以根據這個資料尺寸相對不變的特點來由rva正確換算出到資料相對檔案的偏移。即,每個節 section 中的資料的起始位置相對節的起始位置是...

微信小程式的簡單頁面設計(不涉及後端)

大一萌新在朋友推薦下嘗試寫部落格記錄下自己的學習經歷 首先 第二點 在b站 完每乙個頁面的 後,自己動手敲出 只有效果實在不理想並且無法完成時才會倒回去抄 並記錄 這點我還是很欣慰的,嘿嘿 其中值得記錄的點 底部選單欄的引用。可以將底部選單欄固定在需要的頁面,不用在頁面重複編寫 相應的樣式引入 im...

成語答題賺小程式裡面涉及到金額的小數計算問題

是這樣的,在成語答題賺小程式裡面有個紅包的概念,使用者闖關答題,每次都是幾分的小紅包,1分,2分,最多1毛錢 比如我現在紅包有1.23,闖關答題獎勵了0.01,這樣我目前的總紅包計算如下 1.23 0.01 這裡就涉及到了小數字的計算問題,今天在小程式裡面遇到了,在之前的邏輯裡面沒有處理好這個計算細...