hallo!
ich möchte um einen thread von einem laufenden prozess zu öffnen die OpenThread Funktion benutzen.
da meine entwicklungsumgebung (ms visual c++ 6.0) diesen befehl nicht kennt, er aber laut online msdn auch bei win xp im kernel vorhanden ist, habe ich ihn folgendermaßen implementiert:
ferner benutze ich noch folgendes um an die thread id ran zu kommen:
meine winmain sieht nun folgendermaßen aus:
beim ausführen kommt zuerst die erste message box die mir anzeigt welche process id un welche thread id firefox hat.
danach kommt aber immer folgender fehler:
Unbehandelte Ausnahme in loadbl.exe: 0xC0000005 Access Violation
ich weiß nicht wie ich diesen befehler beheben kann.
ich möchte um einen thread von einem laufenden prozess zu öffnen die OpenThread Funktion benutzen.
da meine entwicklungsumgebung (ms visual c++ 6.0) diesen befehl nicht kennt, er aber laut online msdn auch bei win xp im kernel vorhanden ist, habe ich ihn folgendermaßen implementiert:
Code:
typedef HANDLE (*fnOpenThread)(DWORD,BOOL,DWORD);
HANDLE OpenThread(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId)
{
HINSTANCE Dll_Handle = LoadLibrary("Kernel32.dll");
if (Dll_Handle == NULL) return FALSE;
fnOpenThread Ot = (fnOpenThread)GetProcAddress(Dll_Handle,"OpenThread");
if (Ot == NULL) return FALSE;
HANDLE hThread = Ot(dwDesiredAccess, bInheritHandle , dwThreadId);
FreeLibrary(Dll_Handle);
return hThread;
}
ferner benutze ich noch folgendes um an die thread id ran zu kommen:
Code:
unsigned long GetTargetThreadIdFromProcname(char *procName)
{
PROCESSENTRY32 pe;
HANDLE thSnapshot, hProcess;
BOOL retval, ProcFound = false;
unsigned long pTID, threadID;
thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(thSnapshot == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Error: unable to create toolhelp snapshot", "Loader", NULL);
return false;
}
pe.dwSize = sizeof(PROCESSENTRY32);
retval = Process32First(thSnapshot, &pe);
while(retval)
{
if(strcmp(pe.szExeFile, procName) == 0)
{
ProcFound = true;
break;
}
retval = Process32Next(thSnapshot,&pe);
pe.dwSize = sizeof(PROCESSENTRY32);
}
CloseHandle(thSnapshot);
_asm {
mov eax, fs:[0x18]
add eax, 36
mov [pTID], eax
}
hProcess = OpenProcess(PROCESS_VM_READ, false, pe.th32ProcessID);
ReadProcessMemory(hProcess, (const void *)pTID, &threadID, 4, NULL);
CloseHandle(hProcess);
return threadID;
}
meine winmain sieht nun folgendermaßen aus:
Code:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
DWORD procid=GetTargetProcessIdFromProcname("firefox.exe");
DWORD threadid= GetTargetThreadIdFromProcname("firefox.exe");
char prinw[500];
sprintf(prinw,"firefox.exe proc id=%i threadid=%i",procid,threadid);
MessageBox(NULL,prinw,"gugg",MB_OK);
HANDLE hproc = OpenProcess((PROCESS_VM_WRITE | PROCESS_VM_OPERATION), false, procid);
HANDLE hthread = OpenThread((THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME), false, threadid);
if( hthread == NULL)
{
char erro[500];
sprintf(erro,"hthread error: %i",GetLastError());
MessageBox(NULL,erro,"null",MB_OK);return 0;}
return 0;
}
beim ausführen kommt zuerst die erste message box die mir anzeigt welche process id un welche thread id firefox hat.
danach kommt aber immer folgender fehler:
Unbehandelte Ausnahme in loadbl.exe: 0xC0000005 Access Violation
ich weiß nicht wie ich diesen befehler beheben kann.