Einzelnen Beitrag anzeigen

Marcu

Registriert seit: 20. Mai 2012
50 Beiträge
 
#296

AW: Verschlüsselungs-Trojaner, Hilfe benötigt

  Alt 5. Aug 2012, 22:42
Hallo Michael
Zitat:
Wenn man nun versucht mit Bruteforce die Datei(en) zu entschlüsseln, wie kann man dann während der Suche erkennen, ob die Datei richtig entschlüsselt wurde? Man weiss ja prizipiell nicht für jede Datei genau, obs nun eine doc, jpg, odt, ... ist. Es müsste doch nach jedem Schlüssel versucht werden die Datei zu öffnen, oder?
Genau so ist. Es gibt keinen Rückgabewert der den Erfolg anzeigt. Man muss nach nach jedem Entschlüsselungsversuch nachschauen ob es geklappt hat.

In diesem Fall muss man darauf hoffen, dass man nach der Entschlüsselung etwas bekommt das ungefähr so aussieht wie das Beispiel im Posting #247.

Anfangs hatte ich eine sehr kleine Funktion die ungefähr so aussah:
Delphi-Quellcode:
 Result := (Size >= 4)
      and (p[1] = ':') and (P[2] = '\') and (P[3] = '\')
      and (P[0] >= 'C') and (P[0] <= 'Z');
Der Ausdruck prüft einfach, ob nach der Entschlüsselung etwas vorliegt was mit "C:\\" oder mit "D:\\" oder mit ... oder mit "Z:\\" anfängt.

Es stellte sich aber heraus, dass die Funktion zu ungenau war. Es gab viele "False Positives" und viel Adrenalin wurde bei den Programmierern verschwendet die an einer Brute-Force-Methode arbeiten.

Deshalb habe ich eine genauere Funktion geschrieben:
Delphi-Quellcode:
function IsCatalogDecrypted(P: PAnsiChar; Size: DWORD): Boolean;

  function HasDriveSignature: Boolean;
  begin
    Result := (Size >= 4)
      and (p[1] = ':') and (P[2] = '\') and (P[3] = '\')
      and (P[0] >= 'C') and (P[0] <= 'Z');
  end;

  function HasValidCharacters: Boolean;
  var
    n: DWORD;
  begin
    Result := True;
    for n := 0 to Size - 1 do
      if ((P[n] < #32) and not (P[n] in [#10, #13]))
        or (P[n] in ['*', '?', '<', '>', '|', '"', '/', #127]) then
      begin
        Result := False;
        break;
      end
  end;

  function IsRndString(s: string; minlen, maxlen: Integer): Boolean;
  const // Thanks Martin!
    A = ['q', 'e', 't', 'u', 'o', 'a', 'd', 'g', 'j', 'l', 'x', 'v', 'n', 'p',
      'f', 'r', 'y', 's', 'Q', 'E', 'T', 'U', 'O', 'A', 'D', 'G', 'J', 'L', 'X',
      'V', 'N'];
  var
    i, l: Integer;
  begin
    l := length(s);
    Result := (l >= minlen) and (l <= maxlen);
    if Result then
      for i := 1 to l do
        if not (s[i] in A) then
        begin
          Result := False;
          Break;
        end;
  end;

  function HasCatalogFormat: Boolean;
  var
    sl: TStringList;
    i: Integer;
  begin
    sl := TStringlist.create;
    sl.text := copy(p, 1, size);
    result := sl.count mod 4 = 0;
    if result then
    begin
      i := 0;
      while i < sl.count - 4 do
      begin
        Result := (ExtractFilePath(sl[i]) = ExtractFilePath(sl[i + 1]))
          and IsRndString(ExtractFilename(sl[i + 1]), 14, 21) //Neuname
          and IsRndString(sl[i + 2], 30, 61) //Passwort
          and (sl[i + 3] = ''); //Leerzeile
        if not Result then
          break;
        inc(i, 4);
      end;
    end;
    sl.free;
  end;

begin
  Result := HasDriveSignature and HasValidCharacters and HasCatalogFormat
end;
Damit gab es soweit ich weiß noch keine False Positives - aber leider auch noch kein True Positive.
Die genauere Funktion prüft sehr viel mehr ab. Es wird z.B: geprüft ob die Passwörter nur aus genau den Zeichen bestehen, die Hofmar im Beitrag #181 ermittelt hat.


Viele Grüße
Marcu
Angehängte Dateien
Dateityp: zip Decrypter5.zip (120,8 KB, 11x aufgerufen)
Dateityp: zip SampleDatafiles.zip (982,9 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat