neCARROTkiy
Участник
Это было не так давно, сидим как-то мы (кремлевкие хэкиры) обсуждает как мы в очередной раз нагнули загнивающий запад и тут мне приходит сообщение. Открываю, читаю, это был один мой добрый знакомый, пишет мол еть один дерзкий пиздюк, нужно немного опустить его на землю. Есть его стилер, но строки там пошифрованны, там все просто, только нужно автоматизировать расшифровку, ты же такое любишь - пишет он мне. Ну я думаю, а почему бы и нет.
При первом беглом анализе все было очень просто. Сел я писать скрипт, и уже после первых тестовых зарусков понял, что задача не такая уж и простая. Проблема была не в мастерстве этого говнокодера, а в моще современных компиляторов, которые научились выживать максимум с оптимизации кода.
Сам принцип раскриптовки строк прост, на стеке формируется строка, первый байт которой это ключ для ксора, а дальше сама строка, пример такого куска кода:
Если же строка приближается к длине около 16 и более, то в игру вступают SSE инструкции
Также проблемой стало, то что порядок инициализации зашифрованной строки может быть не последовательный (ох уж эти компиляторы). Также было неприятно иметь дело с тем что строка инициализовалась не константным значением, а значением с регистра, а значение этого регистра устанавливалось с другого, а то в свою очередь могло установится со значения на стеке инструкцией pop, тогда нужно найти когда же его туда положили. Как-то так:
А еще проблемы со стеком, что когда пушили и попили значения, то адреса у переменных смещались, нужно было еще это обрабатывать, т.к. с этим сначала была проблема. Когда еще не было выяснено, как оно блять работает, вот строка должна начинатся по такому смещению, на стеки, а инициализация начинается только со смещения на 4 байта больше, как блять инициализируются первые 4 байта. При этом декомпилятор расчехлялся в этой ситуации и показывал что инициализация идет правильно, а вот ассемблерный листинг говорил что нихуя ребятки не так. Был устроен мозговой штурм под заголовком - "Как так-то, блять?!" и спустя 5 минут была найдена причина.
В итоге имея все эти данные было принято решние написать скрипт для IDA, но т.к. выхлом иды по ассемблерным командам не давал много информации, то было решено прикрутитиь для этого capstone.
И вот на выходе мы получаем список декриптованных строк с их раставлением по месту декриптовки
PS
Сам код стилера ужасен, от его монолитности и принципов работы хотелось плакать. Разбор самого стилера ждите в ближайшее время, не от меня, мне было интересно только автоматизация раскриптовки строк. Хорошо что мне потом подогнали семпл "правительского" трояна под макос, вот там я получил эстетическое наслаждение от качества написания кода. Всем добра и позитива! )
При первом беглом анализе все было очень просто. Сел я писать скрипт, и уже после первых тестовых зарусков понял, что задача не такая уж и простая. Проблема была не в мастерстве этого говнокодера, а в моще современных компиляторов, которые научились выживать максимум с оптимизации кода.
Сам принцип раскриптовки строк прост, на стеке формируется строка, первый байт которой это ключ для ксора, а дальше сама строка, пример такого куска кода:
Если же строка приближается к длине около 16 и более, то в игру вступают SSE инструкции
Также проблемой стало, то что порядок инициализации зашифрованной строки может быть не последовательный (ох уж эти компиляторы). Также было неприятно иметь дело с тем что строка инициализовалась не константным значением, а значением с регистра, а значение этого регистра устанавливалось с другого, а то в свою очередь могло установится со значения на стеке инструкцией pop, тогда нужно найти когда же его туда положили. Как-то так:
А еще проблемы со стеком, что когда пушили и попили значения, то адреса у переменных смещались, нужно было еще это обрабатывать, т.к. с этим сначала была проблема. Когда еще не было выяснено, как оно блять работает, вот строка должна начинатся по такому смещению, на стеки, а инициализация начинается только со смещения на 4 байта больше, как блять инициализируются первые 4 байта. При этом декомпилятор расчехлялся в этой ситуации и показывал что инициализация идет правильно, а вот ассемблерный листинг говорил что нихуя ребятки не так. Был устроен мозговой штурм под заголовком - "Как так-то, блять?!" и спустя 5 минут была найдена причина.
В итоге имея все эти данные было принято решние написать скрипт для IDA, но т.к. выхлом иды по ассемблерным командам не давал много информации, то было решено прикрутитиь для этого capstone.
И вот на выходе мы получаем список декриптованных строк с их раставлением по месту декриптовки
PS
Сам код стилера ужасен, от его монолитности и принципов работы хотелось плакать. Разбор самого стилера ждите в ближайшее время, не от меня, мне было интересно только автоматизация раскриптовки строк. Хорошо что мне потом подогнали семпл "правительского" трояна под макос, вот там я получил эстетическое наслаждение от качества написания кода. Всем добра и позитива! )