最近因为爬虫登录的网站加了密码控件,尝试了很多方法都不能破解(该控件屏蔽了虚拟软键盘),寻找资料中发现了winIo这么工具,十几年前的东西了,它的官网貌似也处于游离状态,使用中也出现了很多问题,便以此mark一下。

最开始从这里获取到了winIo32实现驱动级键盘事件,但使用的是JNative(目前只支持32位),同时winIO32在64位的OS下运行有问题(本人测试过,可能过程中有没考虑到的原因,此文略过),所以采用winIo64+JNA来实现键盘的驱动级模拟。

在开始前,先申明一下所需要的环境和设备(本文主要在window7 64位环境下测试):

1.WinIo64.dll 和 WinIo64.sys(下载请见上面winIo32实现驱动级键盘事件的附件key文件夹)

2.因为WinIo库允许Windows应用程序中直接对I/O端口和物理内存进行存取操作,目前从网上找到的资料winio能模拟PS/2键盘输入(串口键盘),但USB设备的模拟暂时资料不详,所以此次以PS/2键盘模拟为例(必须链接PS/2键盘,否者模拟无效)。

3.WinIo64.sys签名:64位版本的Windows只加载设备驱动程序,这些驱动程序由一个公共CA签发的代码签名证书签署,如Verisign、Thawte等。WinIo64 除非获得了代码签名证书,否则系统不能部署在生产机器上。

a.开启测试模式

1)管理员模式运行cmd

2)在命令行输入:bcdedit /set TESTSIGNING ON

3)重启电脑,桌面右下角会出现测试模式。

b.完成winIO64的签名认证:

1.打开 WinIO64.sys的属性框,翻到“数字签名”选项卡,点击“详细信息”
            2.在新出来的对话框中点击“查看证书”
            3.在又新出来的对话框中点击“安装证书”
            4.点击“下一步”,然后选择“将所有的证书放入下列存储”
            5.点击浏览,选择“受信任的根证书发布机构”

4.需要jna相关的jar,自行下载。本示例jdk:1.8 64位。

接下来,贴出代码:

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;public class Selenium {private Robot robot = null;//此处用robot去移动鼠标,可忽略public static final int CONTROL_PORT = 0x64;public static final int DATA_PORT = 0x60;public static final Map<String,Integer> map=new HashMap();public Selenium(){try {robot = new Robot();} catch (AWTException e) {e.printStackTrace();}} static{map.put("0", KeyEvent.VK_0);map.put("1", KeyEvent.VK_1);map.put("2", KeyEvent.VK_2);map.put("3", KeyEvent.VK_3);map.put("4", KeyEvent.VK_4);map.put("5", KeyEvent.VK_5);map.put("6", KeyEvent.VK_6);map.put("7", KeyEvent.VK_7);map.put("8", KeyEvent.VK_8);map.put("9", KeyEvent.VK_9);map.put("a", KeyEvent.VK_A);map.put("b", KeyEvent.VK_B);map.put("c", KeyEvent.VK_C);map.put("d", KeyEvent.VK_D);map.put("e", KeyEvent.VK_E);map.put("f", KeyEvent.VK_F);map.put("g", KeyEvent.VK_G);map.put("h", KeyEvent.VK_H);map.put("i", KeyEvent.VK_I);map.put("j", KeyEvent.VK_J);map.put("k", KeyEvent.VK_K);map.put("l", KeyEvent.VK_L);map.put("m", KeyEvent.VK_M);map.put("n", KeyEvent.VK_N);map.put("o", KeyEvent.VK_O);map.put("p", KeyEvent.VK_P);map.put("q", KeyEvent.VK_Q);map.put("r", KeyEvent.VK_R);map.put("s", KeyEvent.VK_S);map.put("t", KeyEvent.VK_T);map.put("u", KeyEvent.VK_U);map.put("v", KeyEvent.VK_V);map.put("w", KeyEvent.VK_W);map.put("x", KeyEvent.VK_X);map.put("y", KeyEvent.VK_Y);map.put("z", KeyEvent.VK_Z);map.put("Tab", KeyEvent.VK_TAB);map.put("Space", KeyEvent.VK_SPACE);map.put("Shift", KeyEvent.VK_SHIFT);map.put("Cntl", KeyEvent.VK_CONTROL);map.put("Alt", KeyEvent.VK_ALT);map.put("F1",KeyEvent.VK_F1);map.put("F2",KeyEvent.VK_F2);map.put("F3",KeyEvent.VK_F3);map.put("F4",KeyEvent.VK_F4);map.put("F5",KeyEvent.VK_F5);map.put("F6",KeyEvent.VK_F6);map.put("F7",KeyEvent.VK_F7);map.put("F8",KeyEvent.VK_F8);map.put("F9",KeyEvent.VK_F9);map.put("F10",KeyEvent.VK_F10);map.put("F11",KeyEvent.VK_F11);map.put("F12",KeyEvent.VK_F12);}//使用User32库里面键位值转换public interface User32 extends StdCallLibrary{User32 Instance = (User32)Native.loadLibrary("User32",User32.class);int MapVirtualKeyA(int key, int type);}//此处是winIo使用关键public interface WinIo extends StdCallLibrary{WinIo Instance = (WinIo)Native.loadLibrary("WinIo64",WinIo.class);     boolean InitializeWinIo();boolean GetPortVal(int portAddr, int pPortVal, int size);boolean SetPortVal(int portAddr, int portVal, int size) ;void ShutdownWinIo();}//将虚拟键位值转成扫描码public static int toScanCode(String key){try {return User32.Instance.MapVirtualKeyA(map.get(key).intValue(),0);} catch (Exception e) {return 0;}}public static void KBCWait4IBE() throws Exception{int val=0;do {if(!WinIo.Instance.GetPortVal(CONTROL_PORT,val, 1)){System.err.println("Cannot get the Port");}} while ((0x2&val)>0);         }public static void KeyDown(int key) throws Exception{KBCWait4IBE();WinIo.Instance.SetPortVal(WinIOAPI.CONTROL_PORT,0xD2,1);KBCWait4IBE();WinIo.Instance.SetPortVal(WinIOAPI.DATA_PORT,key,1);}public static void KeyUp(int key) throws Exception{KBCWait4IBE();WinIo.Instance.SetPortVal(WinIOAPI.CONTROL_PORT,0xD2,1);KBCWait4IBE();WinIo.Instance.SetPortVal(WinIOAPI.DATA_PORT,(key|0x80),1);       }public void mouseDemo() throws InterruptedException{robot.mouseMove(500, 290);Thread.sleep(650);robot.mousePress(KeyEvent.BUTTON1_MASK);Thread.sleep(150);robot.mouseRelease(KeyEvent.BUTTON1_MASK);Thread.sleep(999);System.out.println("鼠标点击完毕");}public static void main(String[] args) throws Exception{  //System.setProperty("webdriver.ie.driver", "D:/IEDriverServer.exe");//WebDriver dr = new InternetExplorerDriver();// 打开网站//dr.get("https://www.hao123.com");// 获取源代码//System.out.println("--"+dr.getPageSource());//Selenium se = new Selenium();//se.mouseDemo();System.out.println("winIO64初始化是否成功:"+WinIo.Instance.InitializeWinIo());//此处应该有判断,只有初始化成功才可继续往下走,否者直接终止Thread.sleep(1000);String s="helloworld";for (int i = 0; i < s.length(); i++) {KeyDown(toScanCode(""+s.charAt(i)));Thread.sleep(10);KeyUp(toScanCode(""+s.charAt(i)));Thread.sleep(200);}WinIo.Instance.ShutdownWinIo();// 关闭//System.out.println(dr.getPageSource());//Thread.sleep(20000);  //dr.quit();
}
}

说明:代码中有使用selenium工具,一种自动化网页测试的工具,可自行注释掉,不影响执行,关于代码中scancode可以自行查找相关资料。

关于代码中如果winIO64初始化失败的问题,首先检查2个winio的文件路径是否正确,我习惯放在jdk的java/bin下,其次执行这段代码必须是管理员的权限,用IDE的童靴请自行用管理员启动IDE。

结语:

本方法仅适用于个人需求,对于上生产环境使用作用不大,而且涉及的问题较多,主要是得有ps/2键盘

2018-05-16 add:无意中发现笔记本上的键盘就是PS/2,呵呵呵呵呵!!!

WinIo64驱动级别的键盘模拟(java)相关推荐

  1. 驱动级键盘模拟(C#)修复源码下载(转)

    游戏外挂一般分为三个级别:初级是鼠标.键盘模拟,中级是Call游戏内部函数,读写内存,高级是抓包,封包的"脱机挂"(完全模拟客户端网络数据,不用运行游戏).用C#写外挂的不是很多, ...

  2. 驱动级键盘模拟(C#)

    游戏外挂一般分为三个级别:初级是鼠标.键盘模拟,中级是Call游戏内部函数,读写内存,高级是抓包,封包的"脱机挂"(完全模拟客户端网络数据,不用运行游戏).用C#写外挂的不是很多, ...

  3. 驱动级键盘模拟(C#)(高手请飘过)

    游戏外挂一般分为三个级别:初级是鼠标.键盘模拟,中级是Call游戏内部函数,读写内存,高级是抓包,封包的"脱机挂"(完全模拟客户端网络数据,不用运行游戏).用C#写外挂的不是很多, ...

  4. 电子琴仿真c语言程序,矩阵键盘模拟电子琴C语言程序设计

    原标题:矩阵键盘模拟电子琴C语言程序设计 //24c08地址为0xa0 #include #define uchar unsigned char unsigned char code table[]= ...

  5. 前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

    文章目录 6. 控制台打印(Console) 模拟Java日志打印格式 美化对象打印(表格形式打印输出) 日志等级输出(让其在控制台显示时有颜色提示) 代码运行时间统计打印输出   6. 控制台打印( ...

  6. 模拟鼠标键盘html,模拟按键操作神器(鼠标键盘模拟操作助手)V2.0.2.1 正式版

    模拟按键操作神器(鼠标键盘模拟操作助手)是一款很优秀好用的由网友自制的模拟按键操作的辅助工具.如果你需要一款好用的键盘模拟软件,小编带来的这款模拟按键操作神器是很不错的选择,功能强大全面,使用后可以帮 ...

  7. python实现按键精灵的功能_利用Python实现Windows下的鼠标键盘模拟的实例代码

    本文介绍了利用Python实现Windows下的鼠标键盘模拟的实例代码,分享给大家 本来用按键精灵是可以实现我的需求,而且更简单,但既然学python ,就看一下呗. 依赖: pip install ...

  8. Control Study - 键盘模拟鼠标(实现用键盘操作鼠标光标)(示例代码下载)

    (一).功能 实现用键盘模拟鼠标移动的功能,在游戏设计中常用到 *操作说明:  当运行程序后,放开鼠标,按键盘上的光标键移动,可以代替鼠标. (二).代码   1  using  System;    ...

  9. vba模拟鼠标点击_鼠标键盘模拟大师下载_鼠标键盘模拟大师免费版官方下载6.2...

    鼠标键盘模拟大师是目前国内唯一一款将鼠标自动点击.键盘自动输入.网页自动刷新和自动切换IP地址等功能完美结合与一体的鼠标键盘动作模拟软件,可以实现桌面及游戏的自动点击和按键点击等功能,有需要的小伙伴快 ...

最新文章

  1. 选IDC房时,用脚本截取丢失包和rtt的值作比对
  2. 网页开发--html js
  3. Android软键盘隐藏,遮挡EidtText解决办法
  4. C/C++程序基础 (九)排序算法简述
  5. 8、HTML <table>标签(表格)
  6. 详解Windows内存分页机制
  7. linux命令之awk终极系列
  8. DISPLAY变量和xhost(原创)
  9. wps如何用循环函数_wps表格函数怎么用 wps表格函数的简单用法分享
  10. python爬虫requests设置代理ip_Python爬虫技巧-设置代理IP
  11. 图解PC CPU发展史
  12. c语言编程定位的计算机,高校计算机专业C语言教学的四个定位
  13. Web开发学习总结1_网络通信
  14. 我对于测试团队建设的意见
  15. 【广度优先搜索-中等】1905. 统计子岛屿
  16. p,np,npc,np难问题,确定图灵机与非确定图灵机
  17. CAD画图 ——基础和直线
  18. mysql如何降级_降级MySQL(参考MySQL官方文档)
  19. 看我如何玩转PHP代码加密与解密
  20. 15 OpenCV4图像处理与视频分析实战(49.基于颜色的对象跟踪-.)

热门文章

  1. 从FTP模块学习先进的诊断技术(Erlang Trace机制)
  2. 哈工大2019计算机专业录取分数线,哈尔滨工业大学2019年录取分数线
  3. STM32F0xx_TIM输入捕获(计算频率)配置详细过程
  4. 计算机考试反思1000,计算机考试作弊检讨书1000字.docx
  5. 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第六节)
  6. 设计师必读的 10 本书
  7. 汶川地震凸现网络力量
  8. 【广告联盟电商SEO】广告联盟网站收集
  9. ios使用js日期函数处理时的问题
  10. 清理好桌道壁纸右键菜单