Windows黑客基础(2):获取别的进程的HANDLE

在windows下,不管是进程仍旧句柄或然文件,他们都能够抽象为贰个HANDLE,倘诺有接触过linux编制程序的都知晓,linux下全方位皆文件,对经过,文件,socket的操作都以透过int来标识的,windows下的HANDLE概念也跟linux下的int概念差不离,都足以总结为类似与ID的数据类型,只是表示情势差别等,大家对于有所目的的操作都亟待经过那一个标识来传递

自然在WINDOWS下还包罗HICON,HWND等,超越百分之五十都是UI相关的,大家值必要明白HWND是操作窗口的标识符,HICON是图标的标识符,大家后边将会讲到怎么样通过窗口来操作别的进度

 

假如我们要操作别的的进程,首先需求的终将是要力所能及在协调的顺序中得到其余进度的标识符,在windows下为大家提供了OpenProcess那几个函数

HANDLE OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)

dwDesireAccess是操作权限,在本章节中设置为PROCESS_ALL_ACCESS

bInheritHandle,表示所收获的长河句柄是不是足以被持续

dwProcessID,那一个是最要害的,就是进度的ID

 

 

我们只要能想方法得到进度的ID就能够对该进程展开操作了,那么大家怎么获得进程的ID呢??

1.由此任务管理器

大家开拓职责管理器,点击菜单栏的查看->选拔列->把PID打上勾,然后大家重回职务管理器,有一行PID,正是大家须求的经过的ID了

图片 1

这一个时候大家只要透过那么些数值就可以调用OpenProcess来取得该进度的句柄了

HANDLE OpenProcessByID(const DWORD id)
{
    return OpenProcess(PROCESS_ALL_ACCESS,FALSE,id);
}

 

2.通过HWND,即窗口

WINDOWS提供了3个API来让大家找到3个历程的窗口句柄,即FindWindows,同时,我们得以通过GetWindowThreadProcessID,我们尽管传入通过FindWindow找到的HWND,然后传给GetWindowThreadProcessID就足以找到该进度的ID

HANDLE OpenProcessByWindowName(const char *name)
{
    HWND hWnd = FindWindow(NULL,name);

    if (hWnd != NULL)
    {
        DWORD ThreadID = -1;
        DWORD ProcessID = -1;
        ThreadID = GetWindowThreadProcessId(hWnd,&ProcessID);

        return OpenProcessByID(ProcessID);
    }
    return INVALID_HANDLE_VALUE;
}

3.查找进度名称
在Windows下,大家得以通过枚举系统全部进度的名称,然后依照进度的名目二个个地去相比较来找到呼应的过程ID

HANDLE OpenProcessByProcessNmae(const char *name)
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
    if (hSnapshot == INVALID_HANDLE_VALUE)
    {
        CloseHandle(hSnapshot);
        return INVALID_HANDLE_VALUE;
    }

    PROCESSENTRY32 pe32;
    DWORD id = 0;
    pe32.dwSize = sizeof(PROCESSENTRY32);

    if ( !Process32First(hSnapshot,&pe32) )
    {
        CloseHandle(hSnapshot);
        return INVALID_HANDLE_VALUE;
    }

    while ( 1 )
    {
        pe32.dwSize = sizeof(PROCESSENTRY32);
        if (Process32Next(hSnapshot,&pe32) == FALSE)
            break;

        if ( strcmp(pe32.szExeFile,name)==0 )
        {
            return OpenProcessByID(pe32.th32ProcessID);
        }
    }

    CloseHandle(hSnapshot);

    return INVALID_HANDLE_VALUE;
}

 

大家获得进度的句柄现在,大家就能够干大家接下去的事务了,比如代码注入,比如偷取数据等等的