Quote:
Originally Posted by MrSm!th
Doch, klar, die BPs selbst sind threadübergreifend, nur die Exception Handler müssen für jeden Thread selbst gesetzt werden (oder halt mit VectoredExceptionHandlern).
edit:
Upps, kleiner Fehler, die BPs sind logischerweise auch threadgebunden, man setzt sie ja mit SetThreadContext.
Aber das sollte ja nicht das Problem sein, SetThreadContext kannst du einfach für jeden Thread im Prozess aufrufen und die BPs setzen.
Nur die UnhandledExcptionHandler lassen sich halt nur für den eigenen Thread setzen, aber dafür gibts ja wie gesagt VEH.
|
Dann sollte das ja eig. so funktionieren:
Code:
DWORD dwBreakPoint=0x00401000;
LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo)
{
if(ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP)
{
if((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress == dwBreakPoint)
{
MessageBox(0,"lol",0,0);
//ExceptionInfo->ContextRecord->Eip = dwBreakPoint+1;
return EXCEPTION_CONTINUE_EXECUTION;
}
}
return EXCEPTION_CONTINUE_SEARCH;
}
HANDLE AllThread(DWORD dwPid, CONTEXT ctx)
{
HANDLE hTool32 = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if(hTool32 != INVALID_HANDLE_VALUE)
{
THREADENTRY32 thread_entry32;
thread_entry32.dwSize = sizeof(THREADENTRY32);
FILETIME exit_time, kernel_time, user_time;
FILETIME creation_time;
FILETIME prev_creation_time;
prev_creation_time.dwLowDateTime = 0xFFFFFFFF;
prev_creation_time.dwHighDateTime = INT_MAX;
HANDLE hMainThread = NULL;
if(Thread32First(hTool32, &thread_entry32))
{
do
{
if(thread_entry32.th32OwnerProcessID == GetCurrentProcessId())
{
HANDLE hThread = OpenThread(THREAD_SET_CONTEXT | THREAD_GET_CONTEXT | THREAD_QUERY_INFORMATION,
FALSE, thread_entry32.th32ThreadID);
SetThreadContext(hThread, &ctx);
CloseHandle(hThread);
}
thread_entry32.dwSize = sizeof(THREADENTRY32);
} while(Thread32Next(hTool32, &thread_entry32));
CloseHandle(hTool32);
return hMainThread;
}
}
}
void SetBP()
{
//HANDLE MainThread = OpenMainThread(GetCurrentProcessId());
AddVectoredExceptionHandler (1,ExceptionFilter);
CONTEXT ctx = {CONTEXT_DEBUG_REGISTERS};
ctx.Dr6 = 0;
ctx.Dr1 = dwBreakPoint;
ctx.Dr7 = 0x000004; // or Dr7, 00 00 00 00 11 01 00 00 00000000 0 0 0 0 0 1 0 0 b
AllThread(GetCurrentProcessId(), ctx);//setzt in allen threads den context
//CloseHandle(MainThread);
}
DWORD WINAPI MainThread(LPVOID n)
{
while(1)
{
if(GetAsyncKeyState(VK_F1)&1)
{
//---------------------------------- BP on Access test------------------------------
BYTE buffer = 0;
ReadProcessMemory(GetCurrentProcess(), (LPVOID)dwBreakPoint, &buffer, 1, 0);
if((BYTE)(buffer) == 0x55)
MessageBox(0,0,0,0);
//---------------------------------- BP on execute test------------------------------
HWND c = (HWND)0x00230A82;
char a[] = "12345";
DWORD b = 5;
__asm
{
push a
push b
push c
call [dwBreakPoint]
}
}
}
return 0;
}
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(GetModuleHandle(NULL));
bla = CreateThread(0,0,&MainThread,0,0,0);
SetBP();
break;
case DLL_PROCESS_DETACH:
break;
}
return true;
}
tut es aber nicht. Wenn ich aus dem Access bp jetzt nen execute mache funkt es wieder wenn vom programm drauf zu gegriffen wird von meiner dll funktioniert es aber nicht.