Шаг 5 - правка ассемблерных команд в экзешнике
В той дельфийской проге мы хотели заменить в начале процедуры 1 байт всего. И, таким образом, сделать так, чтобы при нажатии на строку со ссылкой
http://blackstrip.ru ничего не происходило и internetexplorer бы не запускался.
Воспользуемся прогой QVIEW. Версия проги 2.69.03, сделана была аж 26 июня 1998 года =) недавно ей 10 лет исполнилось, летом.
Очень удобная прога. Вот она в архиве 150 Кбайт всего
http://blackstrip.ru/toolz/qview.rar , причем была сделана русскими, поэтому там документация на русском. Вот ее страница в инете
http://enlight.ru/qview/main.htm даже работает еще) там кстати еще 2.80 версия есть поновей. Ну и 2.69 пойдет норм.
Лирическое отступление - БЫСТРОЕ открывание файлов. Как?
Итак, все проги, которыми вы хотите чото открывать - обычно умеют открывать файлы из командной строки. Винда умеет быстро кормить их этими файлами. Попробуйте тыкните на любом файле правой кнопкой мыши - откроется меню, в нем будет пункт "Отправить" - и в нем всякий бред типа флешдисков, дискет и т.п. Вот туда же можно напихать ярлыков прог =) лезьте на ваш диск, где виндоус стоит, там папка
в корне диска Documents and Setting, в ней папки с названиями ваших сеансов, найдите ваш сеанс (у мя эта папка Blackstrip). В ней внутри есть СКРЫТАЯ папка SendTo. Вот туда сразу пихайте такие ярлыки как "Блокнот", "QVIEW" и даже можно от DeDE ярлык. Теперь любой файл, экзешник или текст - сразу мона открыть "отправив" ее по правой кнопке мыши в нужную вам прогу. Ибо все вставленные в SendTo ярлыки появятся в меню "Отправить" в виде пунктов.
Лирическое отступление закончилось. Теперь о том как править наш InetWatch.exe
Наверняка тот InetWatch который вы скачаете на blackstrip.ru распаковать вам не удастся (ибо он запакован намертво upx-ом). Поэтому вот вам для эксперимента - незапакованный InetWatch
http://blackstrip.ru/toolz/iw.exe 600 Кбайт качайте его, ща бум "ломать" процедуру вызывания blackstrip.ru по клику на ссылку в окне.
Итак - смотрим еще раз на эту картину в дельфи
Берем бумажку и списываем коды, которые слева от ассемблерных команд.
Они в файле прям по очереди идут. У нас получается прям с начала процедуры:
6A 01 6A 00 6A 00 68 AC 28 47 00 6A 00
Надо найти эту последовательность и поправить первый байт на С3.
Отправляем наш iw.exe в QVIEW (теперь уже по правой кнопке и Отправить, если вы прочитали лирическое отступление и сделали ярлыки быстрого доступа в папке SendTo). Открывается вот такое досовское окно. Мона на весь экран его натянуть через Alt+Enter (но на некоторых виндах это может немного подвешивать комп, особенно при выходе из проги этой). Но и в окне норм видно вроде.
Слева это 16-тиричные коды байт, справа собственно символы, обозначающие эти байты.
Жмем F7 - это, как видно из строки внизу экрана Search - то есть поиск. Откроется вот такое окно. Тыкаем в поле HEX и вводим нашу 16-тиричную последовательность байт 6A 01 6A 00 6A 00 68 AC 28 47 00 6A 00. И жмем Enter.
Кувья находит нам эту последовательность и выделяет ее.
Жмем теперь Shift+F7 - это как видно будет при нажатии Shiftа "NextSr" - то есть искать далее =) Зачем? А за тем чтоб убедиться что такая последовательность только одна. Можно ведь было взять не такую длинную 6A 01 6A 00 6A 00 68 AC 28 47 00 6A 00, а от нее кусок 6A 01 6A 00 например. И тогда увидите что таких коротких последовательностей - в файле море. Поэтому ВСЕГДА берите последовательность подлиннее, и чтоб в нее входили не только дубовые везде встречающиеся push pop ret, а желательно что нибудь уникальное например ссылку на вызов конкретной процедуры или ссылку на переменную (как здесь я взял ссылку на строку '
http://blackstrip.ru ').
Итак, видим при "поиске далее" что таких последовательностей больше нет.
Теперь надо убедиться что мы нашли то что искали (а то бывает в поиске опечатаешься, и найдешь не ту цепочку не в том месте проги). Жмем F4 - это переключение режима просмотра. Есть 3 режима - режим 16ричного просмотра, режим дизассемблера, и режим текстового просмотра. Из одного в другой - последовательным нажатием F4 можно переходить. Итак, по нажатию F4 видим дизассемблированный код (прям как в дельфе).
Но как видите если первые три push еще нормальные, то потом какая то короткая команда. А это потому что 16-битный дизассемблер включен - внизу строчка команд, и около F2 видите 16 горит черным, а 32 серое выключенное. Чтоб переключить на 32 битный - жмем F2. Сразу команды станут нормальными, а внизу около F2 загорится 32.
Терь точно видим - ага это то что нам надо. Переходим к правке байтов. Жмем 2 раза F4. Первый раз - переход в текстовый режим, второй раз - в 16тиричный просмотр. Чтоб править байты - надо включить командой Alt+F3 режим правки. Вот на скрине удерживаю Alt - и нажал F3 и внизу около F3 написано "Edit ON" - значит режим правки включен. Если нажать второй раз F3, при этом продолжая держать Alt - то будет Edit OFF и т.д.
Кроме того, после того как включилось Edit ON - в выделенном байте замигал курсор. Можно править
Вписываем в наш первый байт код С3. Измененный байт станет зеленым, а курсор перескочит на следующий.
Теперь жмем Alt+F9 (удерживая Alt можно прочитать что это команда UpdateAll - она сохраняет измененный файл обратно на диск). Всё, байт обратно стал серым, но остался с кодом С3. Файл сохранен. Причем Qview интересно сохраняет файлы - дата изменения в свойствах файла останется прежней, то есть вы можете править файлы старых дат, и они останутся со старыми датами, никто по дате не узнает что файл поправили =)
Теперь можете нажать ESC. Qview закроется. И запустить поправленный iw.exe - при нажатии на ссылку
http://blackstrip.ru в правом верхнем углу проги ничего не будет происходить. А вот при нажатии на эмблему с рысью - будет (т.к. для нее отдельная процедура вызова страницы, чуть пониже той которую мы правили).
Вот так в 16-ричном редакторе можно править нужные байты. И так можно ломать дельфийские проги.
В некоторых случаях в проге бывает проверка кода - и после нее, например, переход условный "если успешно" то туда, а "если неуспешно" то сюда. Тогда там команды ассемблера jz, jnz, je и прочие. Ну эт кто ассемблер знает - тот поймет на что их надо править =)
например было "прыгай туда если 0" - эту команду можно переправить на jnz в том же Qview в режиме дизассемблера: кнопкой Tab перейти на столбец команд и прям поправить jz на jnz, оно само после нажатия Enter обратно сассемблируется и проставит нужные байты в 16-ричном виде, останется только Alt+F9 нажать чтоб сохранить.
Также можно ненужные условные переходы забивать на корню командой NOP (нет операции) - это команда-пустышка. Любой код можно забить этими байтами - и процессор при выполнении просто проскочит их. Для примера, можно было не С3 тянуть вверх, а всю процедуру:
6A 01 6A 00 6A 00 68 AC 28 47 00 6A 00 A1 0C 4A 47 00 8B 00 8B 40 30 50 E8 9F 55 FB FF C3
превратить в пустышку с командой ret в конце
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 C3
и был бы эффект такой же =)
но сильно увлекаться убиванием команд не надо. в процедурах например все push которые были - должны уравновеситься pop-ами. И если забить много pushей или наоборот pop-ов - то при многократном вызывании этой процедуры произойдет или переполнение стека (много pusheй, мало popов), или наоборот.
Вот так вот править можно проги.
А теперь о том, как декомпилировать и вообще ломать проги, написанные на Си и Ассемблере.