Подтвердить что ты не робот

Получение измененного имени из измененного имени

Есть ли способ вернуть искомое имя из demangled name в g++.

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

Мой вопрос задан g++.

4b9b3361

Ответ 1

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

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

выводит вывод

_Z2f1Pci

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

Ответ 2

Основываясь на подходе Бояна Николикса, здесь лучше 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.

Ответ 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, где указано 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.