Получение искаженного имени из раскрученного имени

Есть ли способ вернуть искаженное имя из освобожденного имени в g ++.

Например, у меня есть расколотое имя func(char*, int)Что я должен сделать, чтобы получить искаженное имя, т.е. _Z4funcPci назад?

Мой вопрос специфичен для g ++.

44

Решение

Вы можете просто использовать g ++ для компиляции пустой функции с требуемой подписью и извлечения имени из нее. Например:

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

дает вывод

_Z2f1Pci

что я думаю, что вам нужно. Убедитесь, что вы включили все соответствующие заголовочные файлы, так как они будут влиять на то, как символы будут искажены.

40

Другие решения

Основываясь на подходе Бояна Николича, вот лучший сценарий:

mangle.bash:

IFS='::' read -a array <<< "$1"
indexes=("${!array[@]}")

prefix=""middle=""suffix=""rettype=""if [ -z "$2" ]; then
rettype="void"fifor 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.

12

Что хуже, иногда ты не могу искажать имя, потому что вы должны получить более одного результата.

Увидеть 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)

Есть пакет на 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 (если я что-то упустил). Надеюсь, это будет лучше в будущем выпуске.

Код лязг

Я не пробовала код лязг.

3
По вопросам рекламы [email protected]