Я пишу скрипт для деобфускации кода PHP. И в основном это сделано, осталось только декодировать строки в коде. Так что мой входной файл может быть что-то вроде:
<?php
$myString="\x48\x45\x4c\x4c\x4f";
$myOtherString="\x57\x4F\x52\x4C\x44";
?>
Теперь в моем скрипте у меня есть цикл над всеми строками, чтобы заменить их одну за другой. Поэтому у меня есть (как часть цикла) следующий код ($ S объявляется как скрытая строка внутри цикла — на случай, если вам интересно, откуда взялся $ S):
$S='"\x48\x45\x4c\x4c\x4f"'
REALSTRING=`php -r 'eval("echo ".$argv[1].";");' $S`
ESCAPEDREALSTRING=`printf "%q" "$REALSTRING"`
ESCAPEDSOURCE=`printf "%q" "$S"`
CODE4=`echo $CODE4 | sed "s/$ESCAPEDSOURCE/$ESCAPEDREALSTRING/g"`
Я искал в Интернете решение, и шаг printf был рекомендован для правильного экранирования строки. Некоторые строки в реальном тексте — даже RegExes, поэтому, возможно, Sed не подходит для этой работы. У кого-нибудь есть идея?
Эта попытка использует sed, но perl, awk или любой другой инструмент также подходит, если он доступен в Bash по умолчанию в стандартной системе Linux / MacOS.
В качестве примера пара:
"\x5c\50\x22\133\x30\55\x39\101\x2d\132\x61\55\x7a\134\x2b\57\x3d\135\x2a\42\x5c\51"
следует преобразовать в
"\("[0-9A-Za-z\+/=]*"\)"
Это одна из возможных встреч RegEx, которую я упомянул.
С наилучшими пожеланиями
Мерлин
Задача ещё не решена.
Других решений пока нет …