看流星社区

 找回密码
 注册账号
查看: 2274|回复: 4

关于DebugActiveProcess函数不能成功执行的问题!!!

[复制链接]

该用户从未签到

发表于 2013-5-24 09:13:26 | 显示全部楼层 |阅读模式
写了一个对特定进程的调试程序,思路如下:
首先用FindWindow得到窗口句柄
再用GetWindowThreadProcessId得到进程ID和主线程ID
最后用OpenProcess(PROCESS_ALL_ACCESS权限)得到进程句柄,这些函数经测试都执行无误。
然后想用DebugActiveProcess来绑定这个进程进行调试,但这个函数总是执行不成功,返回0,看了一些资料说此函数出错多是由于进程权限的问题,可是我打开进程时用的是PROCESS_ALL_ACCESS权限,应该不存在这个问题啊!请有这方面编程经验的高手帮助解决一下。。。

该用户从未签到

发表于 2013-5-24 09:13:37 | 显示全部楼层
DebugActiveProcess我没用过,不好说
不过若要调试一个进程不必要这个:
DEBUG_EVENT devent ;
while ( isContinue )
{
if ( WaitForDebugEvent( &devent, 100) )
{
switch ( devent.dwDebugEventCode )
{
}
ContinueDebugEvent ( hProcess, hThread, DBG_CONTINUE...) ;
}
}

要注意的是CreateProcess时要用DEBUG_ONLY_THIS_PROCESS标志

该用户从未签到

发表于 2013-5-24 09:13:56 | 显示全部楼层
------------------------------------------------------
引用MSDN:
However, on Windows NT, DebugActiveProcess can fail if the target process was created with a security descriptor that grants the debugger anything less than full access. Note that if the debugging process has the SE_DEBUG_NAME privilege granted and enabled, it can debug any process.
―――――――――――――――――――――――――----
提升调试进程SE_DEBUG_NAME权限即可

该用户从未签到

发表于 2013-5-24 09:14:13 | 显示全部楼层
转文一篇:HOWTO: How to Obtain a Handle to Any Process with SeDebugPrivilege
来源: VS.NET MSDN


#define RTN_OK 0
#define RTN_USAGE 1
#define RTN_ERROR 13

#include <windows.h>
#include <stdio.h>

BOOL SetPrivilege(
HANDLE hToken, // token handle
LPCTSTR Privilege, // Privilege to enable/disable
BOOL bEnablePrivilege // TRUE to enable. FALSE to disable
);

void DisplayError(LPTSTR szAPI);

int main(int argc, char *argv[])
{
HANDLE hProcess;
HANDLE hToken;
int dwRetVal=RTN_OK; // assume success from main()

// show correct usage for kill
if (argc != 2)
{
fprintf(stderr,"Usage: %s [ProcessId]\n", argv[0]);
return RTN_USAGE;
}

if(!OpenProcessToken(
GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hToken
)) return RTN_ERROR;

// enable SeDebugPrivilege
if(!SetPrivilege(hToken, SE_DEBUG_NAME, TRUE))
{
DisplayError("SetPrivilege");

// close token handle
CloseHandle(hToken);

// indicate failure
return RTN_ERROR;
}

// open the process
if((hProcess = OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
atoi(argv[1]) // PID from commandline
)) == NULL)
{
DisplayError("OpenProcess");
return RTN_ERROR;
}

// disable SeDebugPrivilege
SetPrivilege(hToken, SE_DEBUG_NAME, FALSE);

if(!TerminateProcess(hProcess, 0xffffffff))
{
DisplayError("TerminateProcess");
dwRetVal=RTN_ERROR;
}

// close handles
CloseHandle(hToken);
CloseHandle(hProcess);

return dwRetVal;
}

BOOL SetPrivilege(
HANDLE hToken, // token handle
LPCTSTR Privilege, // Privilege to enable/disable
BOOL bEnablePrivilege // TRUE to enable. FALSE to disable
)
{
TOKEN_PRIVILEGES tp;
LUID luid;
TOKEN_PRIVILEGES tpPrevious;
DWORD cbPrevious=sizeof(TOKEN_PRIVILEGES);

if(!LookupPrivilegeValue( NULL, Privilege, &luid )) return FALSE;

//
// first pass. get current privilege setting
//
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = 0;

AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
&tpPrevious,
&cbPrevious
);

if (GetLastError() != ERROR_SUCCESS) return FALSE;

//
// second pass. set privilege based on previous setting
//
tpPrevious.PrivilegeCount = 1;
tpPrevious.Privileges[0].Luid = luid;

if(bEnablePrivilege) {
tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
}
else {
tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED &
tpPrevious.Privileges[0].Attributes);
}

AdjustTokenPrivileges(
hToken,
FALSE,
&tpPrevious,
cbPrevious,
NULL,
NULL
);

if (GetLastError() != ERROR_SUCCESS) return FALSE;

return TRUE;
}

void DisplayError(
LPTSTR szAPI // pointer to failed API name
)
{
LPTSTR MessageBuffer;
DWORD dwBufferLength;

fprintf(stderr,"%s() error!\n", szAPI);

if(dwBufferLength=FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
GetSystemDefaultLangID(),
(LPTSTR) &MessageBuffer,
0,
NULL
))
{
DWORD dwBytesWritten;

//
// Output message string on stderr
//
WriteFile(
GetStdHandle(STD_ERROR_HANDLE),
MessageBuffer,
dwBufferLength,
&dwBytesWritten,
NULL
);

//
// free the buffer allocated by the system
//
LocalFree(MessageBuffer);
}
}

该用户从未签到

 楼主| 发表于 2013-5-24 09:14:36 | 显示全部楼层
呵呵,终于找到原因了,不是由于权限的问题,根本原因就是DebugActiveProcess函数的dwProcessID参数根本就没有传进来,当然函数执行不成功了。
我这个程序是这样做的,一个基于远程钩子的线程钩子dll函数,我把得到dwProcessID的GetWindowThreadProcessID函数放在了这个dll里面,dwProcessID做为这个dll的全局变量,而使用这个dwProcessID做为参数的DebugActiveProcess函数是放在了钩子回调函数中,所以这个dwProcesID在链接时要设置成共享段,并且dwProcessID要初始化,而我的程序中恰恰就忘了给他赋个NULL,晕啊。。。
我的程序下一步就是要调试了,用THREADCONTEXT,但GetThreadContext函数要主线程句柄,我又不是用CreateProcess,哪来的主线程句柄啊!搜了一下,有篇文章说了:从ThreadID得不到ThreadHandle,有了ThreadHandle,你还不能干什么事啊?所以Microsoft决不会给你这个接口。。。看来是没有希望了,正打算重新用CreateProcess来做,但这样就会涉及到很多继承方面的东西(要调试的进程会创建新的进程),看看吧。。。如果哪位知道由ThreadID得到ThreadHandle的方法,麻烦告一声,在这里先谢谢了!!!

“如果只是索取,资源终将枯竭,只有大家都把经验共享出来,我们的思维才会充满活力。”真理啊!!!昨天看了一个关于Richard Stallman的视频,对自由软件又有进一步的了解,不管你对他从事的事业抱什么样的看法,这样的人都值得尊敬。。。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-23 18:32

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表