Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Клиент-сервер в ClubAdmin 2.3
Разговаривают два системных администратора:
-Прикинь, вчера мой знакомый сервак уронил!
-Он что - хакер?
-Нет. Он кретин!

Очередная чисто "клубная" прога :) Т.е. для управления клубом компутерным. Как обычно ничего особенно, но тут заюзан принцип "клиент-сервер" для процесса регистрации и это интересно поглядеть...

Инструменты: Softice, Ida Pro 4.x, Hex редактор.

Как я определил что тут принцип клиент-сервер? Да просто прога сетевая и ClubAdmin.exe при запуске конектится к ClubServer. И еще после того как имя и регистрационный введен он только раз копируется и больше с ним ничего не происходит, что тоже вызвало у меня подозрение. Сделав ради интереса bpx send я убедился, что код таки пересылается на ClubServer и обрабатывается там. Если посмотреть что передается в буфере send то можно видеть что-то типа:


xx..Testinfo..nnnnnn..uuuu
xx - какие-то 2 байта
nnnn - введенный серийник
uuuu - введенное имя

Значит "TestInfo"... посмотрим где встречается эта строка в ClubServer.exe Грузим в IDA. И видим вот такое(я тут немного от себя подписал):


_text:00405423 push 8
_text:00405425 push offset aTestinfo ; "TestInfo"
_text:0040542A push edi
_text:0040542B call sub_0_412F74
_text:00405430 add esp, 0Ch
_text:00405433 test eax, eax
_text:00405435 jnz loc_0_405538
_text:0040543B push 80h
_text:00405440 add edi, 8
_text:00405443 push edi
_text:00405444 lea eax, [ebp+var_7594]
_text:0040544A push eax
_text:0040544B call GetDataFromPacket
_text:00405450 add esp, 0Ch
_text:00405453 mov esi, eax
_text:00405455 push 80h
_text:0040545A push esi
_text:0040545B lea eax, [ebp+var_74CC]
_text:00405461 push eax
_text:00405462 call GetDataFromPacket
_text:00405467 add esp, 0Ch
_text:0040546A lea edx, [ebp+var_74CC]
_text:00405470 push edx ; SN
_text:00405471 lea ecx, [ebp+var_7594]
_text:00405477 push ecx ; UserName
_text:00405478 push ebx
_text:00405479 call TestReg

То что я назвал TestReg:


_text:00404164 push esi
_text:00404165 push ebx
_text:00404166 call sub_0_40B7BC ; CheckSerial
_text:0040416B add esp, 8
_text:0040416E cmp eax, 4
_text:00404171 jg short loc_0_40417A
_text:00404173 xor eax, eax
_text:00404175 jmp loc_0_40423B

CheckSerial:


_text:0040B7BC push ebp
_text:0040B7BD mov ebp, esp
_text:0040B7BF add esp, 0FFFFFF60h
_text:0040B7C5 push ebx
_text:0040B7C6 push esi
_text:0040B7C7 mov esi, offset aNone ; "none"
_text:0040B7CC lea eax, [ebp+var_18]
_text:0040B7CF push eax ; int
_text:0040B7D0 mov edx, [ebp+lpString]
_text:0040B7D3 push edx ; lpString
_text:0040B7D4 call CheckLength - тут проверяет длину серийного номера. Длина кода = 20 символов.
_text:0040B7D9 add esp, 8
_text:0040B7DC test al, al
_text:0040B7DE jnz short loc_0_40B7EA - если ок то прыгнет
_text:0040B7E0 mov eax, 4 - это число компов в демо режиме.
_text:0040B7E5 jmp loc_0_40BA19

Дальше оно шифрует серийник и идет по кускам кода, которые определяют тип лицензии. Там идет типа:


_text:0040B877 call sub_0_412F74 - проверка зашифрованного серийника
_text:0040B87C add esp, 0Ch
_text:0040B87F test eax, eax
_text:0040B881 jz short loc_0_40B88D - если тут не прыгнет то дальше сразу демо режим.
_text:0040B883 mov eax, 4 - количество компов... 
_text:0040B888 jmp loc_0_40BA19
..............
_text:0040B8CF call sub_0_412F74
_text:0040B8D4 add esp, 0Ch
_text:0040B8D7 test eax, eax
_text:0040B8D9 jnz short loc_0_40B8E5
_text:0040B8DB mov eax, 0Ah - количество компов... 
_text:0040B8E0 jmp loc_0_40BA19

и т.д. мне понравился вот этот вариант:
_text:0040B97E call sub_0_412F74
_text:0040B983 add esp, 0Ch
_text:0040B986 test eax, eax
_text:0040B988 jnz short loc_0_40B994
_text:0040B98A mov eax, 64h - 100 компов :)
_text:0040B98F jmp loc_0_40BA19

Итак что нужно чтобы управлять 100 компами? Нужно сделать чтоб jnz по адресу 40B988 не выполнялся, а также jz по адресу 40B881 выполнялся всегда. После таких модификаций можно заходить ClubAdmin.exe и регить себя на любое имя, главное чтоб номер имел длину 20 символов.

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