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

Автор: Bad_guy
WEB сайт: http://cracklab.narod.ru

FlashGet(JetCar) - это замечательная программа для быстрого скачивания файлов из интернета, вот заходим мы на интерду, находим пара сайтиков, находим логику в нумерации картинок, создаём список... и поехали... ну или на даунлодру заходим.

В общем, программа не выкидывает НАГ окон, но показывает баннер в верху своего окна, и многим это даже совсем не мешает, если вам не мешает - не надо его убирать, ведь авторы именно на этих показах и делают деньги, и пускай делают, мы лишь исследуем программный код с целью выясенения их ленивости.

Был у меня такой FlashGet - 0.86 и был 1.10, я решил посмотреть версию 1.10 и наконец-таки избавиться от, отвлекающего меня, баннера.

Во FlashGetе в окне "Убрать баннер" я ввёл своё замечательное имя, Bad_guy, и 12345 в качестве кода, нажал OK и получил сообщение: "Спасибо за регистрацию!....Перезапустите программу...". Неужели, я угадал код - конечно нет - просто программа у нас "крутая", она проверяет пароль при запуске. Ну что ж, перезапустим под RegMon'ом, что же мы видим: в реестре есть ветка, где живет наш FlashGet по имени JetCar, вот она: HKEY_CURRENT_USER\Software\JetCar\JetCar\, посмотрим в этой ветке раздел General. Этот раздел содержит два преинтересных параметра RegName="Bad_guy" и RegPass="12345", вот почти наш FlashGet и попался, мы теперь знаем, что, в принципе, можно поставить прерывание на функцию RegQueryValueExA? но она плохая функция - её слишком часто вызывают многие программы, боюсь, сложно будет докопаться до истины (FlashGetа). Признаюсь, что я тщетно баловался SoftIce'ом достаточно долго, прежде чем понял, что он мне не поможет целиком "сломать" FlashGet и я решил взять W32Dasm. После того, как программа была раздизассемблирована можно было догадаться, что скоро настоящий регистрационный код для FlashGet мною будет найден, давайте взгляним на этот дизассемблированный код, важные строки я выделил красным цветом:


* Possible StringData Ref from Data Obj ->"RegName"
                                  |
:0041807F 6878B34D00              push 004DB378
:00418084 8D442414                lea eax, dword ptr [esp+14]

* Possible StringData Ref from Data Obj ->"General"
                                  |
:00418088 6848A44D00              push 004DA448
:0041808D 8BF1                    mov esi, ecx
:0041808F 50                      push eax
:00418090 E868C70800              call 004A47FD
:00418095 68D4134E00              push 004E13D4

* Possible StringData Ref from Data Obj ->"RegPass"
                                  |
:0041809A 6870B34D00              push 004DB370
:0041809F 8D4C2410                lea ecx, dword ptr [esp+10]

* Possible StringData Ref from Data Obj ->"General"
                                  |
:004180A3 6848A44D00              push 004DA448
:004180A8 51                      push ecx
:004180A9 8BCE                    mov ecx, esi
:004180AB C744243400000000        mov [esp+34], 00000000
:004180B3 E845C70800              call 004A47FD
:004180B8 8B54240C                mov edx, dword ptr [esp+0C]
:004180BC BB01000000              mov ebx, 00000001
:004180C1 885C2424                mov byte ptr [esp+24], bl
:004180C5 8B42F8                  mov eax, dword ptr [edx-08]
:004180C8 85C0                    test eax, eax
:004180CA 0F84CF000000            je 0041819F
:004180D0 8B442408                mov eax, dword ptr [esp+08]
:004180D4 8B48F8                  mov ecx, dword ptr [eax-08]
:004180D7 85C9                    test ecx, ecx
:004180D9 0F84C0000000            je 0041819F
:004180DF 57                      push edi
:004180E0 53                      push ebx
:004180E1 6A43                    push 00000043
:004180E3 8D4C2420                lea ecx, dword ptr [esp+20]
:004180E7 E84D280700              call 0048A939
:004180EC 8D4C241C                lea ecx, dword ptr [esp+1C]
:004180F0 53                      push ebx
:004180F1 51                      push ecx
:004180F2 8D4C2414                lea ecx, dword ptr [esp+14]
:004180F6 C644243002              mov [esp+30], 02
:004180FB E8F82C0700              call 0048ADF8
:00418100 8B542418                mov edx, dword ptr [esp+18]
:00418104 8B00                    mov eax, dword ptr [eax]
:00418106 52                      push edx
:00418107 50                      push eax
:00418108 E806380600              call 0047B913
:0041810D 83C408                  add esp, 00000008
:00418110 8D4C241C                lea ecx, dword ptr [esp+1C]
:00418114 85C0                    test eax, eax
:00418116 0F94C0                  sete al
:00418119 25FF000000              and eax, 000000FF
:0041811E 8BF8                    mov edi, eax
:00418120 E89E730700              call 0048F4C3
:00418125 8D4C2418                lea ecx, dword ptr [esp+18]
:00418129 885C2428                mov byte ptr [esp+28], bl
:0041812D E891730700              call 0048F4C3
:00418132 8B4C2410                mov ecx, dword ptr [esp+10]
:00418136 57                      push edi
:00418137 8D542418                lea edx, dword ptr [esp+18]
:0041813B 51                      push ecx
:0041813C 52                      push edx
:0041813D 8BCE                    mov ecx, esi
:0041813F E89C000000              call 004181E0
:00418144 8B44240C                mov eax, dword ptr [esp+0C]
:00418148 8B4C2414                mov ecx, dword ptr [esp+14]
:0041814C 50                      push eax
:0041814D 51                      push ecx
:0041814E E8C0370600              call 0047B913
:00418153 83C408                  add esp, 00000008
:00418156 885C2428                mov byte ptr [esp+28], bl
:0041815A 85C0                    test eax, eax
:0041815C 5F                      pop edi
:0041815D 8D4C2410                lea ecx, dword ptr [esp+10]
:00418161 7537                    jne 0041819A
:00418163 E85B730700              call 0048F4C3
:00418168 8D4C2408                lea ecx, dword ptr [esp+08]
:0041816C C644242400              mov [esp+24], 00
:00418171 E84D730700              call 0048F4C3
:00418176 8D4C240C                lea ecx, dword ptr [esp+0C]
:0041817A C7442424FFFFFFFF        mov [esp+24], FFFFFFFF
:00418182 E83C730700              call 0048F4C3
:00418187 8BC3                    mov eax, ebx
:00418189 5E                      pop esi
:0041818A 5B                      pop ebx
:0041818B 8B4C2414                mov ecx, dword ptr [esp+14]
:0041818F 64890D00000000          mov dword ptr fs:[00000000], ecx
:00418196 83C420                  add esp, 00000020
:00418199 C3                      ret

Как можно увидеть из листинга, я искал имена параметров, под которыми в реестре сохранены наши регистрационные данные. Каждый из них встречается в листинге дважды, первый раз я увидел рядом строку "Спасибо за регистрацию...", в общем это то место, где мы вводили наши данные, а вот второй случай более интересен, беру этот адрес (ну, например, 0041807F) и ставлю в SoftIce прерывание на него, если не знаете, как это сделать - подскажу - (перед тем, как запускать FlashGet поставьте в SoftICE прерывание bpx hmemcpy и запустите FlashGet, сразу же прервётесь, жмите F12, пока не окажетесь в модуле по имени FlashGet, а дальше спокойно ставьте прерывания на любые адреса, полученные для этой программы в W32Dasme - этот метод "добраться до программы" хорош для любых программ, а не только FlashGet). Вот мы уже прервавлись по адресу 0041807F, смотрим по моей методике бегло все "прыги" и значения в регистрах и вот мы добрались до 00418144, давайте ещё раз поглядим на этот код:


:00418144 8B44240C                mov eax, dword ptr [esp+0C]
:00418148 8B4C2414                mov ecx, dword ptr [esp+14]
:0041814C 50                      push eax
:0041814D 51                      push ecx
:0041814E E8C0370600              call 0047B913
:00418153 83C408                  add esp, 00000008
:00418156 885C2428                mov byte ptr [esp+28], bl
:0041815A 85C0                    test eax, eax
:0041815C 5F                      pop edi
:0041815D 8D4C2410                lea ecx, dword ptr [esp+10]
:00418161 7537                    jne 0041819A

Если даже не будем смотреть значения в регистрах, всё равно увидим, что jne 0041819A отправляет нас за ближайший RET, а это подозрительно, теперь поглядим значения в регистрах перед CALLом, наберём:
:deax - там '12345'
:decx - там '37949NE1L6' - правильный рег. номер

Проверим, введя эти данные в FlashGet и получим, что мы правы и что:

Регистрационный ключ для FlashGet(JetCar) Version 1.10

Name: Bad_guy
Serial: 37949NE1L6

А вот памятка, которую я по-быстрому набросал специально для себя с целью будущего исследования новых версий FlashGet:

Вводим любые рег. данные, ищем их в реестре: HKEY_CURRENT_USER\Software\JetCar\JetCar\General, название параметров (RegName, RegPass) ищем в W32Dasm дизассемблерном листинге, ставим в SoftIce прерывание на второй из двух найденных адресов, смотрим в SoftIce, перед RET есть JZ. Перед входом в CALL, меняющий флаг, есть PUSH eax, PUSH ecx - в EAX неправильный номер, в ECX - правильный. (адрес для версии 1.10 был 41814D).

Удачи вам в вашей деятельности, чем бы вы ни занимались, Bad_guy.

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