2016-10-20 11 views
0

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

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

Код:

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

using namespace std; 

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

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&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, &si, &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; 
} 

Что я здесь делаю неправильно?

EDIT: Это код после предложения tyson.

#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(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&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, &si, &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; 
} 
+0

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

ответ

0

EDIT: пересмотренные инструкции на основе обновленного кода.

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

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

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

+0

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

0

Вы слишком стараетесь. Система уже хорошо подготовлена ​​для запуска отладчика для любого произвольного процесса. Вам нужно только установить Image File Execution Options соответственно launch the debugger automatically.

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

Чтобы установить приложение, чтобы запустить отладчик автоматически

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

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

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

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

  5. правой кнопкой мыши папку myapp.exe, и в контекстном меню выберите New String Значение.

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

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

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

    c. В Свойства системы, нажмите на Продвинутый вкладка.

    d. На вкладке Advanced нажмите Переменные среды.

    e. В переменных диалогового окна окружающей среды под Системной переменных, выберите Path, а затем нажмите кнопкуEdit.

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

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

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

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

Теперь, используя любой способ, чтобы начать применение. Visual Studio запустит и загрузит приложение.

 Смежные вопросы

  • Нет связанных вопросов^_^