在反轉二進製文件和解析內存時,我經常遇到像“ @ YAXPAX @”
這樣的字符串,這些字符串用於引用過程。
我相信這些字符串是符號引用。
在反轉二進製文件和解析內存時,我經常遇到像“ @ YAXPAX @”
這樣的字符串,這些字符串用於引用過程。
我相信這些字符串是符號引用。
我相信這是由於 Name Mangling而引起的,這又稱為 name裝飾。 名稱修改是編譯器用來將語義相關信息從編譯器傳遞到鏈接器的機制。
這是Wikipedia如何描述Visual C ++系列編譯器的名稱處理:
Visual C ++名稱處理是一種使用的處理(裝飾)方案在Microsoft Visual C ++系列編譯器中。它提供了一種編碼名稱和有關函數,結構,類或其他數據類型的附加信息的方法,以便將更多語義信息從Microsoft Visual C ++編譯器傳遞到其鏈接器。 Visual Studio和Windows SDK(包括命令行編譯器)隨附程序undname,可以調用該程序undname以獲取以亂碼形式編碼的C樣式函數原型。以下信息大部分是反向工程的。沒有使用的實際算法的官方文檔。
(有點題外話)
c ++ filt是一個非常有用的實用程序,用於在Unix上進行分解。我不確定它在Visual Studio中是否也可用,但是這是可以編譯的簡單實現。比較輸出(g ++,不是VC):
$ nm a.out 0000000100001040 S _NXArgc 0000000100001048 S _NXArgv 0000000100000d40 T __ZN6complxC1Edd 0000000100000d10 T __ZN6complxC2Edd 0000000100000d70 T_000000_000000_000000_000000_000000_000000_000000_000000_000000_000000_000000_000000_000000_000000_000000_000000_000000_000000 0000000100000e20 T _main 0000000100001000 s _pvars U dyld_stub_binder 0000000100000cd0 T start
使用c ++ filt:
$ nm a.out | c ++ filt 0000000100001040 S _NXArgc 0000000100001048 S _NXArgv 0000000100000d40 T complx :: complx(double,double)0000000100000d10 T complx :: complx(double,double)0000000100000d70 T complx :: operator +(complx const&)const 000000000000010e_m_000000_000000_T_head_000000_000000 _main 0000000100001000 short _pvars U dyld_stub_binder 0000000100000cd0 T start
只是一個小提示,以防萬一:您可以通過 Options -> Demangled names .. 對IDA中的名稱進行解密。
我相信默認值是對註釋中的名稱進行修飾,但是您也可以將其更改為函數名稱本身。帶走一些混亂!
對於vc ++名稱分解,您可以使用
這是dbghelp的一個小型包裝,函數UnDecorateSymbolname()可以使字符串並打印出已取消組合的名稱返回控制台,請參見下面的代碼段
?? 3 @ YAXPAX @ Zvoid __cdecl運算符delete(void *)?AFXSetTopLevelFrame @@ YAXPAVCFrameWnd @@@ Zvoid __cdecl AFXSetTopLevelFrame (類CFrameWnd *)
代碼段
int _tmain(int argc,_TCHAR * argv []){char buff [0x100]; UnDecorateSymbolName(“ ?? 3 @ YAXPAX @ Z”,buff,0xf0,UNDNAME_COMPLETE); printf(“%s \ n”,buff);返回0;}
輸出
void __cdecl運算符delete(void *)
有一個紅寶石可以取消C ++名稱的修飾。
您可以將其放置在一個名為ruby shoes的紅寶石鞋應用程序中,該應用程序的名稱很快就會消失,它不支持GCC。
用法:
要求'unmangler'puts Unmangler.unmangle“ ?? 3 @ YAXPAX @ Z” puts Unmangler.unmangle“?AFXSetTopLevelFrame @@ YAXPAVCFrameWnd @@@ Z”#輸出:#void __cdecl運算符delete(void *)#void __cdecl AFXSetTopLevelFrame(class CFrameWnd *)