为何OpenProcess返回的句柄值都相同
为什么OpenProcess返回的句柄值都相同
1.提权成功
2.使用OpenProcess打开目标进程,发现返回的句柄值都一样!怎么个原因????
输出结果:
为什么都一样啊!!!!!
------解决方案--------------------
由OpenProcess的返回值引出"句柄表"
------解决方案--------------------
我估计是因为OpenProcess返回的句柄其实是进程句柄表中的索引,但是你每次都调用CloseHandle把句柄关闭,导致句柄表中改行记录清除,而再打开一个新的进程时,新的句柄索引在句柄表中的同一位置。
你可以试着把CloseHandle去掉,再看看值是否相同。
1.提权成功
2.使用OpenProcess打开目标进程,发现返回的句柄值都一样!怎么个原因????
#include <iostream>
#include <windows.h>
using namespace std;
bool EnableDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
return false;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue)) {
CloseHandle(hToken);
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {
CloseHandle(hToken);
return false;
}
return true;
}
int main ()
{
int a = 0;
HANDLE hHnd = NULL;
if(EnableDebugPriv())
{
cout << "OK\n";
}
else
{
cout << "Mark\n";
}
for(int i=0; i<600; i++)
{
hHnd = OpenProcess(PROCESS_ALL_ACCESS, FALSE, i);
if(hHnd)
{
cout << hHnd << "\t" << i << "\n";
CloseHandle(hHnd);
hHnd = NULL;
}
}
return 0 ;
}
输出结果:
OK
00000090 340
00000090 341
00000090 342
00000090 343
00000090 356
00000090 357
00000090 358
00000090 359
00000090 416
00000090 417
00000090 418
00000090 419
00000090 516
00000090 517
00000090 518
00000090 519
00000090 576
00000090 577
00000090 578
00000090 579
00000090 584
00000090 585
00000090 586
00000090 587
为什么都一样啊!!!!!
------解决方案--------------------
由OpenProcess的返回值引出"句柄表"
------解决方案--------------------
我估计是因为OpenProcess返回的句柄其实是进程句柄表中的索引,但是你每次都调用CloseHandle把句柄关闭,导致句柄表中改行记录清除,而再打开一个新的进程时,新的句柄索引在句柄表中的同一位置。
你可以试着把CloseHandle去掉,再看看值是否相同。