有没有办法从g ++中的demangled名称中找回受损的名称。
例如,我有一个解码的名称func(char*, int)
,我应该怎样做才能得到错误的名称,_Z4funcPci
?
我的问题是g ++特定的。
答案 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.Itanium
和import Data.Either
之后运行:
Prelude ABI.Itanium Data.Either> cxxNameToText $ head (rights [ demangleName "_ZTI13QSystemLocale" ])
"typeinfo for QSystemLocale"
有mangleName
,但它需要DecodedName
这是一个数据结构而不是字符串,并且该数据结构仅由demangleName
生成(除非我忽略了某些内容)。希望在未来的某个版本中,这会更好。
铿锵代码
我没有尝试the clang code。