51

有没有办法从 g++ 中的 demangled name 中取回 mangled name。

例如,我有损坏的func(char*, int)名称,我应该怎么做才能_Z4funcPci恢复损坏的名称?

我的问题是 g++ 特定的。

4

3 回答 3

41

您可以简单地使用 g++ 编译具有所需签名的空函数并从中提取名称。例如:

echo "int f1(char *, int) {} " | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//'

给出输出

_Z2f1Pci

这是我认为你需要的。确保包含任何相关的头文件,因为它们会影响符号被破坏的方式。

于 2012-09-13T12:48:42.470 回答
13

基于 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 。

于 2014-06-09T08:02:33.237 回答
4

最糟糕的是,有时您无法修改名称,因为您必须获得多个结果。

参见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

然后你跑ghciimport ABI.Itanium然后import Data.Either你得到:

Prelude ABI.Itanium Data.Either> cxxNameToText $ head (rights [ demangleName "_ZTI13QSystemLocale" ])
"typeinfo for QSystemLocale"

mangleName,但它需要一个DecodedName数据结构而不是字符串,并且该数据结构仅由demangleName(除非我忽略了某些东西)产生。希望这会在未来的某个版本中变得更好。

铿锵代码

我没有尝试clang 代码

于 2014-05-13T12:04:53.473 回答