Привет! я KEZ!
Сейчас я покажу самые основы ревёрсинга. Я использую OllyDBG а не SoftICE
по понятным причинам. И она мне больше нравится чем SoftICE.
На примере простейших CrackMe. Первая - CRACKME2.EXE.
Ввожу серийник, выводится инфа о левом серийнике. Предположи это MessageBoxA.
Найдем все вызовы этой ф-ии API.
Поставим брек поинт на все вызовы MessageBoxA. Их два - один это окно "About"
и один для вывода "все ок" или "левый серийник" =) Программа остановилась по адресу
0040119D где вызов MessageBoxA. Смотрю что перед ним. В стек заносятся наше имя
и серийник и вызывается 00401261 - видимо алгоритм проверки.
Дальше EAX проверяется на 0. Если EAX = 0 то идет JE 0040118D, что заносит
в EBX адрес строки "Nope, but keep trying :)" а если EAX не равно 0, то
JE не выполняется, идет команда 00401186 которая заносит в EBX адрес строки
"Great work!", и сразу на вызов MessageBoxA.
Попробую изменить флаг z (флаг нуля) перед вызывом JE (00401184)
Программа остановилась на нем. Меняю z flag.
Это самый грубый и простой способ.
Попробую изменить JE SHORT 0040118D на JNE SHORT 0040118D чтоб переход был
наоборот, в том случае если EAX=1 т.е. серийник верный. Брекпоинт можно убрать.
Вот. Посмотрим процедуру проверки. Вот она. до 004012A6 (до RETN)
Нахождение серийника расписывать не буду, слишком много.
И так,
по адресу 0040129B лежит JMP 004012A1 вызвав который мы передем на 004012A1
где MOV EAX,1 тоесть серийник ок. Еслиже мы начнем с 0040129D т.е. с XOR EAX,EAX
(обнуление EAX) то после этого передем на 0040129F а с него на выход.
И так, давайте просто заменим XOR EAX,EAX на MOV EAX,1 (и несколько NOP'ов для
сохнанения размера, их допишет OllyDBG)
А старый патч уберу
Теперь можно сделать патч например на VC++ 6.0SE
Вернем как было
Вот и все для видео 1. Смотрите 2.
Спасибо! =)
http://forum.antichat.ru