скрыть

скрыть

  Форум  

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

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



Google  
 

Исследуем демку 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 чтобы задать число компов. А так все остальное не важно :)






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook