Frage zu c++ (dll injection)

08/23/2010 18:46 Nulpe123#1
Hallo,

ich habe es bereits geschafft eine selbstgeschriebene .dll zu injecten. Nun habe ich allerings das Problem, dass sich der erzeugt Thread nach dem automatischen Aufruf der Funktion
Code:
"int __stdcall DllMain(_In_ void * _HDllHandle, _In_ unsigned _Reason, _In_opt_ void * _Reserved)"
wieder schließt.
Ich möchte den Thread gerne so umprogrammieren, dass er jede Sekunde einmal ein paar Adressen aus dem injizierten Prozess ausliest (wie macht man das eigentlich? Mit Read & WriteProcessmemory?) und bei einer Veränderung dieser Adressen darauf reagiert. So möchte ich die Kommunikation meines Hauptprogramms, dass die Values der Adressen ändert, und dem Thread herstellen (bessere Vorschläge nehme ich natürlich gerne entgegen :)).
Ein Versuch soetwas mit einer Dauerschleife hinzubekommen ist leider gescheitert, da sich dann der ganze injizierte Prozess aufhängt. Wie könnte ich soetwas also am besten bewerkstelligen?

Bitte verwendet in euren Antworten so viele code Beispiele wie möglich, da ich mich in c++ wirklich nicht auskenne, beim Schreiben der .dll allerdings nicht drumherum komme...
08/23/2010 21:27 wurstbrot123#2
memcpy / memcmp - Createthread
08/23/2010 22:46 Nulpe123#3
Quote:
Originally Posted by wurstbrot123 View Post
memcpy / memcmp - Createthread
ich denke mal du meinst damit jetzt, wie ich Values aus dem Prozess auslesen kann, oder?

Mein Hauptproblem ist es aber immernoch den erstellten Thread aufrecht zu erhalten und mit ihm zu kommunizieren. Alle Möglchkeiten dies zu bewerkstelligen enden allerdings damit, dass der injizierte Prozess einfriert.
Da er Funktionen im injizierten Prozess aufrufen soll, muss ich him irgendwie die Funktionsnamen und Eingabeparameter "senden".
08/23/2010 23:02 wurstbrot123#4
Hast du dir überhaupt die Funktionen angeguckt ?
CreateThread -->
In den neu erstellten Thread fügst du dann deine Schleife ein, dann wird
der Prozess nicht mehr eingefroren da dann dein Code in einem
anderen Thread läuft.
08/24/2010 00:04 Nulpe123#5
Quote:
Originally Posted by wurstbrot123 View Post
Hast du dir überhaupt die Funktionen angeguckt ?
CreateThread -->
In den neu erstellten Thread fügst du dann deine Schleife ein, dann wird
der Prozess nicht mehr eingefroren da dann dein Code in einem
anderen Thread läuft.
Wird nicht schon bei der Injektion, also beim injizieren der .dll, ein neuer Thread erzeugt? Mit OllyDbg kann man den sogar sehen, wie er kurz anspringt und wieder weg ist.
08/24/2010 00:17 MrSm!th#6
1. memcpy/memset ist nur notwendig, wenn es über int/float Größe hinaus geht, ansonsten, wenn es simple 4 Bytes Adressen sind, änderst du die einfach per Pointer.

2. Deine Idee ist Quatsch, man kommuniziert mit anderen Prozessen via. FileMappings, Pipes, Windows Messages oder auch mal Winsock
08/24/2010 00:22 12354#7
Quote:
Originally Posted by Nulpe123 View Post
Wird nicht schon bei der Injektion, also beim injizieren der .dll, ein neuer Thread erzeugt? Mit OllyDbg kann man den sogar sehen, wie er kurz anspringt und wieder weg ist.
Ja es wird ein neuer Thread erzeugt, trotzdem sollte man diesen eigentlich wenig/nicht (oder nur zum Erzeugen eines eigenen Threads) verwenden.

Wenn du den Thread nämlich zu viel machen lässt, kann das zu Problemen führen(hab aber vergessen warum/welche Probleme :P ; glaubs mir einfach)
08/24/2010 00:45 wurstbrot123#8
Wüsste nicht welche wäre mal Intressant zu wissen. Für gleichzeitige
Zugriffe ( falls diese sein müssen ) gibt es ja CRITICAL_SECTION ( s ) :p
08/24/2010 02:08 MrSm!th#9
Zb. dass der Prozess anhält.
Injectoren pausieren den Prozess für gewöhnlich so lange, bis die DllMain returnt o.ô
Sieht man zb. wenn man ne Message Loop (zb. durch nen Dialog, den man erstellt) oder irgendne andere Schleife in der DllMain hat, geht das Spiel einfach nicht weiter, der Dialog zwar schon, aber es bringt nicht viel :D

Außerdem gehören in Einstiegspunkte wie WinMain, DllMain, main immer nur Initialisierungen, der restliche Code kommt raus da, guter Stil undso ;O

Quote:
Wird nicht schon bei der Injektion, also beim injizieren der .dll, ein neuer Thread erzeugt? Mit OllyDbg kann man den sogar sehen, wie er kurz anspringt und wieder weg ist.
Klar, aber wenn du keine Schleife in der DllMain hast (was ich dir auch nicht empfehle) ist doch klar, dass der Thread direkt wieder verschwindet.
08/24/2010 13:59 wurstbrot123#10
Quote:
Originally Posted by MrSm!th View Post
Zb. dass der Prozess anhält.
Habe wohl beim post von 12345 einiges überlesen :> Das ist mir natürlich alles klar deswegen habe ich ihm ja auch die CreateThread funktion gepostet ^^
09/20/2010 18:29 Nulpe123#11
Folgendes Problem:

Ich möchte in meiner DllMain-Funktion nun einen neuen Thread starten. Das ganze sieht wie folgt aus:

PHP Code:
HANDLE thread;

int __stdcall DllMain(_In_ void _HDllHandle_In_ unsigned _Reason_In_opt_ void _Reserved)
{
    
thread CreateThread(NULL0ThreadFunc,NULL,0,NULL);
}

DWORD WINAPI ThreadFunc(LPVOID data)
{
    
//hier ist jetzt die Dauerschleife mit einer Sleep-Funktion, die das ganze etwas abbremsen soll

Allerdings meckert mein Compiler, dass er die ThreadFunc nicht findet!

error C2065: 'ThreadFunc': nichtdeklarierter Bezeichner

Wie kann ich die Funktion ThreadFunc für DllMain sichtbar machen?
09/20/2010 18:37 ms​#12
Funktionsprototyp oben rein schreiben. ;O
09/20/2010 18:43 Nulpe123#13
Edit: Nun habe ich in der Funktion ThreadFunc eine Messagebox hinzugefügt und oben den Funktionsprototypen deklariert:
PHP Code:
DWORD WINAPI ThreadFunc(LPVOID);

HANDLE thread;

int __stdcall DllMain(_In_ void _HDllHandle_In_ unsigned _Reason_In_opt_ void _Reserved)
{
    
thread CreateThread(NULL0ThreadFunc,NULL,0,NULL);
    
MessageBox(NULLTEXT("Ich öffne mich immer wieder"), NULLMB_OK);


DWORD WINAPI ThreadFunc(LPVOID data)
{
   
MessageBox(NULLTEXT("Thread gestartet"), NULLMB_OK);

Wenn ich jetzt allerdings meine DLL injecte erscheint die Messagebox nicht und das injizierte Programm stürzt ab (schließt sich einfach). Wenn ich zudem in der DllMain eine Messagebox hinzufüge scheint die Funktion DllMain eine Art Dauerschleife zu produzieren, denn immer wenn ich auf OK klicke öffnet sich die Messagebox erneut.
Was könnte mein Problem sein?
09/20/2010 19:11 Tyrar#14
ich benutze lieber
SuspendThread, GetThreadContext, SetThreadContext, ResumeThread!
mit SetThreadContext wird das EIP register auf eine neue adresse gelegt (EIP = InstructionPointer, (64 bit sollte RIP sein?))
09/20/2010 19:21 Nulpe123#15
Quote:
Originally Posted by HeavyHacker View Post
ich benutze lieber
SuspendThread, GetThreadContext, SetThreadContext, ResumeThread!
mit SetThreadContext wird das EIP register auf eine neue adresse gelegt (EIP = InstructionPointer, (64 bit sollte RIP sein?))
Wie würde dafür denn ein Implementierungsbeispiel aussehen? Google will mir da nichts nützliches ausspucken...