Registriert seit: 20. Mai 2012
50 Beiträge
|
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
5. Aug 2012, 23: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
|