скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Брутфорс для 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, чтобы типа замедлить генерацию. Занопить ее и все.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook