Я смог подтвердить (благодаря irc-каналу #toybox), что проблема действительно была ошибкой в toybox sed, которая должна была быть решена, но Android M по-прежнему поставляется с устаревшей версией toybox. Вот ссылки на список рассылки toybox (который, увы, я пропустил), где обсуждались эти проблемы:
http://lists.landley.net/pipermail/toybox-landley.net/2016-January/007897.html
http://lists.landley.net/pipermail/toybox-landley.net/2015-September/004415.html
Жаль, но мне придется ждать актуальную версию toybox с будущим обновлением Android.
Еще лучше, если вы хотите реконструировать опасный двоичный файл Java, а не пытаться перехватывать файлы, декомпилируйте подозрительный .jar
файл.
Для этого можно использовать CFR -другой декомпилятор Java
CFR will decompile modern Java features - up to and including much of Java 9, but is written entirely in Java 6, so will work anywhere
To use, simply run the specific version jar, with the class name(s) you want to decompile (either as a path to a class file, or as a fully qualified classname on your classpath). (--help to list arguments).
Alternately, to decompile an entire jar, simply provide the jar path, and if you want to emit files (which you probably do!) add --outputdir /tmp/putithere
В альтернативах нет недостатка, однако проект CFR, похоже, поддерживается в хорошем состоянии, имея обновление 2018 года.
Заявление об ограничении ответственности :Я не выполнял обратное проектирование двоичных файлов Java/JAR с 2005 г.
Примечание:улучшенное решение опубликовано в дублирующем вопросе
Из прочитанного Как получить доступ к временному файлу сразу после его создания? Мне пришла в голову идея использовать inotify
и создать жесткую -ссылку на сам файл. Это, конечно, состояние гонки, так как файл может быть отключен до создания жесткой ссылки, однако мне удалось восстановить данные во временном файле, который создает приложение. Вот короткий конвейер, собранный на вкладке терминала A, с вкладкой терминала B, выполняющей реальную команду:
inotifywait -m -r /tmp/hsperfdata_xie/ 2>&1 |
while IFS= read -r line; do
awk '$2 == "CREATE"{system("ln /tmp/hsperfdata_xie/"$3" /tmp/BACKUP")}' <<< "$line"
echo "$line" # unnecessary, only if you want to know what's inotify is writing
done
3 недостатка::
awk
для одного конкретного файла; но более общая и гибкая awk
команда, которая анализирует inotifywatch
вывод и объединяет пути $1
с именами файлов в $3
, потребовала бы немного времени, чтобы проанализировать строки, sprintf()
все в переменную и передать к system()
, который может вернуться к предыдущему пункту маркера -к моменту завершения синтаксического анализа, нет файла для ссылки. inotify
модули Python (, что, возможно, я и сделаю в будущем ). Что касается рассматриваемого файла, то он выглядит как некоторая форма двоичных данных с повторяющимися 0...sun.rt._sync_Inflations
и 0...sun.rt._sync_Deflations
строками (, которые могут быть связаны с многопоточностью Java). Но для целей этого вопроса это не имеет значения, -что мы уже имеем. Единственное, что я хотел, это получить сам файл.