Есть ли способ вернуть искомое имя из demangled name в g++.
Например, у меня есть demangled name func(char*, int)
, что я должен сделать, чтобы получить измененное имя i.e _Z4funcPci
назад?
Мой вопрос задан g++.
Есть ли способ вернуть искомое имя из demangled name в g++.
Например, у меня есть demangled name func(char*, int)
, что я должен сделать, чтобы получить измененное имя i.e _Z4funcPci
назад?
Мой вопрос задан g++.
Вы можете просто использовать g++ для компиляции пустой функции с требуемой подписью и извлечь из нее имя. Например:
echo "int f1(char *, int) {} " | g++ -x c++ -S - -o- | grep "^_.*:$" | sed -e 's/:$//'
выводит вывод
_Z2f1Pci
что я думаю, что вам нужно. Убедитесь, что вы включили соответствующие файлы заголовков, поскольку они повлияют на то, как символы искажены.
Основываясь на подходе Бояна Николикса, здесь лучше script:
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.
Что худшее, иногда вы не можете калечить имя, потому что вы должны получить более одного результата.
См. 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 года)
Существует пакет Haskell http://hackage.haskell.org/package/itanium-abi что promises и демарлинг, и манипуляция, но я могу запустить только демонтаж:
Установка на 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.