当前位置: 首页 > news >正文

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;
}

 

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

 

 

转载于:https://www.cnblogs.com/linyilong3/archive/2013/06/12/3132666.html

相关文章:

  • EOF 后面的空格
  • ACM半路失踪~我去找WEB了
  • 升级CentOS5.6_X64 python2.4.3到2.7
  • php 数据库连接类
  • C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容...
  • NAT后面的FTP SERVER终极篇
  • 2(4).选择排序_快排(双向循环链表)
  • 多线程BackgroundWorker
  • Deep Learning(3)算法简介
  • FREESWITCH SEESION
  • Java程序员面试中的多线程问题
  • 编写安装配置LAMP服务脚本
  • 库存属性控制
  • aircrack-ng-1.1.
  • poj 2689 Prime Distance (素数二次筛法)
  • Android 架构优化~MVP 架构改造
  • Brief introduction of how to 'Call, Apply and Bind'
  • Druid 在有赞的实践
  • exif信息对照
  • Java超时控制的实现
  • mysql中InnoDB引擎中页的概念
  • MySQL主从复制读写分离及奇怪的问题
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Phpstorm怎样批量删除空行?
  • XForms - 更强大的Form
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 构造函数(constructor)与原型链(prototype)关系
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 码农张的Bug人生 - 见面之礼
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 小程序测试方案初探
  • 一天一个设计模式之JS实现——适配器模式
  • 2017年360最后一道编程题
  • AI算硅基生命吗,为什么?
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 进程与线程(三)——进程/线程间通信
  • ###项目技术发展史
  • #Linux(帮助手册)
  • (Note)C++中的继承方式
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读30/100)Convolutional Pose Machines
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .Net 8.0 新的变化
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Core引入性能分析引导优化
  • .Net Core与存储过程(一)
  • .net framework profiles /.net framework 配置
  • .net 程序发生了一个不可捕获的异常
  • .NET 中创建支持集合初始化器的类型
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...