DLL- plus Code-Injection Fehler



  • Hallo zusammen,

    mein Programm hat eine DLL mit einer exportierten Funktion, die es in andere Programme injected, da die Funktion in der DLL nicht von außen auf einen Prozess losgelassen werden kann. Das Injecten der DLL per CreateRemoteThread funktioniert soweit wunderbar, war auch nichts neues. Nur der Code-Injection Teil bereitet mir jetzt seit einigen Tagen Kopfschmerzen. Die Funktion in der DLL muss vom Loaderprogramm aus mit einem Parameter gefüttert werden, der alle Informationen, die für die Funktion wichtig sind, bereithält.

    extern "C" __declspec(dllexport) __stdcall void searchSigs(remoteinfo cRemoteInfo);
    

    Die Funktion meiner DLL rufe ich auch wieder per CreateRemoteThread im anderen Programm auf. Das funktioniert soweit auch noch. Wenn die Funktion nun aber auf die Werte aus dem Parameter zugreifen möchte, stürzt das Opferprogramm ab. Ich nehme an, dass irgendwas beim Schreiben in den anderen Prozess schief geht. Dabei wird eine Variable vom Typ remoteinfo im Hauptprogramm erzeugt und dann in das Opferprogramm geschrieben.

    class remoteinfo
    {
    public:
    	remoteinfo(bool nstopfound, vector<sig> nSig, vector<modules> nModule);
    	bool stopfound;
    	vector<sig> vSig; //andere Klasse, sollte aber nicht wichtig für das Problem sein
    	vector<modules> vModule; //andere Klasse, sollte aber nicht wichtig für das Problem sein
    };
    

    Wenn ich nach dem Codeinjecten die Speicherstellen von Hauptprogramm und Opferprogramm vergleiche, dann stimmen sie überein. Beim Injecten scheint also kein Fehler aufgetreten zu sein und trotzdem muss an dieser Stelle der Fehler liegen. Gibt es noch andere Möglichkeiten zu überprüfen, ob meine Variable korrekt in den anderen Prozess geschrieben wurde? Oder gibt es noch andere Stellen an denen ich nach Fehlern suchen kann?

    Edit: ich habe die Funktion in der DLL jetzt mal durch ein Messagebox ersetzt, die mir die Speicheradresse der übergebenen Variablen ausgibt. Außerdem habe ich noch den Funktionsaufruf dahingehend verändert, dass jetzt ein Pointer erwartet wird. Das wird in dem Fall doch auch von CreateRemoteThread übergeben. (oder?) Die DLL gibt mir nun 0xADFFBC aus. Wenn ich aber in meiner Hauptprogramm nachschaue, welchen Speicherbereich VirtualAllocEx reserviert hat, dann ist das 0xAE0000. Was passt da nicht?!

    greetz KN4CK3R


  • Mod

    Du kannst unmöglich STL Objekte in den anderen Prozess übertragen. Wer allokierte die den?
    Du musst PODs verwenden!



  • Vectoren können also nicht übergeben werden? Könnte ich aber eine extra Funktion machen, der ich jeweils ein Object übergebe und die mir dann in der anderen Anwendung einen Vector o.ä. füllt? Oder wie bekomme ich meine Vectoren sonst noch in den anderen Speicherbereich?

    greetz KN4CK3R


  • Mod

    Gar nicht als vector.
    Mach Dir doch mal klar, dass dies abhängig wäre von dem Memory Manager.
    Übertrage als POD!



  • aber wie soll ich ein einzelnen Element übertragen, wenn die Funktion in der DLL aber mehrere braucht?

    greetz KN4CK3R


  • Mod

    Das habe ich bereits mehrfach geschrieben: Als POD! Einfach als Speicherblock, den Du allokierst und in den Du die entsprechende Strzuktur überträgst.

    Mach Dir doch mal bitte klar, dass Du Prozessübergreifend eben nicht new/malloc verwenden kannst. Das benötigen aber STL Container! Du musst auf Strukturen zurückgreifen, die ohne Pointer und extra Allokation auskommen.

    PS: Ich habe sowieso schon den Fehler gemacht mich an solch einen Injection-Thread zu beteiligen, was ich sonst tunlichst meide. Mein Fehler, und Tschüss.



  • warum so voreingenommen gegenüber Injection? Muss ja nicht automatisch immer zum Negativen benutzt werden...

    Danke trotzdem für den Denkanstoß, funktioniert jetzt alles richtig.

    greetz KN4CK3R



  • KN4CK3R schrieb:

    warum so voreingenommen gegenüber Injection? Muss ja nicht automatisch immer zum Negativen benutzt werden...

    Word. Ich zB. erstelle mit dieser Technik gerade ein umfangreiches serverseitiges AntiCheat-Tool für einen Gameserver.


Anmelden zum Antworten