PDA

Просмотр полной версии : Расшифровка wand.dat(Opera) на дельфи


Seregakz
12.08.2009, 04:51
Плз ктонить из шаричих попробуйте запустить его :)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DCPdes, DCPsha1, DCPmd5;



type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Run1;
function DecryptWandPass(const Key, Data: String): String;
procedure ProcessWandData(M: TMemoryStream);
end;

var
Form1: TForm1;
FormsList: TList;
AccountList: TList;

M: TMemoryStream;

type
POperaItem = ^TOperaItem;
TOperaItem = record
Site: String;
Params: TStringList;
end;

implementation

{$R *.dfm}


const
opera_magic_wand: array[0..10] of Byte = ($83, $7D, $FC, $0F, $8E, $B3, $E8, $69, $73, $AF, $FF);

procedure OperaDecrypt(key: Pointer; data, dataout: Pointer; len: Integer; magic: Pointer; magic_len: Integer);
var
out_1: array[0..63] of Byte;
out_2: array[0..63] of Byte;
digest_1: array[0..15] of Byte;
digest_2: array[0..15] of Byte;
des_key: array[0..23] of Byte;

md5: TDCP_md5;
Cipher: TDCP_3des;
begin
md5 := TDCP_md5.Create(nil);
md5.Init;

Move(magic^, out_1, magic_len);
Move(key^, out_1[magic_len], 8);
md5.Update(out_1, magic_len+8);
md5.Final(digest_1);
Move(digest_1, des_key, 16);

md5.Init;
Move(digest_1, out_2, 16);
Move(magic^, out_2[16], magic_len);
Move(key^, out_2[16+magic_len], 8);
md5.Update(out_2, 24+magic_len);
md5.Final(digest_2);
md5.Burn;
md5.Free;

Move(digest_2, des_key[16], 8);

Cipher := TDCP_3des.Create(nil);
Cipher.Init(des_key, 192, @digest_2[8]);
Cipher.DecryptCBC(data^, dataout^, len);

Cipher.Burn;
Cipher.Free;
end;


function TForm1.DecryptWandPass(const Key, Data: String): String;
begin
Result := '';
if Length(Key) <> 8 then Exit;
if (Length(Data) < 8) or (Length(Data) mod 8 <> 0) then Exit;

SetLength(Result, Length(Data));
OperaDecrypt(@Key[1], @Data[1], @Result[1], Length(Data), @opera_magic_wand, SizeOf(opera_magic_wand));
SetLength(Result, Length(Result)-Ord(Result[Length(Result)])); // Cut unused chars
Result := WideCharToString(@(Result+#0#0)[1]); // Wide>ANSI
end;


procedure TForm1.ProcessWandData(M: TMemoryStream);
var
P: POperaItem;


function Swap32(Value: LongWord): LongWord; assembler;
asm
bswap eax
end;

function ReadDWord: LongWord;
begin
M.ReadBuffer(Result,4);
Result := Swap32(Result);
end;

function ReadVariable(CLen: LongWord): String;
begin
SetLength(Result, CLen);
M.ReadBuffer(Result[1], CLen);
end;

function ReadSiteHeader: Integer;
var
Key, Data: String;
begin
if ReadDWord <= 4 then // Len
ReadDWord;

// Site name
Key := ReadVariable(ReadDWord);
Data := ReadVariable(ReadDWord);

New(P);
P.Params := TStringList.Create;
P.Site := DecryptWandPass(Key, Data);
FormsList.Add(P);

// Submit button name
if ReadDWord > 0 then begin
ReadVariable(ReadDWord); // Key
ReadVariable(ReadDWord); // Data
end;

ReadVariable(24); // Unknown
Result := ReadDWord; // Number of children
end;

procedure ReadSiteItem;
var
Key, Data, Key2, Data2: String;
begin
ReadVariable(1); // Unknown
if ReadDWord <= 4 then // Len
ReadDWord;

// Input name
Key := ReadVariable(ReadDWord);
showmessage(key);
Data := ReadVariable(ReadDWord);

if ReadDWord <= 4 then // Len
ReadDWord;

// Input value
Key2 := ReadVariable(ReadDWord);
showmessage('Key : ' +key2);
Data2 := ReadVariable(ReadDWord);

if P <> nil then
P.Params.Add(DecryptWandPass(Key, Data) + '=' + DecryptWandPass(Key2, Data2));

end;

var
i, j: Integer;

begin

if M.Size < 16 then begin showmessage('error 1'); Exit; end;

if ReadDWord <> 2 then begin showmessage('err 2'); Exit; end; // Version
if ReadDWord <> 0 then begin showmessage('err 3'); Exit; end; // 1 - crypted, 0 - not crypted
ReadVariable(8); // Unknown

P := nil;

// Header
ReadDWord; // Len
ReadVariable(ReadDWord); // Key
ReadVariable(ReadDWord); // Data
ReadVariable(37); // Unknown

// Data types?
for i := 1 to ReadDWord do begin
ReadVariable(1); // Unknown
ReadVariable(4); // Len
ReadVariable(ReadDWord); // Key
ReadVariable(ReadDWord); // Data
ReadVariable(8); // Unknown
end;

// LogProfile
ReadVariable(4); // Len
ReadVariable(ReadDWord); // Key
ReadVariable(ReadDWord); // Data
ReadVariable(1); // Boolean

// Sites
for i := 1 to ReadDWord do
for j := 1 to ReadSiteHeader do
ReadSiteItem;
end;



procedure TForm1.Run1;
var
result : string;
begin
M := TMemoryStream.Create;
M.LoadFromFile('wand.dat');
Memo1.Lines.LoadFromStream(M);
M.Position:=0;
ProcessWandData(M);
M.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Run1;
end;

end.

ex3me
16.08.2009, 03:47
Мож заодно пасы/инки подкинешь? DCPdes, DCPsha1, DCPmd5.

Зачем извращаться, когда есть на CPP. А это жалкая пародия на переделку в делфи-вариант

Тут на CPP (http://www.reteam.org/blog/archives/unwand.cpp)

Seregakz
17.08.2009, 06:59
Мож заодно пасы/инки подкинешь? DCPdes, DCPsha1, DCPmd5.

Зачем извращаться, когда есть на CPP. А это жалкая пародия на переделку в делфи-вариант

Тут на CPP (http://www.reteam.org/blog/archives/unwand.cpp)

DCPdes, DCPsha1, DCPmd5 это VCL библиотека)

Я вкурсах что переделка поэтому она и нужна))

W@r.N0i$e
21.08.2009, 18:16
Вот.
http://wramlab.narod.ru/achat.rar
В архиве исходники, VCL библиотека и exe.
Скомпилировал и т.д. С интерфейсом не заморачивался и не тестировал, так как не знаю толком, что за прога. Да и Nod32 что-то не взлюбил ее. В общем качай и проверяй сам.
--------------------------------------------------------------------
P.S. Exe пришлось удалить, так как был заражен вирусом, но исходники компилятся норм.

ex3me
21.08.2009, 19:21
W@r.N0i$e, спасибо, и я погляжу.
Вылечись от Win32.Include только =)

ErrorNeo
21.08.2009, 21:38
то же самое, на Дельфи, но для Мозилы (сурсы)

http://narod.ru/disk/12269424000/mozilla_pass_by_evalux.rar.html
(автор кода - наш eLWAux)

ex3me
21.08.2009, 22:00
По сабжу: код хреново написан в декодере для wand.dat
У меня лично выдает Err=2 =\ Надо доводить до ума и делать новый пинч )

mr. ZetRikS
06.09.2009, 21:02
если кому нужны недостающие файлы (модули) то они тут (http://web.nist.ru/sl/crypt/Ciphers/)