создаю процесс с флагом CREATE_SUSPENDED. беру его контекст. по идее в CONTEXT.Eip должен содержаться адрес Entry Point? но там адрес внутри kernel32. или я че-то не правильно понимаю? после правки контекста делаю ResumeThread - процесс завершается. на чтобы я его не поменял. менял на 0 - вроде эксэпшн должен вылезти, а нифига - завершение и все... где я заблуждаюсь?
Первый поток процесса начинается не с EntryPoint, а с KERNEL32!BaseProcessStart. Это - для подсистемы win32. Native-аппликухи рождаются в недрах ntdll. по идее в CONTEXT.Eip должен содержаться адрес Entry Point Идя неверна и основана на ложных допущениях
Сорри что вопрос немного не в тему - не хочу создавать новую тему. Имеется код: Код (Text): CONTEXT cnt = {0}; cnt.ContextFlags = CONTEXT_CONTROL; wsprintf(buff, "EIP: %X", cnt.Rip); Выдается ошибка: Но ведь cnt.Rip совпадает с описанием!
Кусок из Winnt.h: // This section is specified/returned if the // ContextFlags word contians the flag CONTEXT_CONTROL. // DWORD Ebp; DWORD Eip; DWORD SegCs; // MUST BE SANITIZED DWORD EFlags; // MUST BE SANITIZED DWORD Esp; DWORD SegSs; Rip это 64-х битный регистр ip, откуда ему там быть?
Спасибо, с этим ясно. А как именуется флаг трассировки? В winnt.h я этого не нашел хотя очень стрался Пробовал написать: cnt.EFlags = 0x100; Но похоже это не тот параметр т.к. работающей пошаговой отладки не наблюдается. З.Ы. Отладчик пишу по этому примеру
Все написал 1:1 с примером: Код (Text): while (TRUE) { WaitForDebugEvent(&de, INFINITE); switch (de.dwDebugEventCode) { case EXIT_PROCESS_DEBUG_EVENT: wsprintf(buff, "End process\nSteps: %u", steps); MessageBox(0, buff, NULL, MB_ICONINFORMATION); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); ExitProcess(0); break; case CREATE_PROCESS_DEBUG_EVENT: MessageBox(0, "Start debug process...", "Info", MB_ICONEXCLAMATION); steps = 0; break; case EXCEPTION_DEBUG_EVENT: switch (de.u.Exception.ExceptionRecord.ExceptionCode) { case EXCEPTION_BREAKPOINT: // Запуск трейса! cnt.ContextFlags = CONTEXT_CONTROL; GetThreadContext(de.u.CreateProcessInfo.hThread, &cnt); cnt.EFlags = 0x100; SetThreadContext(de.u.CreateProcessInfo.hThread, &cnt); ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE); continue; case EXCEPTION_SINGLE_STEP: // Тут будет бряк при каждом новом шаге! steps++; GetThreadContext(de.u.CreateProcessInfo.hThread, &cnt); cnt.EFlags = 0x100; SetThreadContext(de.u.CreateProcessInfo.hThread, &cnt); ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE); continue; } break; case CREATE_THREAD_DEBUG_EVENT: MessageBox(0, "Begin new thread!", NULL, MB_ICONINFORMATION); break; case EXIT_THREAD_DEBUG_EVENT: MessageBox(0, "Kill thread!", NULL, MB_ICONINFORMATION); break; } ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_EXCEPTION_NOT_HANDLED); }
cnt.EFlags = 0x100; Ты нарущаешь этим работу программы, зачем сбрасывать остальные флаги. Правильно будет cnt.EFlags |= 0x100; Больше ошибок вроде не видно, попробуй под отладчиком прогони(лучше под айсом), что функции GetThreadContext и SetThreadContext возвращают.
Вместо de.u.CreateProcessInfo.hThread нужно было написать pi.hThread Все работает но как-то странно, отлаживаемая программа падает...