看雪有啊 我都摘過來吧
前兩天看到這麼乙個程式。**如下:
#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 這裡就涉及到了小數字的計算問題,今天在小程式裡面遇到了,在之前的邏輯裡面沒有處理好這個計算細...