PDA

Просмотр полной версии : CCP (dsetup.dll)


ALF
10.08.2011, 22:10
И так. В общем суть вопроса.
Где могут быть функции Шифровки исходящего и дешифровки входящего трафика.... Где же админам было наиболее выгодно вставить его... Какие функции перехвачивают... Помогите плиз)

Кстати алгортим шифрования пакетов у ССP - RC4

вот так вот выглядят функции шифровки в сервер части...
final int arcfour_byte()
{
int x;
int y;
int sx, sy;

x = (this.x + 1) & 0xff;
sx = (int)state[x];
y = (sx + this.y) & 0xff;
sy = (int)state[y];
this.x = x;
this.y = y;
state[y] = (byte)(sx & 0xff);
state[x] = (byte)(sy & 0xff);
return (int)state[((sx + sy) & 0xff)];
}

public synchronized boolean encrypt(byte src[], int srcOff, byte dest[], int destOff, int len)
{
if(!_inited)
return false;
int end = srcOff + len;
int si = srcOff;
for(int di = destOff; si < end; di++)
{
dest[di] = (byte)((src[si] ^ arcfour_byte()) & 0xff);
si++;
}
return true;
}

public boolean decrypt(byte src[], int srcOff, byte dest[], int destOff, int len)
{
if (encrypt(src, srcOff, dest, destOff, len))
return true;
return false;
}

supernewbie
10.08.2011, 22:18
в сенд пакете оригинальную функцию шифровки подменяют, насчет входящего, думаю где-то в той функции которая вызывает recv, а потом собирает TNetworkPacket и в АддНетворк пускает тоже есть вызов ориг функции дешифровки

ALF
10.08.2011, 22:40
Ммм а подскажите народ))
Как найти ....::SendPacket?
Желательно через VMT что бы потом туда свою пихнуть

supernewbie
10.08.2011, 23:11
ну клиент ищет так

mov eax, [ecx+48h]
mov ecx, [eax]
mov edx, [ecx+6Ch]

в ecx в начале экземпляр UNetworkHandler'а

mira
11.08.2011, 00:17
sendpacket
.......
203D8C47: 7419 jz 203D8C62h если var networkobject.[+00009148h] = 0 то пропускаем (чего быть не должно)
203D8C49: 8B16 mov edx, [esi]
203D8C4B: 8B527C mov edx, [edx+7Ch]
203D8C4E: 8D43FE lea eax, [ebx-02h]
203D8C51: 50 push eax
203D8C52: 8D8E4C910000lea ecx, [esi+0000914Ch]
203D8C58: 51 push ecx
203D8C59: 8D442416 lea eax, [esp+16h]
203D8C5D: 50 push eax
203D8C5E: 8BCE mov ecx, esi
203D8C60: FFD2 call edx // CRYPT
203D8C62: 83BE14A1000000cmp [esi+0000A114h], 00000000h
......


Добавлено через 3 минуты
в ESI вроде как какраз тот объект который передаетса в сенд.
шифровалка тогда получаетса по смещению 7Ch в его VMT

Добавлено через 5 минут

mov eax, [ecx+48h]
mov ecx, [eax]
mov edx, [ecx+7Ch]

если в ЕСХ нетворкхандлер то в едх получим CryptPacket

destructor
11.08.2011, 13:34
Желательно через VMT что бы потом туда свою пихнутьзнает про VMT и следит чтобы туда "свои" не пихали

ALF
11.08.2011, 21:25
Ммм... и так)

что у меня получилось:)


.........
macro m2m dst*,src* {
pushd src
popd dst
}
.........
proc HookMethod uses edi, Table:DWORD,Method:DWORD,Hook:DWORD
mov ecx,-1
cld
mov edi,[Table]
mov eax,[Method]
repnz scasd
m2m dword[edi-4],[Hook]
ret
endp
.........
proc Init_Hook
mov dword[UNHandler],ecx
jmp [UNHandlerInit]
endp
..........
stdcall HookMethod,[UNHandlerTable],[UNHandlerInit],Init_Hook
......

В UNHandler у меня по идеи UNetworkHandler

mov ecx, [UNHandler]
mov eax, [ecx+48h]
mov ecx, [eax]
mov edx, [ecx+7Ch]

если в ЕСХ нетворкхандлер то в едх получим CryptPacket
Это для всех хроник актуально? (точнее для ИТ и ГФ одинаково?)

ALF
12.08.2011, 21:35
И так...
Появилась потребность в восстановлении функции RequestAuthLogin
Смотрим, комментируем)
то что это не правильно - 100%
Но успех где то рядом :)
proc RequestAuthLogin_Hook uses esi, pLogin:DWORD,pPassword:DWORD,Param:DWORD
local loginBuf[256]:WORD
local passBuf[256]:WORD
xor eax,eax
mov eax, [pLogin]
invoke ChekLoginPass,loginBuf,eax,0Eh
MOV ESI,ECX
MOV ECX,[pPassword]
invoke ChekLoginPass,passBuf,ecx,10h

MOV EDX,[Param]
;MOV DWORD[B6AEB4],EDX

MOV EAX,DWORD[ESI+4Ch]
MOV DWORD [EAX+111ECh],1
MOV ECX,DWORD[ESI+4Ch]
MOV DWORD[ECX+111E8h],1
MOV EAX,DWORD [ESI+4Ch]
;ADD ESP,18h
LEA EDX,DWORD[EAX+10858h]
PUSH EDX
CALL Engine.0084F980 ; <<<--- Функция установки коннекта
ret
endp

mOBSCENE
13.08.2011, 04:25
proc RequestAuthLogin_Hook uses esi, pLogin:DWORD,pPassword:DWORD,Param:DWORD
local loginBuf[256]:WORD
local passBuf[256]:WORD
xor eax,eax
mov eax, [pLogin] ;если я правильно понял, то ты тут копируешь 2 (UNICODE) или 4(ANSI) символа из строки в eax, а не адрес, если хочешь скопировать адрес (указатель) на строку в eax то пиши: lea eax,pLogin или mov eax, offset pLogin не проверял, но должно быть одно и тоже.
invoke ChekLoginPass,loginBuf,eax,0Eh
MOV ESI,ECX
MOV ECX,[pPassword] ;тогда тут так: lea eax,pPassword или mov eax, offset pPassword
invoke ChekLoginPass,passBuf,ecx,10h

MOV EDX,[Param] ;тогда тут так: lea eax,Param или mov eax, offset Param
;MOV DWORD[B6AEB4],EDX ; тут писать DWORD не обязательно, если работаешь с 32 битным регистром, там и так DWORD будет

MOV EAX,DWORD[ESI+4Ch] ; и тут можно без DWORD
MOV DWORD [EAX+111ECh],1
MOV ECX,DWORD[ESI+4Ch] ; и тут можно без DWORD
MOV DWORD[ECX+111E8h],1
MOV EAX,DWORD [ESI+4Ch] ; и тут можно без DWORD
;ADD ESP,18h
LEA EDX,DWORD[EAX+10858h] ; и тут можно без DWORD
PUSH EDX
CALL Engine.0084F980 ; <<<--- Функция установки коннекта
ret
endp

Извиняюсь за грамотейство, не исключено, что я там наплужил или нет, ночь всетаки..))

ALF
13.08.2011, 12:24
в ЕАХ нам надо указатель на строку)
Точнее указатель на пустой buf для логина.
Зачем - без понятие.
Его клиент использует при проверке на "пустоту" логина и пасса)
хотя указатель на логин и пасс приходит в аргументах самой функции О_о