打开带有DEBUG标志的进程的问题

Problems with opening a process with DEBUG flags

本文关键字:进程 问题 标志 DEBUG      更新时间:2023-10-16

我试图用我的调试器打开一个进程,使用DEBUG_PROCESSDEBUG_ONLY_THIS_PROCESS标志的CreateProcess和进程被打开,但是当我尝试用我收到的句柄调用SymInitialize时,它失败了。

这是我的代码:

#include <windows.h> 
#include <stdio.h> 
#include <dbghelp.h> 
#pragma (lib, "dbghelp.lib"); 
bool EnablePrivilege(LPCTSTR lpszPrivilegeName, BOOL bEnable)  
{  
    HANDLE hToken;  
    TOKEN_PRIVILEGES    tp;  
    LUID luid;  
    bool ret;  
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ, &hToken))  
        return FALSE;  
    if (!LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid))  
        return FALSE;  
    tp.PrivilegeCount           = 1;  
    tp.Privileges[0].Luid       = luid;  
    tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;  
    ret = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);  
    CloseHandle(hToken);  
    return ret;  
} 
void main() 
{ 
    EnablePrivilege(SE_DEBUG_NAME, TRUE); 
    STARTUPINFOA startInfo; 
    PROCESS_INFORMATION processInfo; 
    ZeroMemory( &startInfo, sizeof(startInfo) ); 
    startInfo.cb = sizeof(startInfo); 
    ZeroMemory( &processInfo, sizeof(processInfo) ); 
    DWORD creationFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS | PROCESS_VM_READ | PROCESS_QUERY_INFORMATION; 
    const char* comLine = "Some process path and name"; 
//     Start the child process.  
    if( CreateProcessA( NULL,   // No module name (use command line) 
       (LPSTR)comLine, //argv[1],        // Command line 
        NULL,           // Process handle not inheritable 
        NULL,           // Thread handle not inheritable 
        FALSE,          // Set handle inheritance to FALSE 
        creationFlags,              // No creation flags 
        NULL,           // Use parent's environment block 
        NULL,           // Use parent's starting directory  
        &startInfo,            // Pointer to STARTUPINFO structure 
        &processInfo )           // Pointer to PROCESS_INFORMATION structure 
     == false )  
    { 
        printf("FAIL!"); 
return; 
    } 
    SetLastError(0); 
    bool ok = SymInitialize(processInfo.hProcess, NULL, true); 
    int err = GetLastError(); 
} 

如果我在没有创建标志的情况下调用CreateProcess,则syminialize成功。
我做错了什么?

您的错误是调用MAKE_HRESULT宏的结果

MAKE_HRESULT(ERROR_SEVERITY_ERROR, FACILITY_NULL, ERROR_INVALID_DATA)

所以你的错误代码不是垃圾。文档没有说明在这种情况下哪种数据可能是无效的。我要看看究竟是什么原因引起的问题。

编辑:

这个代码为我工作

#include <windows.h>
#include <stdio.h>
#include <dbghelp.h>
#include <WinError.h>
bool EnablePrivilege(LPCTSTR lpszPrivilegeName, BOOL bEnable)
{
    HANDLE hToken;
    TOKEN_PRIVILEGES    tp;
    LUID luid;
    bool ret;
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ, &hToken))
    return FALSE;
    if (!LookupPrivilegeValue(NULL, lpszPrivilegeName, &luid))
    return FALSE;
    tp.PrivilegeCount           = 1;
    tp.Privileges[0].Luid       = luid;
    tp.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
    ret = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
    CloseHandle(hToken);
    return ret;
}
void main()
{
    EnablePrivilege(SE_DEBUG_NAME, TRUE);
    STARTUPINFOA startInfo;
    PROCESS_INFORMATION processInfo;
    ZeroMemory( &startInfo, sizeof(startInfo) );
    startInfo.cb = sizeof(startInfo);
    ZeroMemory( &processInfo, sizeof(processInfo) );
    DWORD creationFlags = DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS | PROCESS_VM_READ | PROCESS_QUERY_INFORMATION;
    const char* comLine = "C:\Windows\Notepad.exe";
//     Start the child process.
    if( CreateProcessA( NULL,   // No module name (use command line)
       (LPSTR)comLine,// argv[1],        // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    creationFlags,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory
    &startInfo,            // Pointer to STARTUPINFO structure
    &processInfo )           // Pointer to PROCESS_INFORMATION structure
     == false )
    {
    printf("FAIL!");
return;
    }
    SetLastError(0);
    bool ok = SymInitialize(processInfo.hProcess, NULL, true);
    HRESULT err = HRESULT_FROM_WIN32(GetLastError());
}

我不知道为什么它不适合你-我运行的是windows XP,它可能是不同的。对于我来说,syminialize返回true,而GetLastError返回0x800700cb,这只意味着它没有找到将其指向带有符号文件的目录的环境变量。

这可能是一个愚蠢的问题,但也许你的系统中缺少一些调试库?你试过安装吗?调试工具窗户吗?我推荐"从Windows SDK下载调试工具"选项-阅读描述。我猜周围的每个编程IDE都会为你安装它,或者让你在调试任何东西之前安装它,但最好还是检查一下。

使用DEBUG_PROCESS标志创建进程时,不加载任何符号。需要等待一些LOAD_DLL_DEBUG_EVENT,然后调用syminialize()。