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

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