четверг, 19 января 2017 г.

Обход шифрования в программах

Часто бывает что строки в программе чем то зашифрованы, обычно это base64 и подобные, однако мне всё чаще попадаются программы где шифрование самодельное (ох уж этот xor) и порой реверсить это дело не хочется! В этой статье я опишу как убрать шифрование и подсовывать программе строки в нормальном виде.

Наш подопытный на сегодня - это бот для одного из тысячи сайтов по обмену лайками, он бесплатный, автор молодец и наверное на этом можно было бы закончить статью если бы не одно но! Бот сливает % лайков разработчику, многие негодуют по этому поводу и пишут мне с просьбой вписать рефку, ну и приходиться вписывать, тем более 500р за 5-10 минут совсем не плохо.




Начнём с поиска зашифрованной строки, далеко ходить не надо - в FormCreate находим:


Минутка криптоанализа: 
Мы имеем строку, из прошлых версий нам известно, что там 2 ссылки на _goo.gl через запятую, значит разделим эту строку на 2 части которые сразу заметно:

dxx|6##kcc"k`#];cfa:
dxx|6##kcc"k`#H;JOI=

По этим данным мы можем сделать вывод, что используется посимвольное нахождение исходного текста путём математических вычислений, и уже имея это на руках легко подобрать алгоритм! Попробуем представить буквы ASCII кодами:

ASCII(d) = 100; надо получить h (104)
ASCII(x) = 120; надо получить t (116)

Как можно заметить - цифры отличаются и в большую и в меньшую сторону, значит тут замешан XOR! Можно подобрать XOR-байт и это будет самое простое решение, но я пойду другим путём...

С шифрованием разобрались, теперь давайте локализуем место расшифровки ссылок, делается это при помощи сниффера и отладчика, т.е. отлаживаем и смотрим на каком этапе отправляется запрос. У меня запрос рефки отправился тут:


Топаем в эту функцию и сразу же бросается в глаза:

А тут вот что:


Судя по всему выделенная на скриншоте выше функция отвечает за расшифровку, проверим так ли это:


А вот и функция, которая как и предполагалось отвечает за расшифровку ссылок! Тут мы можем пойти двумя путями:

1. Глазами отреверсить этот "мэгоалгоритмтрудешифрования"
2. Выпилить его отсюда что бы не огорчал криптоаналитиков.

Я пойду по второму пути и сделаю так, что бы алгоритм расшифровки пропускался:


Так как программа расшифровывает ссылку в туже переменную - мы просто делаем прыжок в конец цикла расшифровки и текст остаётся неизменным, в результате функция вернёт тот же самый текст который приняла.

Ну а дальше пропишем ссылку в программу по адресу 51FE4C и получим:


Проснифаем что получилось - всё работает!

К сожалению статья писалась давно и исследуемой программы у меня не осталось, но надеюсь всё было понятно и вы без труда сможете воспользоваться этим приёмом на другом софте. Как всегда если что то не понятно - задавайте вопросы в комментариях, постараюсь ответить на все.

2 комментария:

  1. Было бы интересно почитать про меры защиты от таких выпиливаний функций из программы.

    ОтветитьУдалить
    Ответы
    1. Просто защита программы должна быть частью программы без которой она работать не будет.

      Удалить