| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Взлом компонентов Delphi
Описана работа с файлами dcu результатом которой является превращение платных компонентов в бесплатные взлом дельфи delphi компоненты dcu components Павлов А.Ю. Этот документ описывает некоторые аспекты работы с компонентами Дельфи, а именно работу с
Не для кого не секрет что многие хорошие компоненты предоставляющие удобную функциональность часто имеют один общий существенный недостаток - за них надо платить. Обычно это выражается в различных предупреждающих надписях и предложениях покупки. Здесь будут рассмотрены варианты организации подобной защиты и способы ее преодаления. Для работы вам понадобится: отладчик(желательно SoftIce но можно обойтись и без него или хотя бы OllyDebugger - очень хороший отладчик пользовательского уровня), hex - редактор(я использую WinHex - очень мощная программа), минимально понимание winapi и общей работы Windows а также хотя-бы представление о языке программирования ассемблер(не помешает какой-либо асемблер - я лично предпочитаю tasm).
Итак, приступим. Случай первый, симптомы : предупреждающее сообщение при запуске программы в случае
незапущенного IDE. Ясно что компонент при запуске программы проверяет наличие запущенного IDE -
если нет получаем сюрприз. Самый распростроненный способ - проверка наличия в системе окон определенного
класса, которые создает среда разработки. Этот поиск осуществляется функцией FindWindow, смотрим
ее описание в Win SDK:
HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
В случае успеха - хэндл найденного окна иначе 0;
Так что с этим делать? Ответ прост - самое правильное найти этот код в файле dcu используя hex-редактор и немного его поправить. Если используется WinHex - просто забиваем код в шаблон и ищем(кстати call выглядит как E800000000 - нули это адрес который проставит PE-загрузчик при загрузке файла). Заменять инструкцию call нельзя - так как загрузчик пропатчивая адрес вызова снесет все что было вами туда записано - в результатеполучится случайная инструкция обычно приводящая к ошибке памяти. Самое простое решение в данном случае - заменить 2-х байтовую команду test на например 2 однобайтовые команды inc - кто не знает - эта команда увеличивает операнд на 1, вот некоторые опкоды - вы можете сами посмотреть их создав процедуру или программу на ассемблере и посмотрев ее в отладчике: inc eax 40h inc ebx 43h inc esi 46h inc edi 47hКому не лом может посмотреть правила формирования команд процессора. Итак найдя в dcu нужный код меняем инструкцию 84С0 на 4040 в итоге получаем: - теперь компонент думает что ide запущено несмотря ни на что.
Таким образом разобран первый случай, переходим ко второму.
Симптомы: c первого взгляда теже - но сообщение появляется вне зависимотсти от наличия в системе ide.
В чем дело - случайно догадываемся что скорее всего дело в отладчике, т.е. программа проверяет наличие отладчика
- и если его нет - мы имеем плачевный результат. Как это можно определить - смотрим sdk:
The IsDebuggerPresent function indicates whether the calling process is running under the context of a debugger. BOOL IsDebuggerPresent(VOID)Эта функция возвращает 0 если текущий процесс запущен не из под отладчика и не 0 в противном случае. Далее технология подобна описанноы выше. Этот способ представлен в пакете AlphaControls - большой набор очень красивых контролов. Правда разработчики этого пакета поступили хитро напихав проверок в разный молули (защита проявляется последовательно при добавлении новых компонентов в проект и проверки находятся в файлах sStyleSimple.dcu, sCommonData.dcu, sStypePassive.dcu) - тут проявилось очень важное свойство WinHex - поиск в нескольких файлах и поиск с произвольными символами. В общем методика полностью аналогична.
.386
includelib import32.lib
include const32.inc
extern ExitProcess: proc
extern GetStdHandle: proc
extern WriteConsoleA: proc
extern CreateFileA: proc
extern CreateFileMappingA: proc
extern MapViewOfFile: proc
extern CloseHandle: proc
extern UnmapViewOfFile: proc
extern MessageBoxA: proc
extern FormatMessageA: proc
extern GetLastError: proc
extern LocalFree: proc
.model flat
.data
SHandle dd ?
data db '1234343',0Ah,0Dh,0
Result dd ?
w32_f_d _WIN32_FIND_DATAA <0,0,0,0,0,0,0,0,0,0>
old_str db 0C0h,084h
new_str db 040h,040h
m_title db 'title',0
FileHandle dd ?
FileMap dd ?
MemBase dd ?
FileName db 'data.txt',0
my_map_name db 'my_map11',0
buf_str dd ?
Enter db 0Ah,0Dh,00h ;
file1 db 'dlg1.res',0 ;
file2 db 'dll.bat',0 ;
file3 db 'dll.asm',0 ;
file_names dd offset file1, offset file2,offset file3 ; имена файлов которые надо патчить
file_lengths dd 08,07,07 ; длины имен - для вывода на консоль
file_offsets dd 00h,00h,00h ; смещения нужного кода
num dd 2
.code
Start:
WriteC macro Text,len
push 0
push offset Result
push len
push Text
push SHandle
call WriteConsoleA
push 0
push offset Result
push dword ptr 2
push offset Enter
push SHandle
call WriteConsoleA
endm
; получаем консоль
push STD_OUTPUT_HANDLE
call GetStdHandle
mov SHandle,eax
test eax,eax
jz on_error
; начанаем непосредственно крякать :)
start_crack:
mov ecx,num
xor ebx,ebx
push ebx
push FILE_ATTRIBUTE_NORMAL
push OPEN_EXISTING
push ebx
inc ebx
push ebx
xor ebx,ebx
push 80000000h or 40000000h
push dword ptr file_names[ecx*4]
call CreateFileA ; открываем файл
inc eax
test eax,eax
jz on_error ;если ошибка - выходим
dec eax
mov FileHandle,eax
xor ebx,ebx
;------------ создаем карту файла
push offset my_map_name
push ebx
push ebx
push PAGE_READWRITE
push ebx
push eax
call CreateFileMappingA
test eax,eax ;если ошибка - на выход
jz on_error
mov FileMap,eax
xor ebx,ebx
;------------ мэппируем файл в адресное пространство нашего процесса
push ebx
push ebx
push ebx
push 00000002h
push eax
call MapViewOfFile
test eax,eax ;если ошибка - на выход
jz on_error
mov MemBase,eax
mov ecx,num
mov edi,eax
add edi,dword ptr file_offsets[ecx]
mov esi,offset old_str
push edi
cmpsw ; сравниваем байты по смещению с шаблоном
jne on_incorrect_file ; если что-то не то - выходим
pop edi
mov esi,offset new_str
movsw
jmp on_free_resource
on_incorrect_file:
pop edi
on_free_resource: ; освобождаем ресурсы
push MemBase
call UnmapViewOfFile
push FileMap
call CloseHandle
push FileHandle
call CloseHandle
;=== inc
mov ecx,num
WriteC file_names[ecx*4],file_lengths[ecx*4]
dec num
jns start_crack
jmp on_close
on_error: ; сообщение о ошибке через FormatMessage
call GetLastError
push 0
push 100h
push offset buf_str
push 0
push eax
push FORMAT_MESSAGE_FROM_HMODULE
push FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM
call FormatMessageA
test eax,eax
jz on_close
push 0
push offset m_title
push buf_str
push 0
call MessageBoxA
push buf_str
call LocalFree
on_close:
push 00h
call ExitProcess
end Start
Рубрика: Хитрости в Delphi
HTML 5: пять вещей вызывающих особый интер....
HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.
Подробнее... |
Рубрика: Html
| Добавлено: 22.12.2008
asp.net: ListView с разных сторон.
Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Создание кросс-таб отчета в Stimulsoft Rep....
Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.
Подробнее... |
Рубрика: .NET компоненты
| Добавлено: 22.12.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|