Программный взлом запущенного процесса

#windows #process #visual-studio-debugging

#Windows #процесс #visual-studio-отладка

Вопрос:

Мне нужно запустить процесс, а затем немедленно прервать его, чтобы его можно было отладить с помощью Visual Studio. Я написал этот код после поиска фрагментов в Интернете. Код не работает. Процесс запускается, но он не прерывается, и вызывающий код продолжает ждать бесконечно. Если я не запускаю процесс в приостановленном режиме, он запускается немедленно и завершается.

Я не могу изменить код .exe, который я запускаю. У меня есть только файл .exe и symbols.

Код:

 #include<iostream>
#include<Windows.h>

using namespace std;

int main(int argc, char **argv)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    LPWSTR commandLine;
    int commandLength;

    ZeroMemory(amp;si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(amp;pi, sizeof(pi));

    if (argc != 2)
    {
        cout << "Usage: Launcher <commandline>" << endl;
        return 1;
    }

    commandLength = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, NULL, 0);
    commandLine = new WCHAR[commandLength];
    MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, commandLine, commandLength);

    if (!CreateProcess(NULL, commandLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, amp;si, amp;pi))
    {
        cout << "CreateProcess failed (" << GetLastError() << ")." << endl;
        delete[] commandLine;
        return 1;
    }

    cout << pi.dwProcessId << " " << pi.dwThreadId << endl;

    delete[] commandLine;

    DebugBreakProcess(pi.hProcess);

    WaitForSingleObject(pi.hProcess, INFINITE);

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return 0;
}
  

Что я здесь делаю не так?

РЕДАКТИРОВАТЬ: Это код после предложения Тайсона.

 #include<iostream>
#include<Windows.h>

using namespace std;

int main(int argc, char **argv)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    LPWSTR commandLine;
    int commandLength;
    HANDLE processHandle;

    ZeroMemory(amp;si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(amp;pi, sizeof(pi));

    if (argc != 2)
    {
        cout << "Usage: Launcher <commandline>" << endl;
        return 1;
    }

    commandLength = MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, NULL, 0);
    commandLine = new WCHAR[commandLength];
    MultiByteToWideChar(CP_UTF8, 0, argv[1], -1, commandLine, commandLength);

    if (!CreateProcess(NULL, commandLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, amp;si, amp;pi))
    {
        cout << "CreateProcess failed (" << GetLastError() << ")." << endl;
        delete[] commandLine;
        return 1;
    }

    delete[] commandLine;

    processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId);
    if (processHandle == NULL)
    {
        cout << "Could not obtain handle (" << GetLastError() << ")." << endl;
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
        return 2;
    }

    DebugActiveProcess(pi.dwProcessId);

    //ResumeThread(pi.hThread);

    WaitForSingleObject(pi.hProcess, INFINITE);

    CloseHandle(processHandle);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    return 0;
}
  

Комментарии:

1. Что насчет этой проблемы? Не могли бы вы получить полезную информацию из предложения IInspectable? На самом деле я согласен с его предложением, автоматический запуск отладчика был бы лучшим обходным решением.

Ответ №1:

РЕДАКТИРОВАТЬ: пересмотренные инструкции на основе обновленного кода.

Я вижу три вещи, которые помогут. Во-первых, вы должны получить дескриптор процесса с правильным доступом. Дескриптор, возвращаемый CreateProcess, не имеет правильного доступа. Закройте дескриптор этого процесса ( pi.hProcess и pi.hThread ) и вызовите OpenProcess запрос PROCESS_ALL_ACCESS . Имейте в виду, что это может привести к сбою, если учетная запись пользователя, запускающая программу, не имеет необходимых разрешений.

Далее убедитесь, что вы сначала инициируете отладку, вызвав DebugActiveProcess дескриптор процесса, полученный выше. (Это может потребоваться, а может и не потребоваться.)

Наконец, после вашего редактирования я заметил, что вы ожидаете дескриптора процесса с помощью WaitForSingleObject . Это приводит к ожиданию завершения процесса. Вместо этого используйте WaitForDebugEvent .

Комментарии:

1. Я не знаю, правильно ли я это сделал, но я отредактировал свой вопрос выше с помощью нового кода. Он по-прежнему не работает. Я попытался запустить процесс с флагом CREATE_SUSPENDED, а также с флагом DEBUG_PROCESS. Оба не сработали.

Ответ №2:

Вы слишком стараетесь. Система уже хорошо подготовлена к запуску отладчика для любого произвольного процесса. Вам нужно только соответствующим образом настроить параметры выполнения файла изображения, чтобы автоматически запустить отладчик.

Для справки, вот инструкции, приведенные в MSDN:

Для настройки приложения на автоматический запуск отладчика

  1. Запустите редактор реестра (regedit).
  2. В редакторе реестра откройте папку HKEY_LOCAL_MACHINE.
  3. Перейдите в раздел HKEY_LOCAL_MACHINESoftware Microsoft Windows NT currentversion параметры выполнения файла изображения.
  4. В папке с параметрами выполнения файла изображения найдите имя приложения, которое вы хотите отлаживать, например myapp.exe. Если вы не можете найти приложение, которое хотите отладить:

    a. Щелкните правой кнопкой мыши папку «Параметры выполнения файла изображения» и в контекстном меню выберите «Новая клавиша«. ……..

    b. Щелкните правой кнопкой мыши новый ключ и в контекстном меню выберите Переименовать.

    c. Измените имя ключа на имя вашего приложения;myapp.exe, в этом примере.

  5. Щелкните правой кнопкой мыши myapp.exe папка и в контекстном меню выберите Новое строковое значение.

  6. Щелкните правой кнопкой мыши новое строковое значение и в контекстном меню выберите «Переименовать«.
  7. Измените имя на debugger .
  8. Щелкните правой кнопкой мыши новое строковое значение и в контекстном меню выберите «Изменить«.
    Появится диалоговое окно Редактировать строку.
  9. В поле Значение данных введите vsjitdebugger.exe.
  10. Нажмите OK.
  11. В меню реестра нажмите Выход.
  12. Каталог, содержащий vsjitdebugger.exe должно быть в вашем системном пути. Чтобы добавить его в системный путь, выполните следующие действия:

    a. Откройте панель управления в классическом представлении и дважды щелкните Система.

    b. Нажмите Дополнительные системные настройки.

    c. В свойствах системы перейдите на вкладку Дополнительно.

    d. На вкладке «Дополнительно» щелкните «Переменные окружения«.

    Эл. В переменных среды диалоговом окне в разделе системные переменныевыберите путь, а затем нажмите Редактировать кнопку.

    f. В диалоговом окне «Редактировать системную переменную» добавьте каталог в поле «Значение переменной». ……….». Значение переменной. Используйте точку с запятой, чтобы отделить его от других записей в списке.

    g. Нажмите OK, чтобы закрыть диалоговое окно «Редактировать системную переменную«.

    сек. Нажмите кнопку ОК, чтобы закрыть окно Переменные среды диалоговом окне.

    i. Нажмите OK, чтобы закрыть диалоговое окно «Системные свойства«.

Теперь используйте любой метод для запуска вашего приложения. Visual Studio запустит и загрузит приложение.