键词:I/O Permission Bit Map、按键精灵、模拟键盘鼠标
今天又被恶心了,上班不想工作。来谈谈IoAccessMap相关的一些东西吧。
我在上一篇XTrap驱动分析的文章里面提到过,现在的一些模拟键盘鼠标输入的程序使用了一种所谓硬件模式的东西,例如按键精灵。其实就是使用了WinIo这样一些打开进程在Ring3访问端口权限的库。这里会详细分析一下他们的实现机制,以及对付这些工具的推荐方法。
首先摘抄一段WinIo驱动里面的代码:
case IOCTL_WINIO_ENABLEDIRECTIO:
OutputDebugString(“IOCTL_WINIO_ENABLEDIRECTIO”);
pIOPM = MmAllocateNonCachedMemory(sizeof(IOPM));
if (pIOPM)
{
RtlZeroMemory(pIOPM, sizeof(IOPM));
Ke386IoSetAccessProcess(PsGetCurrentProcess(), 1);
Ke386SetIoAccessMap(1, pIOPM);
}
else
Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
break;
ok,打开端口权限的所有秘密就在这里了。不过我们要先介绍一下Inter CPU对IoAccessMap的定义。
I386架构下,每个进程拥有的TSS块包含一个I/O Permission Bit Map,其中定义了该进程对各个端口的读写权限。I/O Permission Bit Map的每一位对应一个端口。例如和鼠标键盘相关的端口对应于bit60和bit64。另外,在EFLAGS寄存器中的bit12、bit13指示了IN, INS, OUT, OUTS, CLI, STI这几条指令需要的IOPL。当CPL大于IOPL时,IO访问时就会再查询I/O Permission Bit Map里面对应bit是否为0,如果为0则允许IO访问,否则会触发general-protection exception (#GP)。
所以,如果要打开某个进程的IO权限,只需要修改它的I/O Permission Bit Map就可以了。
Windows为每个进程保存的TSS结构如下:
typedef struct _KTSS {
USHORT Backlink;
USHORT Reserved0;
ULONG Esp0;
USHORT Ss0;
USHORT Reserved1;
ULONG NotUsed1[4];
ULONG CR3;
ULONG Eip;
ULONG EFlags;
ULONG Eax;
ULONG Ecx;
ULONG Edx;
ULONG Ebx;
ULONG Esp;
ULONG Ebp;
ULONG Esi;
ULONG Edi;
USHORT Es;
USHORT Reserved2;
USHORT Cs;
USHORT Reserved3;
USHORT Ss;
USHORT Reserved4;
USHORT Ds;
USHORT Reserved5;
USHORT Fs;
USHORT Reserved6;
USHORT Gs;
USHORT Reserved7;
USHORT LDT;
USHORT Reserved8;
USHORT Flags;
USHORT IoMapBase;
KIIO_ACCESS_MAP IoMaps[IOPM_COUNT];
//
// This is the Software interrupt direction bitmap associated with
// IO_ACCESS_MAP_NONE
//
KINT_DIRECTION_MAP IntDirectionMap;
} KTSS, *PKTSS;
其中的IOPM_COUNT定义为1。貌似本来Windows想为每个Process保存多个IoAccessMap,默认只保存了一个。在访问相关函数时,如果制定MapNumber为0,则表示不使用IoAccessMap。所以0号map是虚拟出来的,这点在wrk1.2代码中可以确认。
以下三个函数用于访问IoAccessMap:
BOOLEAN Ke386QueryIoAccessMap(ULONG MapNumber, PKIO_ACCESS_MAP IoAccessMap);用于查询IoAccessMap
BOOLEAN Ke386SetIoAccessMap(ULONG MapNumber, PKIO_ACCESS_MAP IoAccessMap);用于设置IoAccessMap
BOOLEAN Ke386IoSetAccessProcess(PKPROCESS Process, ULONG MapNumber);用于设置某个Process使用的IoAccessMap号
下面分别讲一下三个函数的作用。
Ke386QueryIoAccessMap将系统KTSS中的IoMaps复制出来,也就是查询当前的IoAccessMap。MapNumber传入Map号,当为0的时候表示指定IO_ACCESS_MAP_NONE,此时将传入IoAccessMap的所有位置1,当MapNumber为其他值时,复制对应的Map。
Ke386SetIoAccessMap将IoAccessMap中的内容复制到指定MapNumber的内容中,当为0时返回FALSE,当为其他合法值时,Ke386SetIoAccessMap会创建一个DPC,并在DPC中将IoAccessMap的内容复制到进程TSS的IoMaps中。
Ke386IoSetAccessProcess则是设置Process使用的IoAccessMap号。同样,会创建一个DPC,并由DPC修改指定进程的EPROCESS中的IopmOffset。
Ok,回过头来看WinIo的代码就一目了然了
pIOPM = MmAllocateNonCachedMemory(sizeof(IOPM));
if (pIOPM)
{
RtlZeroMemory(pIOPM, sizeof(IOPM));
Ke386IoSetAccessProcess(PsGetCurrentProcess(), 1);
Ke386SetIoAccessMap(1, pIOPM);
}
(来自:码农源库,http://www.vcclass.net/wordpress/?p=344)
分享到:
相关推荐
在IT领域,模拟按键精灵是一种自动化工具,常用于游戏或者应用程序中进行连续或重复的键盘操作,以此提高工作效率或实现特定任务。硬件模式的模拟按键精灵则是通过直接访问硬件I/O端口来实现对键盘输入的模拟,这种...
基于java的贝儿米幼儿教育管理系统答辩PPT.pptx
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
基于java的消防物资存储系统答辩PPT.pptx
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
TA_lib库(whl轮子),直接pip install安装即可,下载即用,非常方便,各个python版本对应的都有。 使用方法: 1、下载下来解压; 2、确保有python环境,命令行进入终端,cd到whl存放的目录,直接输入pip install TA_lib-xxxx.whl就可以安装,等待安装成功,即可使用! 优点:无需C++环境编译,下载即用,方便
使用软件自带的basic脚本编辑制作的脚本 低版本软件无法输出Excel报告,可以通过脚本方式实现这一功能
基于java的就业信息管理系统答辩PPT.pptx
25法理学背诵逻辑.apk.1g
基于java的大学生校园兼职系统答辩PPT.pptx
做到代码,和分析的源数据
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
适用于ensp已经入门人群的学习,有一定难度
基于java的数码论坛系统设计与实现答辩PPT.pptx
tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl
基于java的医院信管系统答辩PPT.pptx
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
tornado-4.2.tar.gz