拦截鼠标双击创建进程的动作

0 前言

  最近公司要写一个监控explorer创建进程的东西, 所以花了点时间研究了以下, 然后有了以下的成果

1 思路

  <1>核心思想:

    注入dll, hook创建进程的底层函数, 实现创建创建进程的拦截

  <2>需要注入的进程

    经研究发现在开启UAC的情况下, 创建受限权限进程的动作是在explorer中由CreateProcessW这个函数执行的.

    创建管理员权限的进程却是explorer委托appinfo服务创建, 然后将父进程的pid设置为explorer完成, 执行函数是CreateProcessAsUser

  <3>选择hook的函数

    调试器跟踪了一下这俩函数的实现, 发现底层有一个公共的函数CreateProcessInternalW, 这是一个不公开的导出函数, 因此选择这个作为hook函数

    注意, win7 及win8-win10hook的这个函数位置是有区别的, 前者是在kernel32.dll里, 后者却是在kernelbase.dll

  <4>注入方法

    常规的CreatRemoteThread loadlibrary组合在注入appinfo时候会失败, 在win7注入explorer中貌似也会失败, 通过测试发现使用更底层的ntdll中函数RtlCreateUserThread LdrLoadDll 是会百分百成功的, 暂时没有细究前面的组合失败的原因,

    由于后面的组合需要用到的参数多于1个, 因此必须采用注入一段二进制代码的方式的方式调用这个函数组合, 以此来加载我们要注入的dll, 这其中需要跟踪这些函数的实现来找出函数的原型, 同时注意远程线程函数的的调用约定,

    编写二进制代码的方法可以参考我之前引用别人的一篇文章 https://www.cnblogs.com/talenth/p/9141361.html, 不过这个人写的不太好, 个人感觉没有必要调用RtlExitUserThread, 他调用这个估计是怕线程函数可能出现的堆栈不平衡问题

  <5>执行注入进程的权限

    一般管理员权限+调试权限

  <6>卸载注入的dll

    也是要使用ntdll中RtlCreateUserThread , LdrUnloadDll 这个组合, 原因跟注入类似, 在此不再赘述

  <6>其他一些与主题无关但也比较重要的细节

    appinfo属于服务进程, 在win7之后, 服务进程跟桌面进程有会话隔离的, 因此服务创建当前用户会话的进程一个关键点是要找到对应于这个用户的token, 跟踪了一下appinfo的这个过程, 发现他这个token是把自身token拷贝了一份, 然后降权,把自身临时转换成当前用户后实现的, 也就是说, 按照上面说的, 拦截下来的时候, appinfo本身是只有管理员权限的

    被注入的进程必须与要注入的dll的平台一致, 也就是说, x86的dll只能注入到x86的进程中, 不能注入到x64的进程中

    而执行注入动作的进程可以跟被注入的进程不同, 除了同平台的注入之外, x86注入x64dll到x64进程也是可以的, 不过需要借助wow64ext这个库实现, 另一种没有应用环境, 因此也没有大神去研究,^_^

    hook库可以使用MinHook这个库, 稳定高效

原文地址:https://www.cnblogs.com/talenth/p/9241266.html

时间: 2024-10-28 23:31:06

拦截鼠标双击创建进程的动作的相关文章

Hook 简单的实例--拦截鼠标和键盘消息(一)

Hook(钩子)就是对Windows系统的一些消息或是API函数进行拦截和监控的处理平台,让可以根据程序员的设置获取其感兴趣的信息. 这里主要是介绍一下Hook拦截鼠标消息和键盘消息. 下面是CALLBACK Proc 回调函数 和 CallNextHookEx函数 LRESULT CALLBACK HookProc ( int nCode, //指定是否需要处理该消息 WPARAM wParam, LPARAM lParam //包含该消息的附加消息 , ); 这个回调函数的名字可以随你取,但

用VBS控制鼠标(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击、鼠标右击)

Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog  ?  程序设计  ?  用VBS控制鼠标(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击) ? bbPress积分插件--Virtual Money VBS调用WMI监视注册表变动 ? 用VBS控制鼠标(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击) 标题: 用VBS控制鼠标(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击)作者: Demon链接: http://demon.tw/programm

用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击)

网上搜到的答案普遍是VBS无法实现,或者是要用第三方COM(ActiveX?)组件.我对第三方组件是很反感的,使用第三方组件毫无可移植性可言,因为别人的系统中不一定注册了这个组件.我的建议是,尽量不要在VBS代码中调用第三方组件,除非你的程序只是写来自己用.(顺便说一下,也尽量不要用不靠谱的Sendkeys方法,原因不解释) 好了,废话就说这么多,现在说说用VBS控制鼠标的方法.我以前写过一篇<VBS调用Windows API函数>,本以为既然都能调用API了,用VBS控制鼠标还不是很简单是事

零基础逆向工程39_Win32_13_进程创建_句柄表_挂起方式创建进程

1 进程的创建过程 打开系统 --> 双击要运行的程序 --> EXE开始执行 步骤一: 当系统启动后,创建一个进程:Explorer.exe(也就是桌面进程) 步骤二: 当用户双击某一个EXE时,Explorer 进程使用CreateProcess函数创建被双击的EXE,也就是说,我们在桌面上双 击创建的进程都是Explorer进程的子进程. CreateProcess BOOL CreateProcess( LPCTSTR lpApplicationName, // name of exe

9.swoole学习笔记--创建进程

<?php //进程数组 $workers=[]; //创建进程的数据量 $worker_num=3; //创建启动进程 for($i=0;$i<$worker_num;$i++){ //创建单独新进程 $process=new swoole_process("doProcess"); //启动进程并获取进程id $pid=$process->start(); //存入进程数组 $workers[$pid]=$process; } //创建进程对应的执行函数 func

创建多个动作:

右键点击项目名称,并单击"导出"> WAR文件创建一个WAR文件.然后这WAR部署在Tomcat的webapps目录下.最后启动Tomcat服务器,并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp.这会给你以下画面: 让我们一起进入一个"SECRET"的话,你应该看到下面的页面: 现在输入任何文字以外的"SECRET",你应该看到下面的页面: 创建多个动作: 我们通常会定义

实现DevExpress GridControl 只有鼠标双击后才进行修改数据

1. 实现DevExpress GridControl 只有鼠标双击后才进行修改数据:修改GridView.OptionsBehavior.EditorShowMode属性为Click 2. 实现DevExpress GridControl 只有鼠标双击后才进行修改数据:修改GridView.OptionsBehavior.EditorShowMode属性为MouseDownFocused 然后实现下面代码: private void gridView1_MouseDown(object sen

创建进程的函数

clone().fork().vfork()都是Linux的系统调用. 进程一般由代码段.数据段和PCB进程控制块组成. fork 创造的子进程复制了父亲进程的资源,包括内存的内容task_struct内容,新旧进程使用同一代码段,复制数据段和堆栈段,这里的复制采用了注明的copy_on_write技术,即一旦子进程开始运行,则新旧进程的地址空间已经分开,两者运行独立. 优点是子进程的执行独立于父进程,具有良好的并发性. 缺点是两者的通信需要专门的通信机制,如pipe.fifo和system V

Java中如何创建进程(转)

在Java中,可以通过两种方式来创建进程,总共涉及到5个主要的类. 第一种方式是通过Runtime.exec()方法来创建一个进程,第二种方法是通过ProcessBuilder的start方法来创建进程.下面就来讲一讲这2种方式的区别和联系. 首先要讲的是Process类,Process类是一个抽象类,在它里面主要有几个抽象的方法,这个可以通过查看Process类的源代码得知: 位于java.lang.Process路径下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15