首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从损坏的名称中获取损坏的名称

从损坏的名称中获取损坏的名称
EN

Stack Overflow用户
提问于 2012-09-13 13:44:29
回答 3查看 20.5K关注 0票数 50

在g++中,有没有办法从损坏的名称中找回损坏的名称?

例如,我有一个被篡改的名字func(char*, int),我应该怎么做才能找回被篡改的名字,即_Z4funcPci

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-13 20:48:42

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

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

给出输出

代码语言:javascript
复制
_Z2f1Pci

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

票数 41
EN

Stack Overflow用户

发布于 2014-06-09 16:02:33

基于Bojan Nikolic的方法,这里有一个更好的脚本:

mangle.bash:

代码语言:javascript
复制
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/:$//'

使用:

代码语言:javascript
复制
$ ./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两种。

票数 13
EN

Stack Overflow用户

发布于 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上安装:

代码语言:javascript
复制
sudo aptitude install ghc
sudo aptitude install cabal-install
cabal update
cabal install itanium-abi

然后运行ghci,在运行import ABI.Itaniumimport Data.Either之后,您会得到:

代码语言:javascript
复制
Prelude ABI.Itanium Data.Either> cxxNameToText $ head (rights [ demangleName "_ZTI13QSystemLocale" ])
"typeinfo for QSystemLocale"

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

clang code

我没有尝试过the clang code

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12400105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档