使用 DEBUG 标志打开进程的问题
Posted
技术标签:
【中文标题】使用 DEBUG 标志打开进程的问题【英文标题】:Problems with opening a process with DEBUG flags 【发布时间】:2011-10-07 12:26:37 【问题描述】:我正在尝试使用带有DEBUG_PROCESS
和DEBUG_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,则 symInitialize 成功。 我做错了什么?
【问题讨论】:
我也尝试删除标志:PROCESS_VM_READ 和 PROCESS_QUERY_INFORMATION 但没有帮助。 当 SymInitialize 调用失败时,GetLastError() 返回什么? 它返回一些垃圾负值:/ 几乎可以肯定它不是垃圾。尝试将其查看/打印为十六进制值。价值是多少? 如果我将 SymInitialize "false" 传递给 fInvadeProcess 参数,它会返回 ok(但最后一个错误是 ERROR_ENVVAR_NOT_FOUND)。但我希望它自动加载模块...为什么会失败??? 【参考方案1】:你的错误是调用MAKE_HRESULT macro as
MAKE_HRESULT(ERROR_SEVERITY_ERROR, FACILITY_NULL, ERROR_INVALID_DATA)
所以你的错误代码不是垃圾。 Documentaion 没有说明在这种情况下哪种数据可能无效。我会试着看看到底是什么导致了这个问题。
编辑:
这段代码对我有用
#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,这可能会有所不同。对我来说 SymInitialize 返回 true,GetLastError 返回 0x800700cb,这仅意味着它没有找到指向带有符号文件的目录的 evirnment 变量。
这可能是个愚蠢的问题,但也许您的系统中缺少一些调试库?您是否尝试过安装例如。 Debugging Tools for Windows?我会推荐“从 Windows SDK 下载调试工具”选项 - 阅读说明。我猜周围的每个编程 IDE 都会为您安装它,或者让您在调试任何东西之前安装它,但最好检查一下。
【讨论】:
不,我都有。没关系,我将手动加载符号:( [抽泣]。【参考方案2】:当刚刚使用 DEBUG_PROCESS 标志创建进程时,不会加载任何符号。需要等待一些 LOAD_DLL_DEBUG_EVENT 然后调用 SymInitialize()。
【讨论】:
以上是关于使用 DEBUG 标志打开进程的问题的主要内容,如果未能解决你的问题,请参考以下文章
Swift:如何使用 PREPROCESSOR 标志(如`#if DEBUG`)来实现 API 密钥?
read() 不会阻塞在没有 O_NONBLOCK 标志的情况下打开的空 FIFO
Android 逆向Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )
Android 逆向Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )