Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Брутфорс для IP-Tools v1.11

Автор: Hex

Брутфорс уместен везде, где нужен ввод пароля. Почему бы не юзать брутфорс для регистрации? Почему не заставить прогу подбирать серийный номер к самой себе? Никто не запрещал. Вот и заставим IP-Tools 1.11 сгенерить нам номер :)

Для начала найдем где происходит генерация и проверка. Запускаем прогу. Заходим в окно ввода регистрационного номера. Ставим брейкпоинт на hmemcpy. Жмем ок. Мы в айсе. Жмем F12 пока не выберемся на уровень с адресами 4973хх. Теперь идем вниз по коду и посматривая в регистры замечаем:


0049738B 8B45F0 mov eax, dword ptr [ebp-10] - в ЕАХ попадает наш номер.
0049738E E8617DFFFF call 0048F0F4 - проверка на длину и символы, которые юзались 
00497393 663BF8 cmp di, ax
00497396 0F8574010000 jne 00497510 - прыжок к ошибке
0049739C A1B0994B00 mov eax, dword ptr [004B99B0]
004973A1 BAFF010000 mov edx, 000001FF
004973A6 E8957CFFFF call 0048F040
004973AB 8BF8 mov edi, eax
004973AD A1E8984B00 mov eax, dword ptr [004B98E8]
004973B2 BAFF010000 mov edx, 000001FF
004973B7 E8847CFFFF call 0048F040 - проверка самого кода
004973BC 3BF8 cmp edi, eax 
004973BE 0F854C010000 jne 00497510 - прыжок к ошибке 

Итак если ни один из прыжков (00497396 и 004973BE) не выполнится - выводится месага о том, что все зарегено. Так как в ЕАХ по адресу 0049738B загоняется номер из ebp, то можно зациклить прогу заставив ее прыгать сюда загоняя в eax номер для проверки. Как я определил, в коде юзаются тока цифры, причем 0 не юзается. Ну и слава богу. Меньше мороки. Теперь нам остается тока написать небольшую прогу которая будет генерить код который мы будем загонять в EAX перед этой все проверкой :)

Как это сделал я. Я открыл iptools.exe в qview и нашел пустое место (т.е. там тока 00 00 00 ...)

И написал там свою программу. Вот она:


000B2C8E: 60 pushad - сохраняем на всякий случай регистры
000B2C8F: 31C9 xor ecx,ecx - очистили ecx
000B2C91: 8B45F0 mov eax,dword ptr [ebp-10] - прочитали серийный номер
000B2C94: 823839 cmp byte ptr [eax],39 - первая цифра = '9'
000B2C97: 7404 jz 000B2C9D - равно
000B2C99: FE00 inc byte ptr [eax] - увеличили первую цифру на 1
000B2C9B: EB0B jmp 000B2CA8 - вернулись в прогу
000B2C9D: C60031 mov byte ptr [eax],31 - записали в первую цифру 1
000B2CA0: 40 inc eax - переключились на вторую цифру
000B2CA1: 823831 cmp byte ptr [eax],31 - проверили не закончился ли код
000B2CA4: 7C08 jl 000B2CAE - закончился
000B2CA6: EBEC jmp 000B2C94 - повторим проверку для следующей цифры
000B2CA8: 61 popad - вернули регистры на место
000B2CA9: E9DD3AFEFF jmp 0009678B - вернулись в прогу (49738B = 9678B offset)
000B2CAE: C60031 mov byte ptr [eax],31 - если уже конец кода то допишем 1.
000B2CB1: 61 popad - вернули регистры на место 
000B2CB2: E9D43AFEFF jmp 0009678B - вернулись в прогу. 

Ну и еще надо сделать это


000967BE: 0F85CAC40100 jnz 000B2C8E - т.е. если код неверный то увеличиваем на 1.

Итак как этот бред работает. Читаю из стэка номер и читаю его слева направо (еврейские замашки :)) Если первая цифра не 9. То увеличиваю ее на 1 и выхожу в прогу. Если первая цифра 9 то заменяю ее на 1 и проверяю следующую цифру. При проверке следующей цифры проверяю чтобы она не оказалась последней в коде. В памяти это выглядит вот так (мой код 12345):


31 32 33 34 35 00 00 00 00

Так вот я слежу чтобы не попасть на 00 или еще че-нить. Если так 00 то делаем из него 31 (это '1') т.е. увеличиваем длину кода на одну цифру. ну и под конец опять таки выхожу в программу. Генерить код оно будет в таком виде:


11111
21111
...
91111
12111
22111
32111
...
13111 и т.д.

Т.е. в обратном порядке. Нам то ведь пофиг, главное - перебрать все варианты. Я вводил имя 'Hex' и начальный код '1111', помоему, код не может быть короче 4 символов, я уже не помню. И еще два нюанса. Первое:


00497396 0F8574010000 jne 00497510 

тут почему то она выпрыгивает :( занопить эту команду. Второе - прога проверяет контрольную сумму и выводит страшную месагу о том, что файл был поврежден. Bpx на showwindow и потом найдете, что проверка идет по адресу 4B34A7. Правим там джамп и терь запускаем прогу. Терь осталось тока поставить брейкпоинт на 4973C4 чтобы попасть в айс когда генерация закончится. Запускаем вводим 'Hex' и '1111' жмем ок. Прога типа подвисает. И секунд через 40 (это на celeron 366, запущено тока айс и IP-tools) мы в айсе. Теперь d *(ebp-10) и там у нас '96521'. Какая красота. :)

Теперь берем оригинальный exe, запускаем и регимся :) P.S. Это так все хорошо потому, что юзались тока цифры, а если бы в коде были еще и буквы... Есть еще проги в, которых в проверку специально вставляют процедуру KERNEL32!Sleep, чтобы типа замедлить генерацию. Занопить ее и все.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay