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

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