簡體   English   中英

我怎么知道函數在內存中的結尾(獲取地址)-C / C ++

[英]How can I know where function ends in memory(get the address)- c/c++

我正在尋找一種簡單的方法來查找以內存結尾的函數。 我正在開發一個項目,該項目將在其他代碼中發現運行時問題,例如:代碼注入,病毒等等。 我的程序將與將在運行時檢查的代碼一起運行,以便我可以訪問內存。 我無權訪問源代碼本身。 我只想研究其中的特定功能。 我需要知道函數在堆棧中的開始和結束位置。 我正在使用Windows 8.1 64位。

通常,您無法找到函數在內存中結束的位置,因為編譯器可以優化內聯 ,克隆或刪除該函數,將其拆分為不同的部分,等等。該函數可能是一些系統調用,主要在內核中實現,或外部共享庫中的某些函數(程序的可執行文件 “外部”)...對於C11標准(請參閱n1570 ),您的問題毫無意義。 該標准定義了語言的語義 ,即所產生程序的行為屬性。 另見解釋這個答案。

在某些計算機( 哈佛體系結構 )上,代碼將保留在不同的內存中,因此毫無意義地詢問該函數的開始或結束位置。

如果將問題限於特定的C 實現 (即具有特定優化設置的特定編譯器 ,針對特定的操作系統指令集體系結構以及ABI ),則可能(在某些情況下,並非全部)可以找到“函數的結尾”(但這將不是簡單的,並且不會失效)。 例如,您可以對匯編代碼和/或編譯器生成的目標文件進行后處理,檢查ELF可執行文件及其符號表,檢查DWARF調試信息,等等。

您的問題聞起來很像XY問題 ,因此您應該激勵它,並附帶更多的解釋和上下文。

我需要知道函數在堆棧中的開始和結束位置。

函數並不位於堆棧上,而是位於可執行文件(或庫)的代碼段中。 調用堆棧上是一系列調用幀。 呼叫框架的組織特定於您的ABI。 一些編譯器選項 (例如-fomit-frame-pointer )將使探索調用堆棧變得困難(無法訪問源代碼和編譯器的幫助)。

我無權訪問源代碼本身。 我只想研究其中的特定功能。

您的問題仍然不確定,可能無法確定 ,比您認為的要復雜得多(由於與停止問題有關 ),並且有大量相關文獻(請閱讀有關反編譯器靜態代碼分析防病毒惡意軟件分析的信息) )。 我建議花幾個月或幾年來學習有關編譯器(從Dragon Book開始), 鏈接器 ,指令集體系結構,ABI的更多信息。 然后研究與ACM SIGPLAN等有關的會議的一些會議記錄。從實際的角度,研究由編譯器生成的匯編代碼(例如,將GCCgcc -O2 -S -fverbose-asm ....一起使用); CppCon 2017演講:Matt Godbolt “最近我的編譯器為我做了什么? 解開編譯器的蓋子是一個不錯的介紹。

我正在開發一個項目,該項目將在其他代碼中發現運行時問題,例如:代碼注入,病毒等等。

我希望您可以將多年的全職工作獻給您的雄心勃勃的項目。 這可能比您想像的要困難得多,因為優化編譯器要比您認為的要復雜得多( 惡意軟件使用各種復雜的技巧將自己隱藏起來以免受到檢查)。 惡意軟件的研究確實很困難,但很有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM