郁金香外挂技术-郁金香灬老师

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 36|回复: 1

通过 进程句柄 获取句柄的目标进程PID

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式



// https://docs.microsoft.com/en-us ... yinformationprocess

typedef PVOID PPEB;
typedef struct _PROCESS_BASIC_INFORMATION {
        PVOID Reserved1;
        PPEB PebBaseAddress;
        PVOID Reserved2[2];
        ULONG_PTR UniqueProcessId;
        PVOID Reserved3;
} PROCESS_BASIC_INFORMATION;


extern "C" NTSTATUS NTAPI NtQueryInformationProcess(
        IN HANDLE ProcessHandle, // 进程句柄
        IN UINT InformationClass, // 信息类型
        OUT PVOID ProcessInformation, // 缓冲指针
        IN ULONG ProcessInformationLength, // 以字节为单位的缓冲大小
        OUT PULONG ReturnLength OPTIONAL // 写入缓冲的字节数
);


//进程句柄转PID
DWORD HandleToPid(IN HANDLE hProcess)
{
        _PROCESS_BASIC_INFORMATION pbi = { 0 }; //NTDEFS::SYSTEM_BASIC_INFORMATION         NTDEFS::
        #define ProcessBasicInformation 0

        NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(_PROCESS_BASIC_INFORMATION), 0);
        //返回0表示成功
        NTSTATUS status = NtQueryInformationProcess(hProcess,
                ProcessBasicInformation,
                (PVOID)&pbi,
                sizeof(PROCESS_BASIC_INFORMATION),
                NULL);
        printf("hProcess=%X,status=%X\n", hProcess, status);
        if (!status)
        {
                return (DWORD)pbi.UniqueProcessId;
        }
        printf("hProcess=%X,pbi->UniqueProcessId=%d\n", hProcess, pbi.UniqueProcessId);
        return 0;
}


郁金香外挂教程,学习中...
回复

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层


void GetSystemHandleInformation(NTDEFS::SYSTEM_HANDLE_INFORMATION* pshi)//16
{

        cout << "\t\t16 SystemHandleInformation" << endl;
        printf("句柄数量=%d\n", pshi->NumberOfHandles); //一般有几万个
        //getchar();
        NTDEFS::OBJECT_NAME_INFORMATION*szName = (NTDEFS::OBJECT_NAME_INFORMATION*)malloc(1000);
        NTDEFS::OBJECT_NAME_INFORMATION*szType = (NTDEFS::OBJECT_NAME_INFORMATION*)malloc(1000);

        for (int i = 0; i < pshi->NumberOfHandles; i++)
        {


        //        if ((int)pshi->Handles[i].CreatorBackTraceIndex ==11)
                if(pshi->Handles[i].UniqueProcessId==6652)
                {               



                HANDLE newHandle=NULL;
                DWORD dwFlags1=0;
                DWORD dwFlags2= 0;
                DuplicateHandle(
                        OpenProcess(PROCESS_ALL_ACCESS, FALSE,         pshi->Handles[i].UniqueProcessId),
                        (HANDLE)pshi->Handles[i].HandleValue,
                        GetCurrentProcess(),
                        &newHandle,
                        DUPLICATE_SAME_ACCESS,
                        FALSE,
                        DUPLICATE_SAME_ACCESS);
                if (newHandle)
                {


                NTSTATUS status1 = NtQueryObject(newHandle, NTDEFS::ObjectNameInformation, szName, 512, &dwFlags1);
                NTSTATUS status2 = NtQueryObject(newHandle, NTDEFS::ObjectTypeInformation, szType, 128, &dwFlags2);
               
        //        if (status1==0 &&szName->Name.Length>0&& _wcsicmp(szType->Name.Buffer, L"Process") == 0)
                if(_wcsicmp(szType->Name.Buffer, L"Process") == 0)
                {
                        //cout << "\tType=" << i + 1 << szType->Name.Buffer<< endl;
                        //cout << "\tUniqueProcessId:" << (int)pshi->Handles[i].UniqueProcessId << endl;
                        //cout << "\tCreatorBackTraceIndex:" << (int)pshi->Handles[i].CreatorBackTraceIndex << endl;
                        //cout << "\tObjectTypeIndex:" << (int)pshi->Handles[i].ObjectTypeIndex << endl;
                        //cout << "\tHandleAttributes:" << (int)pshi->Handles[i].HandleAttributes << endl;
                        //cout << "\tHandleValue:" << (int)pshi->Handles[i].HandleValue << endl;
                        //cout << "\tObject:" << hex << (int)pshi->Handles[i].Object << endl;
                        //cout << "\tGrantedAccess:" << hex << (int)pshi->Handles[i].GrantedAccess << endl;
                        DWORD 句柄目标进程PID = HandleToPid(newHandle);// (HANDLE)pshi->Handles[i].HandleValue);
                        wprintf(L"<szType=%s szName=%s> Process句柄=%X  所属进程=%d 句柄目标进程PID=%d\n\n",                                
                                szType->Name.Buffer,
                                szName->Name.Buffer,
                                pshi->Handles[i].HandleValue,                                 
                                pshi->Handles[i].UniqueProcessId,
                                句柄目标进程PID);
                        //getchar();
                }//if1

                } //--if2

               
                }

        }//end for
        printf("Line=%d\n", __LINE__);
        getchar();
        free(szName);
        free(szType);
}
郁金香外挂教程,学习中...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|郁金香外挂技术-郁金香灬老师 ( 苏ICP备10059359号 )

GMT+8, 2021-11-27 07:31 , Processed in 0.045742 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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