Плз ктонить из шаричих попробуйте запустить его PHP: 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.
Мож заодно пасы/инки подкинешь? DCPdes, DCPsha1, DCPmd5. Зачем извращаться, когда есть на CPP. А это жалкая пародия на переделку в делфи-вариант Тут на CPP
Вот. http://wramlab.narod.ru/achat.rar В архиве исходники, VCL библиотека и exe. Скомпилировал и т.д. С интерфейсом не заморачивался и не тестировал, так как не знаю толком, что за прога. Да и Nod32 что-то не взлюбил ее. В общем качай и проверяй сам. -------------------------------------------------------------------- P.S. Exe пришлось удалить, так как был заражен вирусом, но исходники компилятся норм.
то же самое, на Дельфи, но для Мозилы (сурсы) http://narod.ru/disk/12269424000/mozilla_pass_by_evalux.rar.html (автор кода - наш eLWAux)
По сабжу: код хреново написан в декодере для wand.dat У меня лично выдает Err=2 =\ Надо доводить до ума и делать новый пинч )
Decrypt wand.dat вот рабочий код, когда-то переделал для себя, устранял как раз: собственно сам код: Code: uses DCPdes, md5; type PHeaderWand = ^THeaderWand; THeaderWand = record szBlock: DWORD; szKey: DWORD; Key: array[0..7] of Byte; end; const Key: array[0..7] of byte = ($F9, $BF, $8B, $FD, $A5, $45, $15, $22); Data: array[0..39] of byte = ( $99, $20, $8B, $C6, $37, $C7, $9F, $8C, $B4, $33, $34, $DC, $C3, $8F, $CF, $34, $20, $19, $23, $85, $3E, $74, $99, $76, $57, $3A, $1A, $4A, $F2, $BE, $A5, $6E, $94, $5A, $A8, $A6, $08, $82, $D3, $FB); implementation function OffsetMem(lpBase: Pointer; Offset: Cardinal): Pointer; asm add eax,edx end; procedure OperaDecrypt(key: Pointer; data, dataout: Pointer; len: Integer); var out_1, out_2: array[0..63] of Byte; digest_1, digest_2: MD5Digest; des_key: array[0..23] of Byte; Cipher: TDCP_3des; const magic: array[0..10] of Byte = ($83, $7D, $FC, $0F, $8E, $B3, $E8, $69, $73, $AF, $FF); szMagic = SizeOf(magic); begin Move(magic, out_1, szMagic); Move(key^, out_1[szMagic], 8); digest_1:= MD5Blocks(@out_1, szMagic + 8); Move(digest_1, des_key, 16); Move(digest_1, out_2, 16); Move(magic, out_2[16], szMagic); Move(key^, out_2[16 + szMagic], 8); digest_2:= MD5Blocks(@out_2,szMagic + 24); Move(digest_2, des_key[16], 8); Cipher := TDCP_3des.Create; Cipher.Init(des_key, 192, @digest_2[8]); Cipher.DecryptCBC(data^, dataout^, len); Cipher.Burn; Cipher.Free; end; function 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)); SetLength(Result, Length(Result)- Ord(Result[Length(Result)])); Result:= WideCharToString(@(Result+#0#0)[1]); // Wide>ANSI end; function Swap32(Value: LongWord): LongWord; assembler; asm bswap eax end; procedure ParsingWandDat(WandDat: PChar); var hFileMap, hFile: THandle; pData: Pointer; szFile, blockLength, wandOffset, dataLength: DWORD; Header: PHeaderWand; sKey, sData: String; begin hFile:= CreateFileA(WandDat, GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if hFile <> INVALID_HANDLE_VALUE then begin szFile:= GetFileSize(hFile, nil); hFileMap:= CreateFileMappingA(hFile, nil, PAGE_READWRITE , 0, szFile, nil); if hFileMap <> INVALID_HANDLE_VALUE then begin CloseHandle(hFile); pData:= MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, szFile); if pData <> nil then try wandOffset:= 0; while (wandOffset < szFile) do begin while (wandOffset< szFile - 4) do begin if DWORD(OffsetMem(pData, wandOffset)^) = DWORD($08000000) then Break else wandOffset:= wandOffset + 1; //Inc(i); end; Header:= OffsetMem(pData, wandOffset - 4); blockLength:= Swap32(Header^.szBlock); dataLength:= Swap32(Header^.szKey); SetLength(sKey, 8); SetLength(sData, blockLength - $10); CopyMemory(@sKey[1], @Header^.Key, 8); CopyMemory(@sData[1], OffsetMem(pData, wandOffset + $10), blockLength - $10); [COLOR=Blue]Form1.Memo1.Lines.Add(DecryptWandPass(sKey, sData));[/COLOR] wandOffset:= wandOffset + dataLength + $10; end; // Конец расшифровки файла finally UnmapViewOfFile(pData); end; CloseHandle(hFileMap); end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ParsingWandDat('wand.dat'); end;
CopyMemory(@sData[1], OffsetMem(pData, wandOffset + $10), blockLength - $10); утечка памяти! как исправить?
ну что люди есть рабочий код для расшифровки паролей опера? все что выше выложено не пашет нефига, у меня D7. Пишет что компонентов не хватает.
fate29, а чем тебя этот код не устраивает, он вполне рабочий или у тебя проблема найти библиотеку DCPCrypt2, которую можно заменить на CryptoAPI
те компоненты что выкладывались выше не работают, постоянно пишет delphi то одного нет то другого. ну так дай пример, а то код рабочий, только нужно кое-что заменить )) ага еще дописать кое-что, строк так 100, а так код рабочий ....
подчёркивает следующие строки: digest_1, digest_2: MD5Digest; digest_1:= MD5Blocks(@out_1, szMagic + 8); [Error] Unit1.pas(58): Undeclared identifier: 'MD5Digest' [Error] Unit1.pas(67): Undeclared identifier: 'MD5Blocks' что с ними делать??
Линк на DCPCrypt, а вот код md5 юнита: Code: unit md5; interface uses Windows; type MD5Count = array[0..1] of DWORD; MD5State = array[0..3] of DWORD; MD5Block = array[0..15] of DWORD; MD5CBits = array[0..7] of byte; MD5Digest = array[0..15] of byte; MD5Buffer = array[0..63] of byte; MD5Context = record State: MD5State; Count: MD5Count; Buffer: MD5Buffer; end; procedure MD5Init(var Context: MD5Context); procedure MD5Update(var Context: MD5Context; Input: pChar; Length: longword); procedure MD5Final(var Context: MD5Context; var Digest: MD5Digest); function MD5String(M: string): MD5Digest; function MD5Blocks(M: Pointer; szBlock: Integer): MD5Digest; function MD5Print(D: MD5Digest): string; function MD5Match(D1, D2: MD5Digest): boolean; implementation var PADDING: MD5Buffer = ( $80, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00); function F(x, y, z: DWORD): DWORD; begin Result := (x and y) or ((not x) and z); end; function G(x, y, z: DWORD): DWORD; begin Result := (x and z) or (y and (not z)); end; function H(x, y, z: DWORD): DWORD; begin Result := x xor y xor z; end; function I(x, y, z: DWORD): DWORD; begin Result := y xor (x or (not z)); end; procedure rot(var x: DWORD; n: BYTE); begin x := (x shl n) or (x shr (32 - n)); end; procedure FF(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD); begin inc(a, F(b, c, d) + x + ac); rot(a, s); inc(a, b); end; procedure GG(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD); begin inc(a, G(b, c, d) + x + ac); rot(a, s); inc(a, b); end; procedure HH(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD); begin inc(a, H(b, c, d) + x + ac); rot(a, s); inc(a, b); end; procedure II(var a: DWORD; b, c, d, x: DWORD; s: BYTE; ac: DWORD); begin inc(a, I(b, c, d) + x + ac); rot(a, s); inc(a, b); end; // Encode Count bytes at Source into (Count / 4) DWORDs at Target procedure Encode(Source, Target: pointer; Count: longword); var S: PByte; T: PDWORD; I: longword; begin S:= Source; T:= Target; for I:= 1 to Count div 4 do begin T^:= S^; inc(S); T^:= T^ or (S^ shl 8); inc(S); T^:= T^ or (S^ shl 16); inc(S); T^:= T^ or (S^ shl 24); inc(S); inc(T); end; end; // Decode Count DWORDs at Source into (Count * 4) Bytes at Target procedure Decode(Source, Target: pointer; Count: longword); var S: PDWORD; T: PByte; I: longword; begin S := Source; T := Target; for I := 1 to Count do begin T^ := S^ and $ff; inc(T); T^ := (S^ shr 8) and $ff; inc(T); T^ := (S^ shr 16) and $ff; inc(T); T^ := (S^ shr 24) and $ff; inc(T); inc(S); end; end; // Transform State according to first 64 bytes at Buffer procedure Transform(Buffer: pointer; var State: MD5State); var a, b, c, d: DWORD; Block: MD5Block; begin Encode(Buffer, @Block, 64); a := State[0]; b := State[1]; c := State[2]; d := State[3]; FF (a, b, c, d, Block[ 0], 7, $d76aa478); FF (d, a, b, c, Block[ 1], 12, $e8c7b756); FF (c, d, a, b, Block[ 2], 17, $242070db); FF (b, c, d, a, Block[ 3], 22, $c1bdceee); FF (a, b, c, d, Block[ 4], 7, $f57c0faf); FF (d, a, b, c, Block[ 5], 12, $4787c62a); FF (c, d, a, b, Block[ 6], 17, $a8304613); FF (b, c, d, a, Block[ 7], 22, $fd469501); FF (a, b, c, d, Block[ 8], 7, $698098d8); FF (d, a, b, c, Block[ 9], 12, $8b44f7af); FF (c, d, a, b, Block[10], 17, $ffff5bb1); FF (b, c, d, a, Block[11], 22, $895cd7be); FF (a, b, c, d, Block[12], 7, $6b901122); FF (d, a, b, c, Block[13], 12, $fd987193); FF (c, d, a, b, Block[14], 17, $a679438e); FF (b, c, d, a, Block[15], 22, $49b40821); GG (a, b, c, d, Block[ 1], 5, $f61e2562); GG (d, a, b, c, Block[ 6], 9, $c040b340); GG (c, d, a, b, Block[11], 14, $265e5a51); GG (b, c, d, a, Block[ 0], 20, $e9b6c7aa); GG (a, b, c, d, Block[ 5], 5, $d62f105d); GG (d, a, b, c, Block[10], 9, $2441453); GG (c, d, a, b, Block[15], 14, $d8a1e681); GG (b, c, d, a, Block[ 4], 20, $e7d3fbc8); GG (a, b, c, d, Block[ 9], 5, $21e1cde6); GG (d, a, b, c, Block[14], 9, $c33707d6); GG (c, d, a, b, Block[ 3], 14, $f4d50d87); GG (b, c, d, a, Block[ 8], 20, $455a14ed); GG (a, b, c, d, Block[13], 5, $a9e3e905); GG (d, a, b, c, Block[ 2], 9, $fcefa3f8); GG (c, d, a, b, Block[ 7], 14, $676f02d9); GG (b, c, d, a, Block[12], 20, $8d2a4c8a); HH (a, b, c, d, Block[ 5], 4, $fffa3942); HH (d, a, b, c, Block[ 8], 11, $8771f681); HH (c, d, a, b, Block[11], 16, $6d9d6122); HH (b, c, d, a, Block[14], 23, $fde5380c); HH (a, b, c, d, Block[ 1], 4, $a4beea44); HH (d, a, b, c, Block[ 4], 11, $4bdecfa9); HH (c, d, a, b, Block[ 7], 16, $f6bb4b60); HH (b, c, d, a, Block[10], 23, $bebfbc70); HH (a, b, c, d, Block[13], 4, $289b7ec6); HH (d, a, b, c, Block[ 0], 11, $eaa127fa); HH (c, d, a, b, Block[ 3], 16, $d4ef3085); HH (b, c, d, a, Block[ 6], 23, $4881d05); HH (a, b, c, d, Block[ 9], 4, $d9d4d039); HH (d, a, b, c, Block[12], 11, $e6db99e5); HH (c, d, a, b, Block[15], 16, $1fa27cf8); HH (b, c, d, a, Block[ 2], 23, $c4ac5665); II (a, b, c, d, Block[ 0], 6, $f4292244); II (d, a, b, c, Block[ 7], 10, $432aff97); II (c, d, a, b, Block[14], 15, $ab9423a7); II (b, c, d, a, Block[ 5], 21, $fc93a039); II (a, b, c, d, Block[12], 6, $655b59c3); II (d, a, b, c, Block[ 3], 10, $8f0ccc92); II (c, d, a, b, Block[10], 15, $ffeff47d); II (b, c, d, a, Block[ 1], 21, $85845dd1); II (a, b, c, d, Block[ 8], 6, $6fa87e4f); II (d, a, b, c, Block[15], 10, $fe2ce6e0); II (c, d, a, b, Block[ 6], 15, $a3014314); II (b, c, d, a, Block[13], 21, $4e0811a1); II (a, b, c, d, Block[ 4], 6, $f7537e82); II (d, a, b, c, Block[11], 10, $bd3af235); II (c, d, a, b, Block[ 2], 15, $2ad7d2bb); II (b, c, d, a, Block[ 9], 21, $eb86d391); inc(State[0], a); inc(State[1], b); inc(State[2], c); inc(State[3], d); end; // Initialize given Context procedure MD5Init(var Context: MD5Context); begin with Context do begin State[0] := $67452301; State[1] := $efcdab89; State[2] := $98badcfe; State[3] := $10325476; Count[0] := 0; Count[1] := 0; ZeroMemory(@Buffer, SizeOf(MD5Buffer)); end; end; // Update given Context to include Length bytes of Input procedure MD5Update(var Context: MD5Context; Input: pChar; Length: longword); var Index: longword; PartLen: longword; I: longword; begin with Context do begin Index := (Count[0] shr 3) and $3f; inc(Count[0], Length shl 3); if Count[0] < (Length shl 3) then inc(Count[1]); inc(Count[1], Length shr 29); end; PartLen := 64 - Index; if Length >= PartLen then begin CopyMemory(@Context.Buffer[Index], Input, PartLen); Transform(@Context.Buffer, Context.State); I := PartLen; while I + 63 < Length do begin Transform(@Input[I], Context.State); inc(I, 64); end; Index := 0; end else I := 0; CopyMemory(@Context.Buffer[Index], @Input[I], Length - I); end; // Finalize given Context, create Digest and zeroize Context procedure MD5Final(var Context: MD5Context; var Digest: MD5Digest); var Bits: MD5CBits; Index: longword; PadLen: longword; begin Decode(@Context.Count, @Bits, 2); Index := (Context.Count[0] shr 3) and $3f; if Index < 56 then PadLen := 56 - Index else PadLen := 120 - Index; MD5Update(Context, @PADDING, PadLen); MD5Update(Context, @Bits, 8); Decode(@Context.State, @Digest, 4); ZeroMemory(@Context, SizeOf(MD5Context)); end; // Create digest of given Message function MD5String(M: string): MD5Digest; var Context: MD5Context; begin MD5Init(Context); MD5Update(Context, pChar(M), length(M)); MD5Final(Context, Result); end; function MD5Blocks(M: Pointer; szBlock: Integer): MD5Digest; var Context: MD5Context; begin MD5Init(Context); MD5Update(Context, M, szBlock); MD5Final(Context, Result); end; // Create hex representation of given Digest function MD5Print(D: MD5Digest): string; var I: byte; const Digits: array[0..15] of char = ('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'); begin Result := ''; for I := 0 to 15 do Result := Result + Digits[(D[I] shr 4) and $0f] + Digits[D[I] and $0f]; end; // Compare two Digests function MD5Match(D1, D2: MD5Digest): boolean; var I: byte; begin I:= 0; Result:= True; while Result and (I < 16) do begin Result:= D1[I] = D2[I]; inc(I); end; end; end.
скачал dcpcrypt2, установил DCPdelphi6.dpk в модуле DCPdes пишет [Fatal Error] DCPdes.pas(82): File not found: 'DCPdes.inc'