Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  125

•  TDictionary Custom Sort  3 312

•  Fast Watermark Sources  3 062

•  3D Designer  4 818

•  Sik Screen Capture  3 314

•  Patch Maker  3 528

•  Айболит (remote control)  3 628

•  ListBox Drag & Drop  2 992

•  Доска для игры Реверси  81 537

•  Графические эффекты  3 922

•  Рисование по маске  3 227

•  Перетаскивание изображений  2 608

•  Canvas Drawing  2 732

•  Рисование Луны  2 556

•  Поворот изображения  2 163

•  Рисование стержней  2 160

•  Paint on Shape  1 564

•  Генератор кроссвордов  2 223

•  Головоломка Paletto  1 764

•  Теорема Монжа об окружностях  2 209

•  Пазл Numbrix  1 682

•  Заборы и коммивояжеры  2 052

•  Игра HIP  1 278

•  Игра Go (Го)  1 224

•  Симулятор лифта  1 470

•  Программа укладки плитки  1 214

•  Генератор лабиринта  1 542

•  Проверка числового ввода  1 351

•  HEX View  1 488

•  Физический маятник  1 355

 
скрыть


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

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



Delphi Sources

Исследуем демку GameAdmin 2.2.2002



Автор: Hex

Веселая прога "типа" демка. Явный пример того как не надо делать процедуру регистрации. Ограничение - управление только 3-мя компами. Маловато...

Инструменты: Filemon, windasm.

Запускаем filemon и видим что прога ищет какой-то key.dll

Радует то, что написана на делфи без всяких протекторов, которые продлили бы исследование минут эдак 20. Загружаем Gameadmin.exe в Windasm и смотрим в String References "key.dll" делаем двойной клик и видим вот такое чудо:


:0049F16A 8BC0 mov eax, eax
:0049F16C 832D28BE4C0001 sub dword ptr [004CBE28], 00000001
:0049F173 0F839F000000 jnb 0049F218
:0049F179 C70518BE4C00E0F04900 mov dword ptr [004CBE18], 0049F0E0
:0049F183 C7051CBE4C0000F14900 mov dword ptr [004CBE1C], 0049F100
:0049F18D C70520BE4C0020F14900 mov dword ptr [004CBE20], 0049F120
:0049F197 C70524BE4C0034F14900 mov dword ptr [004CBE24], 0049F134

* Possible StringData Ref from Code Obj ->"key.dll"

:0049F1A1 681CF24900 push 0049F21C

* Reference To: kernel32.LoadLibraryA, Ord:0000h

:0049F1A6 E8ED7BF6FF Call 00406D98
:0049F1AB A32CBE4C00 mov dword ptr [004CBE2C], eax
:0049F1B0 833D2CBE4C0000 cmp dword ptr [004CBE2C], 00000000
:0049F1B7 7454 je 0049F20D

* Possible StringData Ref from Code Obj ->"GetRegistrationName"

:0049F1B9 6824F24900 push 0049F224
:0049F1BE A12CBE4C00 mov eax, dword ptr [004CBE2C]
:0049F1C3 50 push eax

* Reference To: kernel32.GetProcAddress, Ord:0000h
|
:0049F1C4 E8FF7AF6FF Call 00406CC8
:0049F1C9 A318BE4C00 mov dword ptr [004CBE18], eax

* Possible StringData Ref from Code Obj ->"GetRegistrationString"
|
:0049F1CE 6838F24900 push 0049F238
:0049F1D3 A12CBE4C00 mov eax, dword ptr [004CBE2C]
:0049F1D8 50 push eax

* Reference To: kernel32.GetProcAddress, Ord:0000h
|
:0049F1D9 E8EA7AF6FF Call 00406CC8
:0049F1DE A31CBE4C00 mov dword ptr [004CBE1C], eax

* Possible StringData Ref from Code Obj ->"GetComputerCount"
|
:0049F1E3 6850F24900 push 0049F250
:0049F1E8 A12CBE4C00 mov eax, dword ptr [004CBE2C]
:0049F1ED 50 push eax

* Reference To: kernel32.GetProcAddress, Ord:0000h
|
:0049F1EE E8D57AF6FF Call 00406CC8
:0049F1F3 A320BE4C00 mov dword ptr [004CBE20], eax

* Possible StringData Ref from Code Obj ->"CheckKeyVersion"
|
:0049F1F8 6864F24900 push 0049F264
:0049F1FD A12CBE4C00 mov eax, dword ptr [004CBE2C]
:0049F202 50 push eax

* Reference To: kernel32.GetProcAddress, Ord:0000h
|
:0049F203 E8C07AF6FF Call 00406CC8
:0049F208 A324BE4C00 mov dword ptr [004CBE24], eax

Как мы видим, происходит загрузка библиотеки "key.dll", далее адреса ее процедур записываются в память по адресам:


[004CBE18] <- "GetRegistrationName"
[004CBE1С] <- "GetRegistrationString"
[004CBE20] <- "GetComputerCount"
[004CBE24] <- "CheckKeyVersion"

А теперь смотрим на код прям перед LoadLibraryA:


:0049F179 mov dword ptr [004CBE18], 0049F0E0 <- "GetRegistrationName"
:0049F183 mov dword ptr [004CBE1C], 0049F100 <- "GetRegistrationString"
:0049F18D mov dword ptr [004CBE20], 0049F120 <- "GetComputerCount"
:0049F197 mov dword ptr [004CBE24], 0049F134 <- "CheckKeyVersion"

Хе-хе :) Помоему тут и ежу понятно. Автор решил не подвергать риску юзера и задал значения адресов, если такой key.dll не будет найдено :)

Итак вот что прописано для демо режима:


"GetRegistrationName":
:0049F0E0 push ebp
:0049F0E1 mov ebp, esp
:0049F0E3 push ecx
:0049F0E4 mov eax, 0049F0F4 - Это адрес строки "Демо Версия"
:0049F0E9 mov dword ptr [ebp-04], eax
:0049F0EC mov eax, dword ptr [ebp-04]
:0049F0EF pop ecx
:0049F0F0 pop ebp
:0049F0F1 ret

"GetRegistrationString":
:0049F100 
:0049F100 push ebp
:0049F101 mov ebp, esp
:0049F103 push ecx
:0049F104 mov eax, 0049F114 - Это адрес еще одной строки "Демо Версия"
:0049F109 mov dword ptr [ebp-04], eax
:0049F10C mov eax, dword ptr [ebp-04]
:0049F10F pop ecx
:0049F110 pop ebp
:0049F111 retn

"GetComputerCount":
:0049F120 push ebp
:0049F121 mov ebp, esp
:0049F123 push ecx
:0049F124 mov [ebp-04], 00000003 - Число компов :)
:0049F12B mov eax, dword ptr [ebp-04]
:0049F12E pop ecx
:0049F12F pop ebp
:0049F130 retn

"CheckKeyVersion":
:0049F134 push ebp
:0049F135 mov ebp, esp
:0049F137 pop ebp
:0049F138 ret 0004

Ну дальше остается только исправить как кому нравится этот код. Или написать свою супер DLL :) Она должна экспортировать хотя бы функцию GetComputerCount чтобы задать число компов. А так все остальное не важно :)





Похожие по теме исходники

Tetris 2002 (тетрис)




Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте