簡體   English   中英

C函數逐步完成自己的組裝

[英]C Function to Step through its own Assembly

我想知道是否有一種方法可以在C程序中編寫一個可以遍歷另一個函數以找到指令被調用地址的函數。

例如,我要查找在主要功能中使用ret指令的地址。

我的第一個想法是進行一個while循環,該循環從“&main()”開始,然后每次循環都將地址遞增1,直到指令在當前地址處“ ret”並返回該地址。

當然,可以編寫反匯編機器代碼的程序。 (顯然,這是特定於體系結構的。此類程序僅適用於其設計的體系結構。)這樣的程序可以獲取其main例程的地址並進行檢查。 (在某些C實現中,指向函數的指針實際上並不是該函數代碼的地址。但是,設計為反匯編代碼的程序會將其考慮在內。)

對於新手來說,這將是一個相當困難的任務。

您的程序不會在指令之間將地址增加一個字節。 許多架構的固定指令大小為四個字節,盡管其他大小也是可能的。 x86-64體系結構(有各種名稱)具有可變的指令大小。 拆卸它是相當復雜的。 在分解一條指令的過程中,您必須弄清楚它的大小,以便知道下一條指令在哪里。

但是,一般而言,確定哪一條返回指令是main執行完的返回指令並不總是可行的。 盡管函數通常以簡單的方式編寫,但它們可能會跳來跳去。 一個函數可能具有多個return語句。 它的代碼可能在多個不連續的地方,甚至可能與其他功能共享代碼。 (我不知道這在普通的編譯器中是否是慣例,但可能是。)而且,當然main可能永遠不會返回(並且,如果編譯器檢測到這一點,它可能根本不會編寫返回指令)。

(順便說一句,有數學上的證明,不可能編寫總是確定程序是否終止的程序。這稱為暫停問題 。)

暫無
暫無

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

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