скрыть

скрыть

  Форум  

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

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



Google  
 

Встраивание своего кода в чужие проги с целью краканья на лету на примере FontLister



Оформил: DeeCo
Автор: http://www.cracklab.narod.ru

Инструменты: 1) Numega Softice fow WIN32
2) HVIEW
3) ProcDump

Как-то попался мне диск "Журнал Хакер" на котором было много шароварных прог. (Что же это за "хакеры" которые издают диски с шароварными программами, львиная доля которых откровенный отстой, ну да ладно...)
На диске была программа FontLister...
Итак, программа триальная, при старте огромный НАГ-скрин с надписью Unregistered User а также в окне о программе записывается дата установки и если дата установки далека от текущей, то... фигня дело вобщем :) Будем кракать...

Запускаем программу при помощи SymbolLoader'a из пакета SoftIce, чтобы оказаться в самом начале программы, мы окажемся здесь:
015F:004D4BF9   MOV       EBP,ESP                       
015F:004D4BFB   ADD       ESP,-0C                       
015F:004D4BFE   MOV       EAX,004D4868
015F:004D4C03   CALL      00406460
015F:004D4C08   MOV       EAX,[004D6778]
015F:004D4C0D   MOV       EAX,[EAX]
015F:004D4C0F   MOV       EDX,004D4CD8
015F:004D4C14   CALL      004502F8
015F:004D4C19   MOV       EAX,[004D6778]
015F:004D4C1E   MOV       EAX,[EAX]
015F:004D4C20   ADD       EAX,38
015F:004D4C23   MOV       EDX,004D4CEC
015F:004D4C28   CALL      00403B58
015F:004D4C2D   XOR       EAX,EAX
015F:004D4C2F   PUSH      EBP
015F:004D4C30   PUSH      004D4CB6
015F:004D4C35   PUSH      DWORD PTR FS:[EAX]
015F:004D4C38   MOV       FS:[EAX],ESP
015F:004D4C3B   CALL      004D474C
015F:004D4C40   TEST      AL,AL
015F:004D4C42   JZ        004D4C78		<-- очень подозрительный условный переход
Попробуем поменять по адресу 015F:004D4C42 команду JZ 004D4C78 на JMP 004D4C78 и с удивлением обнаружим, что наг-окна при старте нет.
Теперь сделаем так, чтобы в меню "о программе" всегда высвечивалась "правильная" дата инсталяции:
Запустим Regedit.exe и посмотрим к каким записям в реестре обращается наша прога и находим очень интересный раздел:
HKEY_CURRENT_USER\Software\ConquerWare\FontLister\Registration\Date
в котором, очевидно, хранится дата инсталляции. А если убить эту запись?
Может прога подумает, что мы тока инстальнулись и запишет туда сегоднящную дату? И правда, после того как я убил этот раздел, он был заново создан прогой, но с текущей датой. (Очень глупо).
Но нам перед каждым запуском килять запись не очень удобно, поэтому тут два варианта:
1) Искать в программе то место, где проверяется наличие ключа Date
2) Встроить в программу маленькую функцию, которая при запуске проги будет килять разедел.
Я выбрал второй вариант, потому как это сложнее и интереснее, а как сказал кто-то "Если это будет просто, то это того не стоит!". Приступми: встраивать будем функцию RegDeleteKeyA, т.к. эта функция предназначена для удаления записей реестра и она содержится в импорте нашей программы :) Посмотрим на параметры, которые надо передавать этой функции:
LONG RegDeleteKeyA(
    HKEY hKey,		// handle of open key 
    LPCTSTR lpSubKey 	// address of name of subkey to delete 
   );
у нас параметры приймут вид:
hKey     = HKEY_CURRENT_USER = 0x80000001
lpSubKey = "Software\ConquerWare\FontLister\Registration",0
Я предлагаю изменить OEP (Точка входа в программу) на начало нашей процедуры:
push	offset	lpSubKey
push	80000001h
call	RegDeleteKeyA
jmp	настоящая_точка_входа
Я нашел свободного места (под свободным местом понимаем кучу 20h) по адресу 004D50BF Заглянув в таблицу импорта, я узнал, что фактическим вызовом
call	RegDeleteKeyA
будет
call	000056DC
Также я узнал, что OEP = 004D4BF9, заменим его при помощи ProcDump или вручную на адрес начала нашей процедуры (004D50BF) и по адресу 004D50BF пишем в HVIEW такую процедуру:
.004D50BE: 90                           nop
.004D50BF: 68D3504D00                   push        0004D50D3 ;" MP+"
.004D50C4: 6801000080                   push        080000001 ;"А  "
.004D50C9: E80E14F3FF                   call        RegDeleteKeyA ;advapi32.dll
.004D50CE: E925FBFFFF                   jmp        .0004D4BF8   -------- (2)
и сразу за процедурой вписываем строку:
"Software\ConquerWare\FontLister\Registration",0
В HVIEW получим следующее:
.004D50D0:  BD 32 00 53-6F 66 74 77-61 72 65 5C-43 6F 6E 71  +2 Software\Conq
.004D50E0:  75 65 72 57-61 72 65 5C-46 6F 6E 74-4C 69 73 74  uerWare\FontList
.004D50F0:  65 72 5C 52-65 67 69 73-74 72 61 74-69 6F 6E 00  er\Registration
Теперь меняем точку входа в программу на 004D50BE (что на единицу меньше, чем адрес нашей процедуры, но так надо! Это тема не этой статьи).
И ... При старте программа сначала выполнила нашу небольшую процедурку, т.е. убила раздел о регистрации и потом передала управление оригинальной программе, которая создала раздел по-новой и записала туда сегоднящнюю дату. Вау! Кульно.
Теперь осталось вместо строки "Unregistered User" вставить что-то типа "cracked_by_vallkor". Делается это просто:
Заходим в HVIEW нажимаем F7 (поиск) ищем строку "Unregistered User" и меняем на что угодно, только в конце новой строки не забывайте ставить нулевой байт.
Крак делайте сами, поскоку слишком много изменений, а QVIEW не плюсюет автоматом ImageBase :) На этом досвиданья.
Исследовал (и получил от этого удовольствие):
vallkor [PTDS]
E-mail : vallkor@chat.ru
Page : vallkor.chat.ru






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




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