WinDbg отладка user-mode из Kernel-mode бряки?

Тема в разделе "WASM.BEGINNERS", создана пользователем Aids, 3 фев 2011.

  1. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Подскажите. Как поставить бряк на загрузку программы, чтобы при запуске отладчик остановился на точке входа? Отлаживаю в kernel-mode, программа запускается на VM.
     
  2. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    никто не может подсказать что ли?
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я делал так: написал программу, которая создает процесс флагом SUSPENDED и спрашивает, когда запустить процесс. Запускал программу, затем вычислял ее EPROCESS (с помощью '!process 0 0'). Ставил точку останова там, где требуется ('bp /p{EPROCESS}') и разрешал процессу выполняться. Вот текст запускающей программы:
    Код (Text):
    1. #include <windows.h>
    2. #include <tchar.h>
    3. #include <stdio.h>
    4.  
    5. void usage()
    6. {
    7.     printf("Starter <exename> <arguments>\n");
    8. }
    9.  
    10. int _tmain(int argc, TCHAR **argv)
    11. {
    12.     char                 answer;
    13.     STARTUPINFO          si;
    14.     PROCESS_INFORMATION  pi;
    15.     TCHAR               *CommandLine, *ptr;
    16.     int                  i;
    17.     int                  length;
    18.  
    19.     if (argc < 2)
    20.     {
    21.         usage();
    22.         return 1;
    23.     }
    24.  
    25.     length = 0;
    26.     for (i = 1; i < argc; i++)
    27.     {
    28.         length += _tcslen(argv[i]);
    29.     }
    30.     length += (argc - 1) * sizeof(TCHAR) + argc * 2 * sizeof(TCHAR) + sizeof(TCHAR);
    31.  
    32.     CommandLine = (TCHAR *)HeapAlloc(GetProcessHeap(), 0, length);
    33.     if (!CommandLine)
    34.     {
    35.         printf("Error: %x\n", GetLastError());
    36.         return 1;
    37.     }
    38.  
    39.     ptr = CommandLine;
    40.     for (i = 1; i < argc; i++)
    41.     {
    42.         *ptr = TEXT('"');
    43.         ptr++;
    44.         _tcscpy(ptr, argv[i]);
    45.         ptr += _tcslen(argv[i]);
    46.         *ptr = TEXT('"');
    47.         ptr++;
    48.         *ptr = TEXT(' ');
    49.         ptr++;
    50.     }
    51.     *ptr = TEXT('\0');
    52.  
    53.     ZeroMemory(&si, sizeof(si));
    54.     si.cb = sizeof(si);
    55.  
    56.     if (!CreateProcess(NULL,
    57.                        CommandLine,
    58.                        NULL,
    59.                        NULL,
    60.                        FALSE,
    61.                        CREATE_SUSPENDED,
    62.                        NULL,
    63.                        NULL,
    64.                        &si,
    65.                        &pi))
    66.     {
    67.         printf("Error: %x\n", GetLastError());
    68.     }
    69.     else
    70.     {
    71.         CloseHandle(pi.hProcess);
    72.         printf("Continue main thread?\n");
    73.         scanf("%c", &answer);
    74.         ResumeThread(pi.hThread);
    75.         CloseHandle(pi.hThread);
    76.     }
    77.  
    78.     HeapFree(GetProcessHeap(), 0, CommandLine);
    79.  
    80.     return 0;
    81. }
     
  4. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    проще на точку входа int 3 поставить перед запуском (если свою дебажите). Windbg исправно стопается. Можно при желании конечно и на LdrInitializeProcess поставить (тогда через селектор bp 1b:ntdll!LdrpInitilizeProcess) и дальше трейсить. Но с int 3 имхо наиболее быстро.
     
  5. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Открывай в хекс редактора файл, ищи точку входа, ставь инт3, как брякнется меняй байт обратно.
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Aids
    cdb -d program.exe

    после запуска получите режим юзермодный режим отладки, контролируемый из ядерного отладчика.
    Переход в чисто ядерный режим отладки - команда .breakin
     
  7. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Спасибо всем за подсказку.
    green
    делаю так cdb -d program.exe попадаю в user-mode режим отладки, потом .breakin, d km. ставлю бряк на EP, запускаю программу и попадаю в user-mode отладчик снова. бряки не срабатывают в km. Их можно как то поставить? или тут только придётся довольствоваться user-mode?
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Aids
    После установки бряка из km-отладчика нужно отсоединить um-отладчик (команда .detach), иначе он будет реагировать на km-бряки как на int 3. Ну или отрубить в um обработку этого исключения.
     
  9. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Всем большое спасибо