2010-12-01 59 views
2

我正在爲一個程序製作一種反黑客的東西,我希望能夠創建一個函數字節的校驗和以查看它是否已被修改。我知道如何執行校驗和,但是如何獲得我應該校驗和的字節數?有沒有辦法讓我的功能的大小?內存中函數的校驗和

+3

如果你正在做一個反黑客的事情,你怎麼知道你的校驗和功能沒有改變? – 2010-12-01 21:02:44

+0

@Anon Checksum it :) – 2010-12-01 21:03:19

回答

0

代碼通常在只讀存儲器中,因此它不能更改。

但是,您可以嵌入一個DLL的校驗和,以便在加載它後立即驗證其自己的圖像,並在DLL磁盤映像已被修改時中止。但是,操作系統尚未完成這項工作嗎?

2

從理論上講,您可以使用指向可執行文件中函數的符號長度(假設您可以掌握它),但實際上它並不需要是正確的 - 系統不會在意,它只是到函數的開始處運行,直到函數返回。你可以試着找到下一個函數的開始,並假設這些函數是順序的(除了填充,但沒有理由不僅僅是校驗和),但是這要求你知道在你想要校驗的那個函數後面有哪個函數。無論採用哪種方式,您都必須讓可執行文件在內存中進行分析以找到標頭的那一部分。

0

標準不允許使用函數作爲sizeof運算符的參數。所以沒有可移植的方式來獲得函數體的大小。此外,函數不一定要放在連續的內存塊中。幾個函數的一部分可以在一個地方洗牌(這是VS在發佈版本中做的)。

4

不要嘗試。您不能假定函數在內存中是連續的:它可能具有基本塊,其起始地址低於其入口點;它可以與其他函數共享尾部基本塊;它可能包含散佈的數據或對齊字節,或者它可能完全消失,這取決於調用站點(由於編譯器決定內聯函數)。

您的代碼沒有辦法知道生成的函數的大小。試想一下:大小完全取決於編譯器發出的內容,取決於各種編譯器設置和標誌(想象一個優化的,內嵌嚴格的版本構建與調試構建或使用像SSE這樣的增強指令集,而不是使用它們)。另外,正如已經指出的,這樣的校驗和檢查對於黑客來說是微不足道的 - 只需要另一個分支就可以反轉。

最後,作爲一個好奇的練習,因爲潛在的惡意黑客也會使用它,所以我建議通過IDA Pro反彙編程序鎖定您的二進制文件。這將使你的預計反黑客緩解問題很多明顯...

如果你真的想繼續下去這條道路,我會建議反reversing resources或對你的代碼運行後處理步驟
a)通過插入連接它們的跳躍將所有的功能連接在一起,這些連接永遠不會被佔用。隱藏不透明謂詞背後的分支。這將使反彙編難以閱讀/理解,甚至會由於產生巨大的函數大小而使一些反彙編程序進行靜態流分析。 b)通過一個大分支函數重定向所有函數調用。這會對代碼產生性能影響,但它也會使調用圖完全無法使用/不可讀。