Реферат: Арифметика на службе защиты

Попалась мне тут как-то одна программа, которая требовала, как это обычно бывает в таких случаях, пароля:

Дело было на выходных, а потому настроения плотно в чем-либо рыться не было. Казалось бы, удобный случай размять пальцы в течении нескольких часов, тем более, что я всегда любил проги с текстовым режимом (как еще говорят, "досовские", хотя от доса зачастую в них ничего нет).

Запускаю td + программа... Сейчас только найти буфер, и все. Перехватить int 16 и клавишные ф-ции int 21 из td как-то сразу не получилось, потому выхожу из td и запускаю маленького резидента, схватившего эти вектора.

Хоккей. На досе резидент ничего не сказал (или я не все ф-ции ему указал), а вот по int 16 все адреса перечислил. Захожу опять в td, уже с бумажкой с этими адресами, ставлю break, но что-то мне сразу вот это не понравилось:

int 16h

jmp far ...

Через несколько секунд я понимаю, что прога работает в pm. С td особенно с pm не поработаешь. Что делать? По-честному, не хотелось воевать с прогой, которую кто-то, особенно не задумываясь, слинковал с эктсендером на чем-нибудь типа clarion'а, да и время жаль. Что ж, придется как всегда.

В softice все стало значительно проще. Написал в поле "Пароль" экзотику типа ABC123 и дал команду поиска в памяти:

s 0030:0000 L FFFFFFFF 'ABC123' ; У меня win 98

Нашлось все, только вот уже тогда для меня было тревожным рингом то, что совсем не один раз... Ладно, ставлю на найденных ребят bpm, ловлю программу на проверке пароля:

:1710:

mov bx,ds

les di,[...] ; Адрес введенного пароля -> ABC123

lds si,[...] ; Адрес эталонного пароля

repz cmpsb

Да, вот и все. В отладчике найти пароль оказалось довольно просто. Однако я уже истратил около 1,5 часа (резидент готовил) и захотелось большего, захотелось сделать "напоминатель" пароля.

Сначала я опытным путем установил, что пароль зависит от введенного INN и кода (на рисунке выше он равен 072163), более ничего на него не влияет. Несколько вариантов полученных "паролей" подтвердили мою мысль, что пароль всегда включает в себя только цифры. Вообще, пароли должны быть только из цифр. Так проще программисту. Так проще... неважно. В общем, передо мной лежало нечто довольно приятное ... что-то вроде crack me.

Итак, приступим. Стандартные шаги: вбиваю INN, ищу в памяти, собираюсь ставить на найденный буфер bpm и следить за процессом. Но что это? Этих буферов много. Их очень много! Если шарить в памяти после прохождения поля "Пароль", то их не менее 28! (Вы уж извините, что не смог до конца досчитать). В одних лишь байтах softice'а где-то в старших адресах C0XX, где обитают vxd-модуля, их гордое число - один!

Контрольных точек только четыре. Ладно, все же попробуем... Ставлю на первые четыре найденных буфера. Понеслись! Эх... Вижу, как программа копирует один в другой, другой в третий ... Да еще, зараза, норовит их в стеке разместить, поэтому после каждого освобождения под другие нужды возникают холостые брейки. Особенно обидно их видеть после команд типа push или call.

Нет, это не выход. Это слишком трудоемкий путь. Может быть, пароль? Нет, пароль - это хорошо. Но он используется только для сравнения. Как насчет значения из поля "Код"? Проделываю все те же шаги, что и при поиске обращений к ИНН. Все то же самое - куча пересылок.

Обратный реверсинг? Найти буфер с образованным паролем, и следить, как его получают? Делаю опять поиск по памяти, но уже с правильным кодом. Есть! Но опять - много.

Но тут мне немного повезло. Ввел я ИНН=1234567894, чтобы было легче искать. Отслеживая буфера, содержащие верный код, нахожу вот такой:

59497190000000000000..0 ; 16-ть цифр, для ИНН=1234567894 и кода 855907

Похоже на отформатированное большое число. Пароль тоже состоит из чисел. "Истина где-то рядом" (c) Фокс Малдер. Целенаправленно уже ищу того, кто их сделал и нахожу вот такую подпрограмму:

:6D32:

push es

mov ax,ds

...

--> ЧИТАТЬ ПОЛНОСТЬЮ <--

К-во Просмотров: 1891
Бесплатно скачать Реферат: Арифметика на службе защиты