PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Builder und Stub in C++/CLR



Crypt
17.02.2010, 06:39
Hallo!

Ich hab da mal ne Frage...

Ich denke ich weiss was ne Stub ist... Ne datei die von einer anderen als Abbild benutzt wird und die bestimmte Methoden bereitstellt, richtig?

Aber beim Proggen verstehe ich das Prinzip nicht, wie kann man in C++/CLR (wenns sein muss auch C#) sowas realisieren?

Hab schon viel gesucht aber finde hauptsächlich Sources für VB und Delphi, ganz wenig für Win32...

Könnte mir jemand auch das Prinzip mal näherbringen?! Ich versteh nicht wie jetzt das fertige Programm seine Fähigkeiten herhat... sind die schon in der Stub oder werden die im Builder generiert? Gibts da vielleciht ein gutes Tut um das ganze zu verstehen oder wie kann ich mir auch sowas machen wie $PoisonIvy$ mit seinem Phischer-Prog wo er aus einem Builder und einer Stub 10 verschiedene Programme generiert?

Also wenn jemand helfen kann würd ich mich freuen!

Gaara
17.02.2010, 09:45
nun die wohl einfachste methode ist es die stub "betriebsbereit" zu programmieren, d.h. alles was sie können muss hat sie bereits in sich, alles was der builder dann zum schluss macht sind die benötigten infos wie z.b. port, IP, melt server true/false usw. ans ende der datei hängt. die stub ließt diese dann beim start aus und fertig. dass wäre die vorgehensweise, nen source kann ich dir leider auf nicht liefern :/

zao
17.02.2010, 13:03
Hey!
Das Prinzip nachdem ein Builder arbeitet, hat Gaara ja schon erklärt. Es läuft im Allgemeinen so ab, dass die Stub fertig programmiert wird und so, dass sie die nötigen variablen Informationen aus sich selbst ausließt. Es gibt verschiedene Möglichkeiten diese Informationen in die Stub zu packen. Eine wäre wie Gaara bereits beschrieben hat, sie ans Ende der Stub zu schreiben. Die Methode die ich dir gleich zeigen werde, ist die meiner Meinung nach eleganteste. Ich schreibe die Informationen ganz einfach in die Resourcen der Stub.

Builder :


struct Parameters
{
char cData[128];
int iData;
}
MyData;


void WriteToFile()
{
CopyFile("SomeDLL.dll", "ExeFile.exe", true);

void* Update = BeginUpdateResourceA("ExeFile.exe", false);

UpdateResourceA(Update, MAKEINTRESOURCEA(0x01000), MAKEINTRESOURCEA(0x011), 0, (void*)&MyData, sizeof(MyData));
EndUpdateResourceA(Update, false);
}

Die struct Parameters enthält die nötigen Informationen, CopyFile kopiert die als DLL getarnte Stub und speichert sie als EXE. Im Folgenden schreibe ich die Informationen mit UpdateResource in die Stub.

Stub :


struct Parameters
{
char cData[128];
int iData;
};

void UpdateUserdefinedParameteres(Parameters **pParams)
{
HINSTANCE__* Base = GetModuleHandleA(0);
HRSRC__ *ResInfo;
ResInfo = FindResourceA(Base, MAKEINTRESOURCEA(0x011), MAKEINTRESOURCEA(0x01000));

*pParams = (Parameters*)LoadResource(Base, ResInfo);

if((long)*pParams <= 0)
{
MessageBoxA(0,"No Data found","Stub",MB_ICONERROR);
ExitProcess(0);
}
return;
}

Ganz oben im Code findest du die struct Parameters wieder, in diese lade ich mittels LoadResource die Informationen. Jetzt ist die struct mit den Informationen gefüllt, welche nun in der Stub verwendet werden können.

Gruß

Crypt
17.02.2010, 21:52
...ans ende der datei hängt. die stub ließt diese dann beim start aus...
danke für die erklärungen das macht schon einiges klarer! wenn ich es so mache hat dann zb. der generierter server EOF dateien wie bifrost und benötigt spezielle crypter?
Was ich auch nicht so richtige Verstehe ist wie schreibe ich ein Programm das ein Programm in ein anderes Programm schreibt^^
Könnt ihr mir mal die gängingen Klassen, Methode usw. nennen vll auch im hinsicht auf späteres crypten oder um die stub fud zu machen, wenn es denn so ist wie bei bifi wenn ich das jetzt richtig verstanden habe...





struct Parameters
{
char cData[128];
int iData;
}
MyData;


void WriteToFile()
{
CopyFile("SomeDLL.dll", "ExeFile.exe", true);

void* Update = BeginUpdateResourceA("ExeFile.exe", false);

UpdateResourceA(Update, MAKEINTRESOURCEA(0x01000), MAKEINTRESOURCEA(0x011), 0, (void*)&MyData, sizeof(MyData));
EndUpdateResourceA(Update, false);
}

vielen dank für das gute beispiel! das prinzip ist mir jetzt klar geworden aber einige sachen verstehe ich noch nicht...

Sagen wir mal ich bastel ein Programm was Daten auf ein ftp hochlädt und packe einen Builder hinzu um die ftp Daten zu übergeben, dann muss ich im Builder die gleichen Variablen und Objekte benutzen die ich auch in der Stub benutze richtig?
Oder sagen wir so: Woher weiss denn die Stub was Sie mit den übergeben daten machen muss bzw wie sag ich der Stub wo die Informationen liegen?

[QUOTE]Die struct Parameters enthält die nötigen Informationen, CopyFile kopiert die als DLL getarnte Stub und speichert sie als EXE. Im Folgenden schreibe ich die Informationen mit UpdateResource in die Stub.

mmh also muss ich erst mal lernen eine DLL zu schreiben oder kann ich da auch einfach den Code wie in eine .cpp Datei schreiben?

Auf jede Fall schonmal vielen Danke für eure Hilfe, Hab gestern auf OpenSC ne Source gefunden aber leider für Win32 wieder nicht für CLR...

Sawyer
17.02.2010, 22:00
Sagen wir mal ich bastel ein Programm was Daten auf ein ftp hochlädt und packe einen Builder hinzu um die ftp Daten zu übergeben, dann muss ich im Builder die gleichen Variablen und Objekte benutzen die ich auch in der Stub benutze richtig?
Nicht unbedingt, ein Builder schreibt ja nur die Informationen an die Stub. Stelle dir die Stub als fertiges Programm vor, welches nur noch nicht konfiguriert ist. Ein einfacher Builder schreibt (wie bereits erwähnt) die Daten ans ende der Datei. Die Stub wird so geschrieben, das sie diese Daten von sich selbst auslesen kann.


Woher weiss denn die Stub was Sie mit den übergeben daten machen muss bzw wie sag ich der Stub wo die Informationen liegen?
Wie gesagt, das musst du der Stub vorgeben.

Hier findest du zwei Beispiele wie man in C# einen Builder und einen Binder schreibt. Da du das ganze auf Basis der CLR schreiben willst, solltest du das ganze gut nachvollziehen können.
http://free-hack.com/showthread.php?t=36227
http://free-hack.com/showthread.php?t=47735

MfG, Sawyer

GregorSamsa
17.02.2010, 23:18
Eine Alternative ist, die Stub an festkodierten Stellen zu patchen.
Das heisst (der einfache Weg) du hast z.B. 256 Byte für Host, anfangs belegt mit XXXXX (x256) - die werden vom Builder durch den Hostnamen ersetzt. Das ist einfach und funzt auch!

Hier ein kleines Beispiel von mir:
http://rapidshare.com/files/352116866/simpleStub.rar.html
http://ul.to/mmyl0j

zao
18.02.2010, 12:48
Sagen wir mal ich bastel ein Programm was Daten auf ein ftp hochlädt und packe einen Builder hinzu um die ftp Daten zu übergeben, dann muss ich im Builder die gleichen Variablen und Objekte benutzen die ich auch in der Stub benutze richtig?
Oder sagen wir so: Woher weiss denn die Stub was Sie mit den übergeben daten machen muss bzw wie sag ich der Stub wo die Informationen liegen?

Genau, das musst du, bzw solltest du! Für FTP-Daten würde das dann ungefähr so aussehen.

struct ftpdata
{
char Host[256];
char Username[256];
char Password[256];
}

Diese struct muss nun sowohl in der Stub als auch im Builder deklariert. Ich versuche das mal anschaulich zu erklären. Stell dir vor die struct ist eine Form in die du Sand gibst. Der Sand sind die Informationen. Jetzt kippst du den Sand aus der Form, die Informationen sind wild durcheinander gestreut. Durch diesen cast hier in der Stub:

*pParams = (Parameters*)LoadResource(Base, ResInfo);
Werden die Informationen wieder in die Form gepresst und somit verwendbar gemacht.

So und woher weiß die Stub jetzt wo die Informationen liegen? Wir wissen, dass sie auf jeden Fall in den Resourcen liegen, deshalb programmieren wir sie dementsprechend. Jetzt stellt sich noch die Frage: Wo genau?

Das hier macht der Builder:

UpdateResourceA(Update, MAKEINTRESOURCEA(0x01000), MAKEINTRESOURCEA(0x011), 0, (void*)&MyData, sizeof(MyData));

er schreibt die struct an Position 0x01000 0x011.

Die Stub ließt die struct wieder an genau der selben Stelle aus, wie du hier im Snippet sehen kannst:


HRSRC__ *ResInfo;
ResInfo = FindResourceA(Base, MAKEINTRESOURCEA(0x011), MAKEINTRESOURCEA(0x01000));



mmh also muss ich erst mal lernen eine DLL zu schreiben oder kann ich da auch einfach den Code wie in eine .cpp Datei schreiben?

Auf jede Fall schonmal vielen Danke für eure Hilfe, Hab gestern auf OpenSC ne Source gefunden aber leider für Win32 wieder nicht für CLR...

Nein Quatsch, das musst du nicht. Die DLL ist nur die kompilierte Stub, also im exe-Format. Ich hab nur Endung geändert um die Stub zu tarnen. Dann wird die angebliche DLL kopiert, als exe gespeichert und dann die informationen drangehangen.

Gruß