从demangled名称中获取受损的名称

时间:2012-09-13 05:44:29

标签: c++ g++ name-mangling

有没有办法从g ++中的demangled名称中找回受损的名称。

例如,我有一个解码的名称func(char*, int),我应该怎样做才能得到错误的名称,_Z4funcPci

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

3 个答案:

答案 0 :(得分:40)

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

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

给出输出

_Z2f1Pci

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

答案 1 :(得分:12)

根据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。

答案 2 :(得分:3)

最糟糕的是,有时你 无法 破坏名称,因为你必须获得多个结果。

请参阅https://reverseengineering.stackexchange.com/q/4323/4398(VFT中有多个析构函数,所有这些析构函数都被解析为ClassName::~ClassName())。 (这同样适用于构造函数,我见过C0和C2构造函数。)

另一方面,该答案引用了Itanium ABI:https://refspecs.linuxbase.org/cxxabi-1.75.html#mangling-type,其中指定了修改。

itanium-abi Haskell软件包:它对我不起作用(2014年5月)

有一个Haskell包 http://hackage.haskell.org/package/itanium-abi 这对于消防和破坏都是有希望的,但我只能进行消防:

在Ubuntu上安装精确:

sudo aptitude install ghc
sudo aptitude install cabal-install
cabal update
cabal install itanium-abi

然后您运行ghci并在import ABI.Itaniumimport Data.Either之后运行:

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

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

铿锵代码

我没有尝试the clang code