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

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

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

{/codecitation}

Добавить комментарий