有没有办法从 g++ 中的 demangled name 中取回 mangled name。
例如,我有损坏的func(char*, int)
名称,我应该怎么做才能_Z4funcPci
恢复损坏的名称?
我的问题是 g++ 特定的。
有没有办法从 g++ 中的 demangled name 中取回 mangled name。
例如,我有损坏的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 承诺去重和重整,但我只能运行去重:
在 Ubuntu Precise 上安装:
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
数据结构而不是字符串,并且该数据结构仅由demangleName
(除非我忽略了某些东西)产生。希望这会在未来的某个版本中变得更好。
铿锵代码
我没有尝试clang 代码。