在g++中,有没有办法从损坏的名称中找回损坏的名称?
例如,我有一个被篡改的名字func(char*, int),我应该怎么做才能找回被篡改的名字,即_Z4funcPci?
我的问题是特定于g++的。
发布于 2012-09-13 20:48:42
您可以简单地使用g++编译一个具有所需签名的空函数,并从中提取名称。例如:
echo "int f1(char *, int) {} " | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//'给出输出
_Z2f1Pci我想这就是你所需要的。确保包含任何相关的头文件,因为它们会影响符号的损坏方式。
发布于 2014-06-09 16:02:33
基于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-05-13 20:04:53
最糟糕的是,有时你不能一个名字,因为你必须得到不止一个结果。
参见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包: it not work for me (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 code
我没有尝试过the clang code。
https://stackoverflow.com/questions/12400105
复制相似问题