Ненавижу я эти ТЗ, как-то заставили меня (тогда еще программиста фрилансера) и менеджера писать ТЗ на небольшой гос.проект, дали номер заказчика и дедлайн сутки. Худшие 24 часа в моей жизни.
Что касается общей сложности, тут не поспоришь, но никто не говорит что это нужно в ручную анализировать, я лишь показал базовые возможности трассировки.
То есть в памяти в расшифрованном виде вообще ничего нет, любое обращение к данным приводит к расшифровке.
Почему вы так решили? Разве расшифрованные данные и вычесления хранятся в регистровой памяти? Нет, они скорее всего будут находится в промежуточном буфере, который можно предугадать(стек) и трассировать.
Поэтому я и говорю, что восстановить черный ящик на основе входа и выхода можно только в достаточно простых случаях.
Необязательно трассировать только входные параметры, мы можем трассировать стек (локальные буферы), кучу, глобальную память модуля. Т.е. можно предпологать, что в нашем распоряжении может быть доступ к любым данным используемым в закрытом алгоритме и все обращения к ним трассируются.
А вы посмотрите на пример из 0x03, в том эксперементе над кодом была произведена мутация + виртуализация, но трасса обращений к памяти была точно такой же как на не обфусцированном коде. Если мы зашифруем данные, то компилятор всё равно сгенерирует код, который будет скидывать результат в память после выполнения каждого выражения. Мы ведь не можем хранить все необходимые данные только в регистрах. Хотя в случаях когда промежуточные вычисления долго не скидываются в память, восстановить такой код достаточно сложно, но это не в стиле компиляторов.
Понимаете, тут проблема в том, что мы любые вычисления можем отслеживать по обращениям к памяти. Стек, глобальная память, кучи, всё это нам извесно. Ведь если вы будете расшифровывать что-то или генерировать, то как не крути для хранения данных и промежуточных вычислений будет использоватся память. Другое дело если это реализовать на регистровой арифметике, с минимальными обращениями к памяти, такой код очень хорошо будет разбавлен мусором и его ревер будет возможен только деобфускацией. Но компиляторы генерируют код шаблонно, так что такое разве что на ассемблере можно сделать
И спасибо за интересные подкасты
Почему вы так решили? Разве расшифрованные данные и вычесления хранятся в регистровой памяти? Нет, они скорее всего будут находится в промежуточном буфере, который можно предугадать(стек) и трассировать.
Необязательно трассировать только входные параметры, мы можем трассировать стек (локальные буферы), кучу, глобальную память модуля. Т.е. можно предпологать, что в нашем распоряжении может быть доступ к любым данным используемым в закрытом алгоритме и все обращения к ним трассируются.