|
Данный способ называется (вернее я его так называю) JZ(JNZ) correction. Суть этого метода в том, что обычно бывает достаточно исправить некоторое условие и программа пойдет по пути противоположной ветки. Например, имеем диалог ввода серийного номера, и несколько кнопок на нем, одна из них OK. При нажатии на кнопку ОК выполняется проверка "очень крутым и сильно замороченным" алгоритмом, разбираться в котором нет ни времени, ни желания. На asm-е это может выглядеть так:
Приношу извинения за простоту примера, безусловно бывают и другие типы проверок (отличные от TEST), но ключевой командой здесь является JZ. Так вот если поменять код JZ (74h) на код JNZ(75h) (кстати во многих кряках ты наверное видел эти числа очень часто), то программа вместо сообщения об ошибке выполнит код по регистрации программы. Одним словом, если до взлома программа умела обрабатывать 1 серийный номер из N (близкого к бесконечности) возможных вариантов, то после него она уже воспринимает в качестве правильных N-1 чисел. Цель, как мне кажется, достигнута. Конечно же, не все программы именно таким образом работают. Мало того не во всех используется принцип ввода серийных номеров. Но по моему личному мнению, почти любой тип битового (!) взлома может быть сведен к JZ correction Нельзя не отметить что основной проблемой данного метода является нахождение того самого JZ-кода. Возможно конечно просто перебором :), но я бы рекомендовал отладчик или что-то другое. Но об это не здесь (см. раздел Средства). Этот метод является одним из моих самых любимых. Мне импонирует в нем именно тот факт что одним байтом можно убить работу нескольких человеко-месяцев не самых глупых программистов (в чем-то даже умней меня). И что смешно, что даже битовое изменение минимально (байт 74 и 75 отличаются на 1, а это минимум). Т.е. скажем при взломе 10Мб-ой проги, отношение "измененный код"/"исходный код" минимально. Ты скажешь, какая разница чему равно это отношение, важно что программа сломана. Представь себе что для того чтобы взломать программу тебе бы пришлось исправить 50% кода. Проблема не только в том чтобы найти этот код (а это не просто, хотя бывает найти один байт сложнее чем пакет байтов), а в том , как мне кажется, это уже не взлом, а "переписывание" программы :) Существует множество вариаций на тему J(N)Z. Знающие люди понимают что команд условных переходов в х86-ом процессоре - не только один JZ. Есть еще и JE, JB и пр. Но все они очень похожи. При применении этого метода иногда приходится использовать NOP (90h), а это уже не так красиво, но иногда очень сложно взломать программу ЧИСТЫМ JZ. Я так взломал HellFire. |
|