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