Встраивание своего кода в чужие проги с целью краканья на лету на примере 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
|