Algorytm hashowania GG 6.0

0

Mógłby ktoś podać mi jakiś link czy cosik do algorytmu hashowania hasła w GG 6.0 ??

0

Moze na stronie EKG maja juz cos? A jak nie, to sniffer i jedziesz sam ;)

0

Heh, własnie sniffer niewiele daje. Mogę jedynie sprawdzić czy mój algorytm jest taki sam jak ten w kliencie.
Przecież hash to zabezpieczenie przed snifferami :-)

Z tego co znalazłem w sieci to tylko to:

int gg_login_hash(char *password, int seed)
{
unsigned int x, y, z;

y = seed;

for (x = 0; *password; password++) {
	x = (x & 0xffffff00) | *password;
	y ^= x;
	y += x;
	x <<= 8;
	y ^= x;
	x <<= 8;
	y -= x;
	x <<= 8;
	y ^= x;

	z = y & 0x1f;
	y = (y << z) | (y >> (32 - z));
}

return y;

}

Ale to w c++, a ja tego języka nie znam. Nie pomogły żadne kursy itd. Mógłby mi ktoś to wytłumaczyć albo przełożyć na Delphi??? Byłbym wdzięczny [browar]

0

To powinno wystarczyć - nie mam teraz czasu na pełną zamianę.
[code]
 C++     |  Pascal
---------+-------------
x = y;   | x:= y;
x += y;  | x:= x + y;
x -= y;  | x:= x - y;
x <<= y; | x:= x shl y;
x >>= y; | x:= x shr y;
x |= y;  | x:= x or y;
x &= y;  | x:= x and y;
x ^= y;  | x:= x xor y;
[/code]

0

Dzięki o to właśnie mi chodziło.

//dopisane
acha, to *password to aktualny znak hasła w pętli????

//tak - Marooned

0

Kurde przerobiłem to na Delphi i nie chce działać

function gghash(password:char;seed:integer):integer;
var
x,y,z:integer;
begin
x := 0;
y := x;
z := seed;
x := (x and $ffffff00) or ord(password);
y := y * x;
y := y + x;
x := x shl 8;
y := y * x;
x := x shl 8;
y := y - x;
x := x shl 8;
y := y * x;
z := y and $1f;
y := (y shl z) or (y shr (32-z));
result := y;
end;

Jako password daje po kolei każdą literkę hasła, jako seed daję liczbę podaną przez serwer, a wyniki funkcji dodaję. Problem w tym, że funkcja zawsze zwraca 0. [glowa] [glowa] [glowa]

0
function gghash(password:char;seed:integer):integer;
var
x,y,z:integer;
begin
x := 0;
//y := x; //po co to?
y := seed; //y nie z
x := (x and $ffffff00) or ord(password);
y := y xor x; //xor nie mnożenie
y := y + x;
x := x shl 8;
y := y xor x; //tak samo
x := x shl 8;
y := y - x;
x := x shl 8;
y := y xor x; //i tutaj
z := y and $1f;
y := (y shl z) or (y shr (32-z));
result := y;
end;

A najlepiej to zrobić od razu:

function gg_login_hash(password: string; seed: Integer): Integer;
var
  x, y, z: Cardinal;
begin
  y := seed;
  x := 0;
  for i := 0 to Length(password)-1 do
  begin
    x := (x and $ffffff00) or Ord(password[i]);
    y := y xor x + x;
    x := x shl 8;
    y := y xor x;
    x := x shl 8;
    y := y - x;
    x := x shl 8;
    y := y xor x;
    z := y and 0x1f;
    y := (y shl z) or (y shr (32 - z));
  end;
  Result := y;
end;

Jeszcze trochę się pobawię i napiszę to w asm :P

P. S. Czy to deja vu czy ja może już to przepisywałem na Delphi?

0

Wielkie thX Dryobates. Zaimplementuje to i zobacze co mi wyjdzie :-)

0

To jest fajniejsze (czytaj: teoretycznie szybsze):

  function gg_login_hash(Password: PChar; Seed: Integer): Integer;
  asm
    push esi
    push ebx

    mov esi, eax
    xor eax, eax //eax - x
  @pocz:
    mov bl, [esi]
    test bl, bl
    jz @koniec
      mov al, bl
      xor edx, eax //edx - y
      add edx, eax
      shl eax, 8
      xor edx, eax;
      shl eax, 8
      xor edx, eax
      mov ecx, edx //ebx - z
      and ecx, 1fh
      mov ebx, edx
      shl edx, cl //y shl z
      xchg edx, ebx //edx = z, ebx = y shl z
      sub ecx, 20h
      neg ecx
      shr edx, cl  //y shl (32-z)
      or edx, ebx
      inc esi
      jmp @pocz
    @koniec:
      mov eax, edx

    pop ebx
    pop esi
  end;
0

Kurde nie chce działać. Ani pod GG 6.0 ani pod 5.3

Stosuję ten kod Delphi nie asm.

//dopisane
znaczy się nie chce działać, czyli serwer wywala pakiet 0x09 czyli błąd.

0

siemka. Fajny algorytm.
Co do błędu to powinno być $1f zamiast 0x1f. A jeśli chodzi o wersje w assemblerze to nie wiem czy czasem nie zapomniałeś o dwóch operacjach, ale może mi się tylko wydaje:

function gg_login_hash(Password: PChar; Seed: Integer): Integer;
asm
push esi
push ebx

mov esi, eax
xor eax, eax
@pocz:
mov bl, [esi]
test bl, bl
jz @koniec
mov al, bl
xor edx, eax
add edx, eax
shl eax, 8
xor edx, eax
shl eax, 8

sub edx,eax //y-=x
shl eax, 8 //x<<=8

xor edx, eax
mov ecx, edx
and ecx, 1fh
mov ebx, edx
shl edx, cl
xchg edx, ebx
sub ecx, 20h
neg ecx
shr edx, cl
or edx, ebx
inc esi
jmp @pocz
@koniec:
mov eax, edx

pop ebx
pop esi
end;

Pozdrowionka
[cya]

0

Kurde nie chce działać. Ani pod GG 6.0 ani pod 5.3

nie czytałem tego topicu wcześniej, może śliwki po obiedzie ale
na wszelki wypadek wkleję, bo to co sobie przetłumaczyłem
na 100% działa w moim programie...

function GGLoginHash(Pass: String; Seed: Cardinal): Cardinal;
var
  x, y, z, i : Cardinal;
begin
  y := Seed;
  x := 0;
  for i := 1 to Length(Pass) do begin
    x := (x and $ffffff00) or Ord(Pass[i]);
    y := y xor x;
    Inc(y, x);
    x := x shl 8;
    y := y xor x;
    x := x shl 8;
    Dec(y, x);
    x := x shl 8;
    y := y xor x;
    z := y and $1f;
    y := (y shl z) or (y shr (32 - z));
  end;
  Result := y;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1