Подскажите. Как поставить бряк на загрузку программы, чтобы при запуске отладчик остановился на точке входа? Отлаживаю в kernel-mode, программа запускается на VM.
Я делал так: написал программу, которая создает процесс флагом SUSPENDED и спрашивает, когда запустить процесс. Запускал программу, затем вычислял ее EPROCESS (с помощью '!process 0 0'). Ставил точку останова там, где требуется ('bp /p{EPROCESS}') и разрешал процессу выполняться. Вот текст запускающей программы: Код (Text): #include <windows.h> #include <tchar.h> #include <stdio.h> void usage() { printf("Starter <exename> <arguments>\n"); } int _tmain(int argc, TCHAR **argv) { char answer; STARTUPINFO si; PROCESS_INFORMATION pi; TCHAR *CommandLine, *ptr; int i; int length; if (argc < 2) { usage(); return 1; } length = 0; for (i = 1; i < argc; i++) { length += _tcslen(argv[i]); } length += (argc - 1) * sizeof(TCHAR) + argc * 2 * sizeof(TCHAR) + sizeof(TCHAR); CommandLine = (TCHAR *)HeapAlloc(GetProcessHeap(), 0, length); if (!CommandLine) { printf("Error: %x\n", GetLastError()); return 1; } ptr = CommandLine; for (i = 1; i < argc; i++) { *ptr = TEXT('"'); ptr++; _tcscpy(ptr, argv[i]); ptr += _tcslen(argv[i]); *ptr = TEXT('"'); ptr++; *ptr = TEXT(' '); ptr++; } *ptr = TEXT('\0'); ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); if (!CreateProcess(NULL, CommandLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi)) { printf("Error: %x\n", GetLastError()); } else { CloseHandle(pi.hProcess); printf("Continue main thread?\n"); scanf("%c", &answer); ResumeThread(pi.hThread); CloseHandle(pi.hThread); } HeapFree(GetProcessHeap(), 0, CommandLine); return 0; }
проще на точку входа int 3 поставить перед запуском (если свою дебажите). Windbg исправно стопается. Можно при желании конечно и на LdrInitializeProcess поставить (тогда через селектор bp 1b:ntdll!LdrpInitilizeProcess) и дальше трейсить. Но с int 3 имхо наиболее быстро.
Aids cdb -d program.exe после запуска получите режим юзермодный режим отладки, контролируемый из ядерного отладчика. Переход в чисто ядерный режим отладки - команда .breakin
Спасибо всем за подсказку. green делаю так cdb -d program.exe попадаю в user-mode режим отладки, потом .breakin, d km. ставлю бряк на EP, запускаю программу и попадаю в user-mode отладчик снова. бряки не срабатывают в km. Их можно как то поставить? или тут только придётся довольствоваться user-mode?
Aids После установки бряка из km-отладчика нужно отсоединить um-отладчик (команда .detach), иначе он будет реагировать на km-бряки как на int 3. Ну или отрубить в um обработку этого исключения.