Обфускация и ее преодоление

         

шпионаж на API функциями несет в себе очень много информации


Большая ошибка большинства обфускаторов в том, что "запутывая" код, они забывают "запутать" структуру данных (ну разве что только зашифровывают их). Это позволяет использовать классические приемы взлома типа "прямой поиск регистрационных данных в памяти". Хакер вводит произвольный регистрационный номер, находит отладчиком его в памяти, ставит точку останова и всплывает в "запутанной" процедуре, а затем смотрит обстоятельства дел. В половине случаев после серии долгих разбирательств запутанная процедура возвращает TRUE/FALSE (и тогда хакер просто правит условный переход), в другой половине — защита генерирует "эталонный" регистрационный номер, легко обнаруживаемый визуальным осмотром дампа памяти (и в этом случае хакер просто вводит подсмотренный номер в программу). Более сложные защитные механизмы встречаются крайне редко, но и тогда зачастую удается сгенерировать валидный номер "руками" самой защиты, если она построена по схеме if (func_generate_reg_num(user_name) == entered_reg_num) all_ok() else fuck_off();
Как нетрудно догадаться, хакер находит процедуру func_generate_reg_num (а находит от ее по срабатываю точки останова на user_name) и "подсматривает" возвращаемый результат. Данная методика совершенно "прозрачна" и пробивает любые навесные упаковщики, лишний раз подтверждая известный тезис, что грамотно защитить программу — это не грибов надербанить!



Содержание раздела