Крэк на FlashGet — легко

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: 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.

{/codecitation}

Добавить комментарий