Крэк на 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.
|