从demangled的名字得到重名的名字
有没有办法从g ++中取回demangled的名字。
例如,我有demangled名称func(char*, int)
,我应该怎么做才能得到重名的名字, _Z4funcPci
?
我的问题是具体的g ++。
你可以简单地使用g ++来编译一个带有你所需要的签名的空函数,并从中提取名字。 例如:
echo "int f1(char *, int) {} " | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//'
给出输出
_Z2f1Pci
这是我认为你需要的。 确保包含任何相关的头文件,因为它们会影响符号被破坏的方式。
基于Bojan Nikolic的方法,这是一个更好的脚本:
mangle.bash:
IFS='::' read -a array <<< "$1" indexes=("${!array[@]}") prefix="" middle="" suffix="" rettype="" if [ -z "$2" ]; then rettype="void" fi for index in "${indexes[@]}" do #echo "$index ${array[index]}" if [ $index == ${indexes[-1]} ]; then #echo "last" middle="$rettype ${array[index]};" elif [ -n "${array[index]}" ]; then #echo "not empty" prefix="${prefix}struct ${array[index]}{" suffix="${suffix}};" fi done #echo "$prefix$middle$suffix $rettype $1{}" echo "$prefix$middle$suffix $rettype $1{}" | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//'
使用:
$ ./mangle.bash "abc::def::ghi()" _ZN3abc3def3ghiEv $ ./mangle.bash "abc::def::ghi(int i, char c)" _ZN3abc3def3ghiEic $ ./mangle.bash "abc::def::def(int i, char c)" constr _ZN3abc3defC2Eic $ ./mangle.bash "abc::def::~def()" destr _ZN3abc3defD2Ev
但是对于构造函数和析构函数,请记住C0 C1 C2和D0 D1 D2。
最糟糕的是,有时你不能打破一个名字,因为你必须得到不止一个结果。
请参阅https://reverseengineering.stackexchange.com/q/4323/4398(VFT中有多个析构函数,并将它们全部解压为;ClassName::~ClassName()
)。 (这同样适用于构造函数,我看过C0和C2的构造函数。)
另一方面,该答案引用了Itanium ABI: https : //refspecs.linuxbase.org/cxxabi-1.75.html#mangling-type ,其中指定了mangling。
Itanium-abi Haskell软件包:它不适合我(2014年5月)
有一个Haskell包http://hackage.haskell.org/package/itanium-abi ,它承诺去除和修改,但是我只能运行demangling:
在Ubuntu上安装精确:
sudo aptitude install ghc sudo aptitude install cabal-install cabal update cabal install itanium-abi
然后你运行ghci
,然后import ABI.Itanium
并import Data.Either
你可以得到:
Prelude ABI.Itanium Data.Either> cxxNameToText $ head (rights [ demangleName "_ZTI13QSystemLocale" ]) "typeinfo for QSystemLocale"
有mangleName
,但它需要一个DecodedName
这是一个数据结构,而不是一个string,并且该数据结构只由demangleName
(除非我忽略了某些东西)产生。 希望这个版本在未来的版本中会变得更好。
铛代码
我没有尝试铛代码 。