Hopper反彙編器如何理解函數名稱是什麼?Swift mangled函數名稱映射
例如,我有一個簡單的名爲function()的Swift函數,並在使用該函數對可執行文件進行反彙編之後,Hopper告訴我它的名稱爲__T04file8functionyy。我可以在可執行文件中找到這些符號的位置,但是我找不到它如何將函數的地址與其名稱進行映射。
Hopper反彙編器如何理解函數名稱是什麼?Swift mangled函數名稱映射
例如,我有一個簡單的名爲function()的Swift函數,並在使用該函數對可執行文件進行反彙編之後,Hopper告訴我它的名稱爲__T04file8functionyy。我可以在可執行文件中找到這些符號的位置,但是我找不到它如何將函數的地址與其名稱進行映射。
我發現這個的Mach-O文件格式參考: https://github.com/aidansteele/osx-abi-macho-file-format-reference
所以我的問題的答案是,有一個特殊的結構叫做nlist_64,它包含可執行文件中函數的地址以及符號表中該函數的重名名稱的索引。
您可以閱讀名稱mangling規格straight from Apple。
如果你只想要一個快速的方法來還原函數的名稱,請在終端中輸入以下:
swift demangle __T04file8functionyy
輸出:
_T04file8functionyy ---> filefunction empty-list empty-list
(我不知道,如果重整名稱您提供爲有效)
謝謝,但我不問如何命名mangling工作,這很簡單。我對可執行文件中的確切位置感興趣,我們可以發現特定地址處的函數具有特定的名稱,該名稱存儲在同一個文件中。 – hedunky
也許[this](https://github.com/apple/swift/blob/master/docs/ABI/Mangling.rst)有幫助。 – Jester
你試過Hopper v4嗎?它會自動消除Swift代碼。因此,您可以在料斗中看到損壞的和重新排列的名稱。 – rustyMagnet