Расшифровка wand.dat(Opera) на дельфи

Discussion in 'Реверсинг' started by Seregakz, 12 Aug 2009.

  1. Seregakz

    Seregakz New Member

    Joined:
    13 Jun 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    Плз ктонить из шаричих попробуйте запустить его :)
    PHP:
    unit Unit1;

    interface

    uses
      Windows
    MessagesSysUtilsVariantsClassesGraphicsControlsForms,
      
    DialogsStdCtrlsDCPdesDCPsha1DCPmd5;



    type
      TForm1 
    = class(TForm)
        
    Button1TButton;
        
    ListBox1TListBox;
        
    Memo1TMemo;
        
    procedure Button1Click(SenderTObject);
        
    procedure Run1;
        function 
    DecryptWandPass(const KeyDataString): String;
        
    procedure ProcessWandData(MTMemoryStream);
      
    end;

    var
      
    Form1TForm1;
      
    FormsListTList;
        
    AccountListTList;

      
    MTMemoryStream;
     
     
    type
      POperaItem 
    = ^TOperaItem;
      
    TOperaItem record
         Site
    String;
        
    ParamsTStringList;
      
    end;

    implementation

    {$R *.dfm}


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

    procedure OperaDecrypt(keyPointerdatadataoutPointerlenIntegermagicPointermagic_lenInteger);
    var
      
    out_1: array[0..63of Byte;
      
    out_2: array[0..63of Byte;
      
    digest_1: array[0..15of Byte;
      
    digest_2: array[0..15of Byte;
      
    des_key: array[0..23of Byte;

      
    md5TDCP_md5;
      
    CipherTDCP_3des;
    begin
      md5 
    := TDCP_md5.Create(nil);
      
    md5.Init;

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

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

      
    Move(digest_2des_key[16], 8);

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

      
    Cipher.Burn;
      
    Cipher.Free;
    end;


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

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


    procedure TForm1.ProcessWandData(MTMemoryStream);
    var
      
    PPOperaItem;


      function 
    Swap32(ValueLongWord): LongWordassembler;
      
    asm
        bswap eax
      end
    ;

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

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

      function 
    ReadSiteHeaderInteger;
      var
        
    KeyDataString;
      
    begin
        
    if ReadDWord <= 4 then // Len
          
    ReadDWord;

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

        New(
    P);
        
    P.Params := TStringList.Create;
        
    P.Site := DecryptWandPass(KeyData);
        
    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
        
    KeyDataKey2Data2String;
      
    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 
    <> nil then
          P
    .Params.Add(DecryptWandPass(KeyData) + '=' DecryptWandPass(Key2Data2));

      
    end;

    var
      
    ijInteger;

    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

      
    := nil;  

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

      // Data types?
      
    for := 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 := 1 to ReadDWord do
        for 
    := 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(SenderTObject);
    begin
      Run1
    ;
    end;

    end.
     
    1 person likes this.
  2. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    Мож заодно пасы/инки подкинешь? DCPdes, DCPsha1, DCPmd5.

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

    Тут на CPP
     
    #2 ex3me, 16 Aug 2009
    Last edited: 16 Aug 2009
  3. Seregakz

    Seregakz New Member

    Joined:
    13 Jun 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    DCPdes, DCPsha1, DCPmd5 это VCL библиотека)

    Я вкурсах что переделка поэтому она и нужна))
     
  4. W@r.N0i$e

    Joined:
    2 Jun 2009
    Messages:
    54
    Likes Received:
    51
    Reputations:
    12
    Вот.
    http://wramlab.narod.ru/achat.rar
    В архиве исходники, VCL библиотека и exe.
    Скомпилировал и т.д. С интерфейсом не заморачивался и не тестировал, так как не знаю толком, что за прога. Да и Nod32 что-то не взлюбил ее. В общем качай и проверяй сам.
    --------------------------------------------------------------------
    P.S. Exe пришлось удалить, так как был заражен вирусом, но исходники компилятся норм.
     
    #4 [email protected]$e, 21 Aug 2009
    Last edited: 21 Aug 2009
    1 person likes this.
  5. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    [email protected]$e, спасибо, и я погляжу.
    Вылечись от Win32.Include только =)
     
    1 person likes this.
  6. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    то же самое, на Дельфи, но для Мозилы (сурсы)

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

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    По сабжу: код хреново написан в декодере для wand.dat
    У меня лично выдает Err=2 =\ Надо доводить до ума и делать новый пинч )
     
  8. mr. ZetRikS

    mr. ZetRikS New Member

    Joined:
    17 Jul 2009
    Messages:
    45
    Likes Received:
    2
    Reputations:
    0
    если кому нужны недостающие файлы (модули) то они тут
     
  9. bag

    bag Elder - Старейшина

    Joined:
    6 Mar 2008
    Messages:
    116
    Likes Received:
    48
    Reputations:
    0
    у кого нибудь получилось скомпилировать?
     
  10. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    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;
    
    
     
    #10 alexey-m, 7 Nov 2010
    Last edited: 8 Nov 2010
    1 person likes this.
  11. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    ссылка мертвая=\
     
  12. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    http://narod.ru/disk/809633001/mozilla_pass.rar.html

    перезалил
     
  13. rhjn

    rhjn New Member

    Joined:
    5 Oct 2011
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    CopyMemory(@sData[1], OffsetMem(pData, wandOffset + $10), blockLength - $10);

    утечка памяти! как исправить?
     
  14. fate29

    fate29 New Member

    Joined:
    4 Nov 2010
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    ну что люди есть рабочий код для расшифровки паролей опера?
    все что выше выложено не пашет нефига, у меня D7.
    Пишет что компонентов не хватает.
     
  15. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    fate29, а чем тебя этот код не устраивает, он вполне рабочий или у тебя проблема найти библиотеку DCPCrypt2, которую можно заменить на CryptoAPI
     
  16. fate29

    fate29 New Member

    Joined:
    4 Nov 2010
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    те компоненты что выкладывались выше не работают, постоянно пишет delphi то одного нет то другого.
    ну так дай пример, а то код рабочий, только нужно кое-что заменить ))
    ага еще дописать кое-что, строк так 100, а так код рабочий ....
     
  17. Вадимка

    Вадимка New Member

    Joined:
    12 Jul 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    присоединяюсь.....alexey-m помоги плиз)))
     
  18. Вадимка

    Вадимка New Member

    Joined:
    12 Jul 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    подчёркивает следующие строки:
    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'

    что с ними делать??
     
    #18 Вадимка, 18 Nov 2011
    Last edited: 18 Nov 2011
  19. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Линк на 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.
    
     
  20. fate29

    fate29 New Member

    Joined:
    4 Nov 2010
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    скачал dcpcrypt2, установил DCPdelphi6.dpk
    в модуле DCPdes пишет
    [Fatal Error] DCPdes.pas(82): File not found: 'DCPdes.inc'