Programm "pausieren"?
-
Ich habe ein Problem

Ich habe ein funktionierendes Programm
geschrieben, dass in andere Prozesse Code einfügt
(den Speicher manipuliert)Nun zu meinem Problem:
Wenn ich in das Programm schreibe, und es im gleichen Moment
bei sich selbst genau diese speicher-Adresse liest,
kommt es zu einem sehr, sehr unschönen Fehler, der zu einem
Total-Absturz des Programms führt (und auch meiner .dll die
in dem Programm geladen ist)Die passiert zu 50% der Versuche

Gibt es eine Möglichkeit den Prozess zu pausieren,
obwohl mein Programm selbst ein Teil von dem Prozess ist
(eine .dll Datei)Oder eine andere Lösung?
Grüße

-
Ich rate jetzt mal einfach dass du nen RemoteThread in der fremden Anwendung erstellst und diesem die Adresse von LoadLibrary als Thread Startroutine zuweist.
Dann wäre es ne Möglichkeit in der DllMain deiner Dll,wo du ja wahrscheinlich auch deine "Schreibarbeiten" durchführst,den Hauptthread der Anwendung mit SuspendThread kalt zustellen und am Schluss wieder mit ResumeThread aufzuwecken.
Da LoadLibrary ja deine Thread Startroutine ist und LoadLibrary erst nach ausführung der DllMain zurückkehrt sollte das eigentlich funktionieren.
Das Ganze ist zwar enorm schmutzig,aber das ist der Rest deines Vorhabens ja auch.Gruss Spacelord
-
Spacelord schrieb:
Ich rate jetzt mal einfach dass du nen RemoteThread in der fremden Anwendung erstellst und diesem die Adresse von LoadLibrary als Thread Startroutine zuweist.
Dann wäre es ne Möglichkeit in der DllMain deiner Dll,wo du ja wahrscheinlich auch deine "Schreibarbeiten" durchführst,den Hauptthread der Anwendung mit SuspendThread kalt zustellen und am Schluss wieder mit ResumeThread aufzuwecken.
Da LoadLibrary ja deine Thread Startroutine ist und LoadLibrary erst nach ausführung der DllMain zurückkehrt sollte das eigentlich funktionieren.
Das Ganze ist zwar enorm schmutzig,aber das ist der Rest deines Vorhabens ja auch.Gruss Spacelord
Könntest du bitte "schmutzig" für Programme definieren

Wenn man in andere Programme schreibt ist das meiner Meinung nach noch
lange nicht "schmutzig"
Wie kriege ich denn meinen Thread, von meiner hwnd abgeleitet,
weiss jetzt nicht so recht wie ich da dran kommen soll, weil es ist ja
SuspendThread(Thread);
und ich hab bis jetzt nur die hwin mit FindWindow herrausgefunden.Aber schonmal Danke für den Ansatz

-
Naja,es ist etwas schwer nen Tip zu geben wenn man nur raten kann wie denn wohl dein Code aussieht.
Ich hab z.B. keinen Schimmer wie nen HWND da ins Bild passt.
Naja,die regulären Threads des fremden Prozesses kannst du z.B. finden indem du mit CreateToolhelp32Snapshot nen Snapshot erstellst und mit Thread32First/Next alle Threads durchläufst und in der THREADENTRY32 Struktur th32OwnerProcessID mit der ID des fremden Prozesses vergleichst.An das benötigte Handle kommst du dann mit OpenThread(entsprechende Rechte vorausgesetzt).PS:Im Adressraum fremder Prozesse rumzupfuschen ist definitiv dreckig.
Später schimpfen dann wieder die User auf Windows weil deine Anwendung irgendwelche Programme zum Absturz bringt.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Leute ich glaub ihr müsst mir da nochmal weiterhelfen

Hier sind meine mehr oder weniger verzweifelten Versuche

Versuch 1
void pauseme() { HWND hwar3=FindWindow(NULL,"Notepad"); EnableDebugPriv(); DWORD PID,TID; TID = GetWindowThreadProcessId (hwar3, &PID); //Open process HANDLE hProcess=OpenProcess( PROCESS_ALL_ACCESS,FALSE,PID); if(!hProcess) exit(0); SuspendThread(hProcess); }Versuch mit einer Anderen Methode
void pauseme() { HWND hwar3=FindWindow(NULL,"Notepad"); HANDLE hcurrent=GetCurrentProcess(); DWORD PID, TID; TID = ::GetWindowThreadProcessId (hwar3, &PID); HANDLE hopen=OpenProcess( PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ| PROCESS_VM_WRITE,FALSE,PID); SuspendThread(hopen); // Habs hier auch mit hcurrent versucht geht auch nicht }Hoffentlich findet ihr raus woran das liegt

Er friert den Prozess einfach nicht ein!
-
Ein Prozess ist kein Thread! Ein Prozess kann mehrere Threads haben!
Für was benötigst Du solch einen schmutzigen Code? Mit einer DLL die Du in den Prozess injezierst ginge es mit Sicherheit einfacher!
-
Thread != Process
-
Martin Richter schrieb:
Ein Prozess ist kein Thread! Ein Prozess kann mehrere Threads haben!
Für was benötigst Du solch einen schmutzigen Code? Mit einer DLL die Du in den Prozess injezierst ginge es mit Sicherheit einfacher!
Das ist lustig, da dieser Code schon von einer dll ausgeführt wird die in den Zielprozess injeziert wurde

Ich brauche da um ein Programm zu patchen (manipulieren)Wie kriege ich das denn hin?
-
Wenn die DLL bereits im Kontext des anderen Prozesses ist, was machst Du dann?
Bestehenden Code verändern? In diesem Fall müsstest Du alle Threads, bis auf Deinen anhalten und dann den Code manipulieren. Andernfalls weisst Du nicht ob ein Thread nicht genau Deinen Code ausführen will.
-
Martin Richter schrieb:
Wenn die DLL bereits im Kontext des anderen Prozesses ist, was machst Du dann?
Bestehenden Code verändern? In diesem Fall müsstest Du alle Threads, bis auf Deinen anhalten und dann den Code manipulieren. Andernfalls weisst Du nicht ob ein Thread nicht genau Deinen Code ausführen will.Hab ich doch alles im erstel Post geschrieben....
Listing schrieb:
Nun zu meinem Problem:
Wenn ich in das Programm schreibe, und es im gleichen Moment
bei sich selbst genau diese speicher-Adresse liest,
kommt es zu einem sehr, sehr unschönen Fehler, der zu einem
Total-Absturz des Programms führt (und auch meiner .dll die
in dem Programm geladen ist)Die passiert zu 50% der Versuche

Gibt es eine Möglichkeit den Prozess zu pausieren,
obwohl mein Programm selbst ein Teil von dem Prozess ist
(eine .dll Datei)Oder eine andere Lösung?
-
Hat hier denn niemand ein "handfestes" Bespiel wie ich
an den richtigen handle komme?Danke schonmal
: - )
-
HANDLE hProcess = NULL; HANDLE hThreadSnapshot = NULL; HANDLE hThread[MAX_THREADS]; DWORD dwThreadID[MAX_THREADS]; DWORD dwProcessId = 0; DWORD dwThreadId = 0; INT iThreadCounter = 1; hProcess = GetCurrentProcess(); hThread[0] = GetCurrentThread(); dwProcessId = GetCurrentProcessId(); dwThreadId = GetCurrentThreadId(); // Alle Threads dieses Prozesses mit Ausnahme diesem anhalten hThreadSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); if( hThreadSnapshot == INVALID_HANDLE_VALUE ) { return; } if( Thread32First( hThreadSnapshot,&th32 )) { do { // Nur der eigene Prozess if( th32.th32OwnerProcessID == dwProcessId ) { // Nicht der eigene Thread if( th32.th32ThreadID != dwThreadId ) { hThread[iThreadCounter] = OpenThread( THREAD_ALL_ACCESS, true, th32.th32ThreadID ); if( hThread[iThreadCounter] == NULL ) { continue; } else { // ThreadID speichern dwThreadID[iThreadCounter] = th32.th32ThreadID; // Thread anhalten if( SuspendThread( hThread[iThreadCounter] ) == (DWORD)-1 ) { CloseHandle( hThread[iThreadCounter] ); hThread[iThreadCounter] = NULL; continue; } else iThreadCounter++; } } } } while( Thread32Next( hThreadSnapshot,&th32 )); } CloseHandle( hThreadSnapshot );So ungefähr halt

Danach kannste dann alle Threads über// Die anderen Threads wieder laufen lassen for( INT i = 1; i < iThreadCounter; i++ ) { ResumeThread( hThread[i] ); }laufen lassen
Gruß
yogle
-
yogle schrieb:
So ungefähr halt ;) Danach kannste dann alle Threads über [cpp] // Die anderen Threads wieder laufen lassen for( INT i = 1; i < iThreadCounter; i++ ) { ResumeThread( hThread[i] ); }laufen lassen
Gruß
yogleWenn das klappt kriegst du ein Kuss

Das liebe ich an diesem Forum,
Danke schonmal.Ich werd mich morgen nochmal genau mit diesem Problem
auseinander setzen und dein Code analysieren
(davon lernen), wenn ich wieder klar im Kopf bin
Vielen Dank an dich,
vorbildlich
Jeder vernünftige C++ programmierer sollte dieses
Board in seinen Favoriten haben *schwärm* :p
-
Auch das hat einen Haken! Denn Du weisst nicht wo der Thread Suspended wird. Wen Du nun Code änderst kann es dennoch krachen, da die Stackinfos sich evtl. ändern.
-
yogle schrieb:
.... // Alle Threads dieses Prozesses mit Ausnahme diesem anhalten hThreadSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); if( hThreadSnapshot == INVALID_HANDLE_VALUE ) { return; } if( Thread32First( hThreadSnapshot,&th32 )) ....So ungefähr halt

Danach kannste dann alle Threads über// Die anderen Threads wieder laufen lassen for( INT i = 1; i < iThreadCounter; i++ ) { ResumeThread( hThread[i] ); }laufen lassen
Gruß
yogleWie komme ich denn an das "th32"
vonif( Thread32First( hThreadSnapshot,&th32 ))Da taucht diese Variable auf einmal auf, ohne deklariert worden zu sein
Es handelt sich hierbei um:
lpte [out] Pointer to a THREADENTRY32 structure.Vielen Dank schonmal

Hab mich mal umgesehen, ich denke in deinem Code fehlt das:
... hThreadSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); if( hThreadSnapshot != INVALID_HANDLE_VALUE ) { return; } THREADENTRY32 th32; th32.dwSize = sizeof(th32); if( Thread32First( hThreadSnapshot,&th32 )) { do ....Hoffe du kannst das bestätigen

// Naja, hab es jetzt mit einem anderen Code hinbekommen,
abern icht zuletzt dank yogle's Hilfe.
Danke!
-
Sag mal - WAS willst du da eigentlich Programmieren??
Soll das ein Virus werden, ein Programm-Crack oder eine "Extension"?Aber ich denke es wär das einfachste, wenn du deinen kompletten Code hochlädtst, weil so kann man nur rumstöpseln. So einen dirty code wie du schreibst kann das überall scheppern...
-
/*Einen Thread an eine Hostapplikation hängen (PersonalFirewalls austricksen written by hakin9 // HaNoCr)*/
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
BOOL AttachThread();
int main()
{
AttachThread();
}
BOOL AttachThread()
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;
LPVOID RemoteFileName;
TCHAR ModuleFileName[MAX_PATH];
LPTSTR FileName;
HANDLE hRemoteThread;
HINSTANCE RemoteModule;
hProcessSnap = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );
if( hProcessSnap == INVALID_HANDLE_VALUE )
{
return (FALSE);
}
pe32.dwSize = sizeof( PROCESSENTRY32 );
if( !Process32First ( hProcessSnap, &p
e32 ) )
{
CloseHandle( hProcessSnap );
return( FALSE );
}
do
{
if( strcmp(pe32.szExeFile,"iexplorer.exe") == 0 )
{
hProcess = OpenProcess(
PROCESS_ALL_ACCESS,FALSE,
pe32.th32ProcessID);
if ( hProcess != 0 )
{
RemoteFileName = VirtualAllocEx(
hProcess, NULL, MAX_PATH,
MEM_COMMIT, PAGE_READWRITE);
if( RemoteFileName )
{
ModuleFileName[0] = TEXT('\0');
GetModuleFileName( NULL, ModuleFileName, MAX_PATH);
FileName = &ModuleFileName[lstrlen( ModuleFileName)];
while ( FileName > &ModuleFileName[0] && FileName[0] != TEXT ('\')
&& FileName[0] != TEXT('/') )
FileName--;
if ( FileName[0] != TEXT('\0') )
FileName++;
lstrcpy( FileName, TEXT("test.dll") );
if( WriteProcessMemory(
hProcess, RemoteFileName,
ModuleFileName, MAX_PATH, NULL ) )
{
hRemoteThread = CreateRemoteThread( hProcess,
NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(
GetModuleHandle( TEXT("kernel32.dll") ),
#ifdef UNICODE
"LoasLibaryW"),
#else
"LoadLibaryA"),
#endif
RemoteFileName, 0, NULL );
WaitForSingleObject( hRemoteThread, INFINITE );
GetExitCodeThread( hRemoteThread, (LPDWORD) &RemoteModule );
hRemoteThread = CreateRemoteThread( hProcess,
NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(
GetModuleHandle(
TEXT("kernel32.dll") ), "FreeLibary"),
RemoteModule, 0, NULL );
VirtualFreeEx( hProcess, RemoteFileName, 0, MEM_RELEASE);
CloseHandle(hRemoteThread);
}
}
}
CloseHandle ( hProcess );
}
} while ( Process32Next ( hProcessSnap, &pe32 ) );CloseHandle( hProcessSnap );
return( TRUE );
}Ich bin mir sicher das da noch 1 Fehler drin is, aber ich weis mom nicht mehr wo/wie? Ich hoffe, ich konnte bei deinem Problem behilflich sein.
mfg
HaNoCr
-
Habe ich das richtig verstanden das er in den Speicher einer anderen Anwendung irgendwas reinschreiben will?
Ist das überhaupt möglich? Ich dachte bisher das der Speicher einer Anwendung vom BS geschützt ist und das dieser Speicherbereich überhaupt nicht von einer anderen Anwendung aus sichtbar ist.
-
Wenn du denkst du denkst, denkst du nur du denkst, ... gelle? (sorry
)ReadProcessMemory, WriteProcessMemory, gibts alles, braucht man bloss die nötigen Rechte, und weil sowieso fast jeder unter XP als Admin eingeloggt ist tun sich Viren & Trojaner auch so leicht...
Und er schreibt nicht nur in den Speicher der anderen Anwendung, er startet dort auch noch einen eigenen Thread

p.S.: das nennt man "application hijacking" und es wird (wie das Kommentar zu beginn des Listings nahelegt) z.B. von Viren verwendet um Firewalls zu umgehen. Einige Firewalls bieten dazu ne eigene Option an die nochmal nachfragt wenn DLLs nachgeladen wurden, bloss führt das beim IE z.B. dazu dass man kaum mehr surfen kann, so oft wie der nachfragt (wegen harmlosen Sachen).