模拟按键
2015-09-16 11:46
239 查看
An application can simulate a press of the PRINTSCREEN key in order to obtain a screen snapshot and save it to the clipboard. To do this, call keybd_event with
the bVk parameter set to VK_SNAPSHOT, and the bScan parameter
set to 0 for a snapshot of the full screen or set bScan to 1 for a snapshot
of the active window.
procedure TForm1.Button1Click(Sender: TObject);
begin
// PrintScreen
keybd_event(VK_SNAPSHOT, 0, 0, 0);
end;
1、系统API函数,按键模拟类的API函数有KeyBoard_Event(键盘模拟)、Mouse_Event(鼠标模拟)、SetCursor(模拟鼠标移动)、SendInput() 、SendMessage(发送消息)PutMessage(发送消息)。这种封API函数的方法在NP早期被应用,主要手段是通过钩子函数修改API的CALL地址。但这种手段很快被人破解,破解方法有2种,1种方法是移植这些API函数的代码(具体移植方法请见相关的专业资料)我曾用这方法,把整个kernel32.dll系统库文件更名复制,然后调用该库的API,从而绕过NP;
第2种方法是使用WINIO.SYS驱动,硬件模拟按键动作(此驱动只支持8042端口,即只能模拟PS2键盘鼠标动作)。
2、鉴于上面原因,NP不再封系统API,而是封按键模拟相关的内核API。移植系统API来模拟按键就不能实现了,因为移植的系统API最终要调用内核API。这样留给我们的工作只能是通过驱动硬件来模拟按键动作了。
3、网上流行的硬件模拟是通过对8042端口驱动来实现的,这种操作端口来实现硬件模拟的方法必须要在系统RING0层才能进行。所以,这类操作都必须通过驱动或中断程序来实现。目前网络上流行的端口操作驱动程序有2种:WINIO.SYS及PortTalk.SYS,WINIO.SYS操作端口效率较高。
它们的主要缺陷是只能模拟PS2的键盘、鼠标,当键盘或鼠标是USB的,或者频繁模拟鼠标时就会出现卡死现象。但这类操作端口的模拟也没长久,NP也把这类模拟给封了。封的办法很简单,这2个驱动特征太明显了:WINIO把端口操作从RING0层暴露给RING3层,这样的暴露给系统安全
带来隐患,所以有的杀毒软件会对WINIO进行查杀!NP封这种具有典型特征驱动程序易如反掌;PortTalk是用户级驱动程序,可以通过调用DeviceIoControl函数来操作端口,但正因是用户级驱动,其发出IRP在下传时容易被NP截获屏蔽。
这样NP给我们剩下的操作空间就不多了:
1、改写或移植内核API,这种方法因系统及版本不同实现起来相当困难,极容易造成机器死机。2、虚拟一个设备,通过该设备驱动程序来操作端口,最好是将其设备虚拟成键盘和鼠标设备。这种方法可行,因为NP难以实现封设备驱动(封错了机器就死机了)。但这方法也有缺陷,驱动程序需要安装,安装弹出微软的认证签名窗口(未经签名存在安全问题),这对许多用户来说是难以接受的。
the bVk parameter set to VK_SNAPSHOT, and the bScan parameter
set to 0 for a snapshot of the full screen or set bScan to 1 for a snapshot
of the active window.
procedure TForm1.Button1Click(Sender: TObject);
begin
// PrintScreen
keybd_event(VK_SNAPSHOT, 0, 0, 0);
end;
1、系统API函数,按键模拟类的API函数有KeyBoard_Event(键盘模拟)、Mouse_Event(鼠标模拟)、SetCursor(模拟鼠标移动)、SendInput() 、SendMessage(发送消息)PutMessage(发送消息)。这种封API函数的方法在NP早期被应用,主要手段是通过钩子函数修改API的CALL地址。但这种手段很快被人破解,破解方法有2种,1种方法是移植这些API函数的代码(具体移植方法请见相关的专业资料)我曾用这方法,把整个kernel32.dll系统库文件更名复制,然后调用该库的API,从而绕过NP;
第2种方法是使用WINIO.SYS驱动,硬件模拟按键动作(此驱动只支持8042端口,即只能模拟PS2键盘鼠标动作)。
2、鉴于上面原因,NP不再封系统API,而是封按键模拟相关的内核API。移植系统API来模拟按键就不能实现了,因为移植的系统API最终要调用内核API。这样留给我们的工作只能是通过驱动硬件来模拟按键动作了。
3、网上流行的硬件模拟是通过对8042端口驱动来实现的,这种操作端口来实现硬件模拟的方法必须要在系统RING0层才能进行。所以,这类操作都必须通过驱动或中断程序来实现。目前网络上流行的端口操作驱动程序有2种:WINIO.SYS及PortTalk.SYS,WINIO.SYS操作端口效率较高。
它们的主要缺陷是只能模拟PS2的键盘、鼠标,当键盘或鼠标是USB的,或者频繁模拟鼠标时就会出现卡死现象。但这类操作端口的模拟也没长久,NP也把这类模拟给封了。封的办法很简单,这2个驱动特征太明显了:WINIO把端口操作从RING0层暴露给RING3层,这样的暴露给系统安全
带来隐患,所以有的杀毒软件会对WINIO进行查杀!NP封这种具有典型特征驱动程序易如反掌;PortTalk是用户级驱动程序,可以通过调用DeviceIoControl函数来操作端口,但正因是用户级驱动,其发出IRP在下传时容易被NP截获屏蔽。
这样NP给我们剩下的操作空间就不多了:
1、改写或移植内核API,这种方法因系统及版本不同实现起来相当困难,极容易造成机器死机。2、虚拟一个设备,通过该设备驱动程序来操作端口,最好是将其设备虚拟成键盘和鼠标设备。这种方法可行,因为NP难以实现封设备驱动(封错了机器就死机了)。但这方法也有缺陷,驱动程序需要安装,安装弹出微软的认证签名窗口(未经签名存在安全问题),这对许多用户来说是难以接受的。
相关文章推荐
- 一条SQL查询MYSQL最大内存用量
- mysql查询按照in里面的数据排序
- java 读取mysql中数据 并取出
- android 系统优化包括哪些方面
- m802 codec无法录音补丁
- android 第二更(后台判断网络状态,反馈到页面)
- Hibernate named query examples
- 枚举用法实例
- 设计模式之4 抽象工厂
- Android中设置TextView的颜色setTextColor
- NMAP 扫描端口速度快
- 基于百度地图定位SDK进行简单的定位
- Sum-1844
- SQL题目备忘
- openerp编辑与非编辑下隐藏按钮的方法
- DNS(bind)服务
- php 将excel文件写到word中
- Android日志打印命令
- Python调用第三方接口实现nagios短信报警
- 安卓学习之路之数据存储方式之SharedPreferences