zoukankan      html  css  js  c++  java
  • 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了

    这个时候我们只要通过这个数值就可以调用OpenProcess来获取该进程的句柄了

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

    2.通过HWND,即窗口

    WINDOWS提供了一个API来让我们找到一个进程的窗口句柄,即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;
    }

    我们拿到进程的句柄以后,我们就可以干我们接下来的事情了,比如代码注入,比如偷取数据之类的

  • 相关阅读:
    5月13日工作日志(需求规格说明书4.0)
    第十次会议
    5月21日日志
    5月12日工作日志
    关于游戏平衡性——王者荣耀英雄伤害数值参考
    每天一点新东西(1)
    我在都匀做网优(补)
    我在都匀做网优
    不算新的开始
    input的focus事件时,鼠标光标在最后
  • 原文地址:https://www.cnblogs.com/linyilong3/p/3132666.html
Copyright © 2011-2022 走看看