当前位置: 首页 > 编程日记 > 正文

C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码)

自动填密码大家可能都不莫生,最有名的应该是 按键精灵 只要是一个可以输入的地方都可以能过按键精灵来完成输入.我今天要讲的是使用 winio/winring0来完成类似的功能

如果要自动填充密码方式基本上有 消息级的模拟 和 驱动级的模拟,

消息级的模拟如 C# 直接使用 SendKeys 就可以完成 API下可以使用 SendMessage完成 即有了这个神器为什么还要用三方?

答案:现在一些网都使用了ActiveX安全插件,如网银,支付宝,等,还有我们上一次说到的 翼支付和手机支付 它们基本上屏蔽了 SendMessage 有些就算可以使用但是不能得到正确的加密数据.还有更可气的是 在服务器远程操作中手动输入都不能输入密码.

驱动级的就是硬盘的模拟 模拟键盘,大牛们可以直接操作  I/O 我这里讲的是使用三方类库来完成,

第一个是 winIO 在XP时候我一直使用它,但到了  win7+64位模式下使用有点小问题,winIO 64位下驱动数字签名有点问题不能直接运行,需要将 win7转到测试模式下,安装数字证书而用程序还要在测试模式使用,如果是自己有可以凑合着,如果是给客户去使用,客户绝对会说你脑残,我运行个程序还要调这调那,当然是不愿意了.

我现在就以 32位模式下来演示如何使用 winIO,首先是下载winIO 最新版本为 3.0 网官下载地址 http://www.internals.com/

解压后,得到上图所示的文件 这个地方有用的 就是最后4个文件其它的是源文件和例子帮助文件之类的,

跟据系统的不同来使用不同的文件 如果是  32位的就使用32结尾的两个.呵呵 直接把这两个放到你开发目录下的 bin/release 或 bin/debug下面就行了

然后就是调用

 public class WinIO {public const int KBC_KEY_CMD = 0x64;//输入键盘按下消息的端口public const int KBC_KEY_DATA = 0x60;//输入键盘弹起消息的端口
[DllImport("WinIo32.dll")]public static extern bool InitializeWinIo();[DllImport("WinIo32.dll")]public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);[DllImport("WinIo32.dll")]public static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize);[DllImport("WinIo32.dll")]public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);[DllImport("WinIo32.dll")]public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);[DllImport("WinIo32.dll")]public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);[DllImport("WinIo32.dll")]public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);[DllImport("WinIo32.dll")]public static extern void ShutdownWinIo();[DllImport("user32.dll")]public static extern int MapVirtualKey(uint Ucode, uint uMapType);private WinIO() {IsInitialize = true;}public static void Initialize() {if (InitializeWinIo()) {KBCWait4IBE();IsInitialize = true;}}public static void Shutdown() {if (IsInitialize)ShutdownWinIo();IsInitialize = false;}private static bool IsInitialize { get; set; }///等待键盘缓冲区为空private static void KBCWait4IBE() {int dwVal = 0;do {bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);}while ((dwVal & 0x2) > 0);}/// 模拟键盘标按下public static void KeyDown(Keys vKeyCoad) {if (!IsInitialize) return;int btScancode = 0;btScancode = MapVirtualKey((uint)vKeyCoad, 0);KBCWait4IBE();SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);KBCWait4IBE();SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);KBCWait4IBE();SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);KBCWait4IBE();SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);}/// 模拟键盘弹出public static void KeyUp(Keys vKeyCoad) {if (!IsInitialize) return;int btScancode = 0;btScancode = MapVirtualKey((uint)vKeyCoad, 0);KBCWait4IBE();SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);KBCWait4IBE();SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);KBCWait4IBE();SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);KBCWait4IBE();SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);}}

上面这个类也是网上搜出来的,感觉前辈们的分享.此处只模拟了键盘的 按下和弹起

使用实例

 String pass = "123456";foreach (char chr in pass) {WinIO.KeyDown((Keys)chr);Thread.CurrentThread.Join(100);WinIO.KeyUp((Keys)chr);Thread.CurrentThread.Join(100);}Thread.CurrentThread.Join(100);WinIO.Shutdown();

这个地方按下的时候,稍停下,弹起也一样
这样的话 winIO 的调用就完成了

另一个神器就是 WinRing0 这个是一个开源的项目,可以通杀 32 64位系统, 不需要为驱动安装数字签名,自从发现了这个以后,我所有的需要自动填密码的项目都使用了它

虽说开源,但是这个在网上的使用文档还是比较少,有的都是自带的一些文档和使用实例没有特殊意义的例子,说实话,这项目的找了好久才找到下载地址,大家如需要就留个邮箱,

我看到后就发给你

我们打开 release目录,

复制相关的文件到你的工作开发目录下.

source\sample\Cs\OpenLibSys.cs 找到这个cs文件,这个是官方的所有的功能的封装,包括 I/O PCI CPU 等操作.把它加到我们的工程项目中

新建一个类 WinRing 代码如下

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
using OpenLibSys;class WinRing {public enum Key {ABSOLUTE = 0x8000,LEFTDOWN = 2,LEFTUP = 4,MIDDLEDOWN = 0x20,MIDDLEUP = 0x40,MOVE = 1,RIGHTDOWN = 8,RIGHTUP = 0x10,VIRTUALDESK = 0x4000,VK_A = 0x41,VK_ADD = 0x6b,VK_B = 0x42,VK_BACK = 8,VK_C = 0x43,VK_CANCEL = 3,VK_CAPITAL = 20,VK_CLEAR = 12,VK_CONTROL = 0x11,VK_D = 0x44,VK_DECIMAL = 110,VK_DELETE = 0x2e,VK_DIVIDE = 0x6f,VK_DOWN = 40,VK_E = 0x45,VK_END = 0x23,VK_ESCAPE = 0x1b,VK_EXECUTE = 0x2b,VK_F = 70,VK_F1 = 0x70,VK_F10 = 0x79,VK_F11 = 0x7a,VK_F12 = 0x7b,VK_F2 = 0x71,VK_F3 = 0x72,VK_F4 = 0x73,VK_F5 = 0x74,VK_F6 = 0x75,VK_F7 = 0x76,VK_F8 = 0x77,VK_F9 = 120,VK_G = 0x47,VK_H = 0x48,VK_HELP = 0x2f,VK_HOME = 0x24,VK_I = 0x49,VK_INSERT = 0x2d,VK_J = 0x4a,VK_K = 0x4b,VK_L = 0x4c,VK_LBUTTON = 1,VK_LEFT = 0x25,VK_M = 0x4d,VK_MBUTTON = 4,VK_MENU = 0x12,VK_N = 0x4e,VK_NEXT = 0x22,VK_NULTIPLY = 0x6a,VK_NUM0 = 0x30,VK_NUM1 = 0x31,VK_NUM2 = 50,VK_NUM3 = 0x33,VK_NUM4 = 0x34,VK_NUM5 = 0x35,VK_NUM6 = 0x36,VK_NUM7 = 0x37,VK_NUM8 = 0x38,VK_NUM9 = 0x39,VK_NUMLOCK = 0x90,VK_NUMPAD0 = 0x60,VK_NUMPAD1 = 0x61,VK_NUMPAD2 = 0x62,VK_NUMPAD3 = 0x63,VK_NUMPAD4 = 100,VK_NUMPAD5 = 0x65,VK_NUMPAD6 = 0x66,VK_NUMPAD7 = 0x67,VK_NUMPAD8 = 0x68,VK_NUMPAD9 = 0x69,VK_O = 0x4f,VK_P = 80,VK_PAUSE = 0x13,VK_PRINT = 0x2a,VK_PRIOR = 0x21,VK_Q = 0x51,VK_R = 0x52,VK_RBUTTON = 2,VK_RETURN = 13,VK_RIGHT = 0x27,VK_S = 0x53,VK_SCROLL = 0x91,VK_SELECT = 0x29,VK_SEPARATOR = 0x6c,VK_SHIFT = 0x10,VK_SNAPSHOT = 0x2c,VK_SPACE = 0x20,VK_SUBTRACT = 0x6d,VK_T = 0x54,VK_TAB = 9,VK_U = 0x55,VK_UP = 0x26,VK_V = 0x56,VK_W = 0x57,VK_X = 0x58,VK_Y = 0x59,VK_Z = 90,WHEEL = 0x800,XDOWN = 0x80,XUP = 0x100}static OpenLibSys.Ols ols = null;[DllImport("user32.dll")]public static extern int MapVirtualKey(uint Ucode, uint uMapType);public static Boolean init() {ols = new OpenLibSys.Ols();return ols.GetStatus() == (uint)Ols.Status.NO_ERROR;}private static void KBCWait4IBE() {byte dwVal = 0;do {ols.ReadIoPortByteEx(0x64, ref dwVal);}while ((dwVal & 0x2) > 0);}public static void KeyDown(Char ch) {int btScancode = MapVirtualKey((uint)(Key)ch, 0);KBCWait4IBE();ols.WriteIoPortByte(0x64, 0xd2);KBCWait4IBE();ols.WriteIoPortByte(0x60, (byte)btScancode);}public static void KeyUp(Char ch) {int btScancode = MapVirtualKey((uint)(Key)ch, 0);KBCWait4IBE();ols.WriteIoPortByte(0x64, 0xd2);KBCWait4IBE();ols.WriteIoPortByte(0x60, (byte)(btScancode | 0x80));}
}

也只是模拟了 按下和弹起 以下为调用方式

String pwd = "123456";foreach (char chr in pwd) {WinRing.init();WinRing.KeyDown(chr);Thread.Sleep(100);WinRing.KeyUp(chr);}Thread.CurrentThread.Join(100);


到此 这两个类库的使用就介绍完了,但是在真正项目中可能会遇到各种问题,这就需我们的经验和处理问题的能力了.

注:这两个类库有一个通病就是不支持 USB键盘的模拟.估计是我没有研究出来吧

--幸福海

博客地址:http://www.cnblogs.com/ningqhai/

转载于:https://www.cnblogs.com/ningqhai/p/4236398.html

相关文章:

[微信小程序]js动态改变数组对象列表中的样式

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文: 这里我用微信小程序商城开发中选择商品规格选择做示例: 先把效果图让大家看看, 默认情况下是这样的 当点击了规格11以后: 该商品规格的颜色变成红色,并且显示该规格商品的图片和…

ios snapkit m_如何使用自动布局和SnapKit在iOS上创建漂亮的拉伸布局

ios snapkit mby Enabled Solutions由Enabled Solutions 如何使用自动布局和SnapKit在iOS上创建漂亮的拉伸布局 (How to create beautiful Stretchy Layouts on iOS using Auto Layout and SnapKit) Check the image below. This is a cool effect.检查下面的图像。 这是一个很…

谷歌 notification 测试 页面

1 <button onclick"notifyMe(master wei,http://cdn.sstatic.net/stackexchange/img/logos/so/so-icon.png,我在测试谷歌通知功能,http://www.mi.com/)">通知!</button>2 <script>3 var sum 0;4 document.addEventListener(DOMContentLoaded, fun…

[转]如果我有jQuery背景,我应该如何切换到AngularJS的思维模式?

导言 stackoverflow上有一个人问了一个问题&#xff1a;如果我有jQuery背景&#xff0c;我应该如何切换到AngularJS的思维模式&#xff1f; 有一个回复非常经典&#xff0c;获得了两千多票。 为了让国内开发者也能领略到其中的核心思想&#xff0c;现把这个问题和答案翻译出来供…

[微信小程序]实现一个自定义遮罩层组件(完整示例代码附效果图)

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文&#xff1a; 先上效果图: 点击按钮Show显示遮罩层,再次点击屏幕任何地方隐藏遮罩层; <button bindtap"showview">Show</button> <view class"bg" bindtaphide…

网红快餐店_在一家快餐店工作解释了AJAX基础知识

网红快餐店by Kevin Kononenko凯文科诺年科(Kevin Kononenko) 在一家快餐店工作解释了AJAX基础知识 (AJAX Basics Explained By Working At A Fast Food Restaurant) AJAX (Asynchronous JavaScript And XML) can be pretty confusing if you do not have a firm understandin…

ThinkPHP 3.2 中获取所有函数方法名,以及注释,完整可运行

<?phpnamespace Home\Controller;use Common\Controller\BaseController;class AuthController extends BaseController{/*** cc index主页面*/public function index(){$modules array(Home); //模块名称$i 0;foreach ($modules as $module) {$all_controller $this-…

减少Building 'Xxx' Gradle project info等待时间

转载请注明出处&#xff1a;http://www.cnblogs.com/cnwutianhao/p/6640279.html 从Github上看到好的Demo想要Download下来学习。导入到Android Stduio的时候经常会碰到这样的事情。。。 等了半天没反应还是这个界面&#xff0c;老子要报警了&#xff01;&#xff01;&#xf…

js表单验证,如果不为空时自动改变提交按钮的背景色

<!DOCTYPE html><head><title>js验证表单,如果表单都不为空,则按钮颜色自变,某为空时恢复原本背景色</title><script language"javascript" type"text/javascript">var a ;var b ;function chadnge(e) {a e;if(a ! &…

ux可以去哪些公司_忽略UX会如何伤害您的API以及您可以如何做

ux可以去哪些公司by Ifeoluwa Arowosegbe通过Ifeoluwa Arowosegbe 忽略UX会如何伤害您的API以及您可以如何做 (How ignoring UX hurts your API and what you can do about it) Creating experiences that users love is crucial to the success of any product. Companies in…

初识java类的接口实现

初识java类的接口实现 如果两个类之间不存在继承关系&#xff0c;且两个类都想实现同一个接口&#xff0c;两个类都必须实现接口中全部方法&#xff0c;否则报语法错误如果两个类之间存在继承关系也想实现同一个接口&#xff0c;父类如果实现了某个接口的全部方法&#xff0c;从…

KMP的next[]数组

KMP是众多字符串问题的基础 理解next数组尤为重要 next又称前缀数组 是 它所处位置的前一个位置的元素 与 该链 链首开始 几个元素相匹配(即相同) 举个实例来说明&#xff1a; next对应的是该位置的前一个元素&#xff0c; 即next[i]对应a[i-1] 因为-1头指针的存在 next均对应…

[微信小程序]手指触摸动画效果(完整代码附效果图)

微信小程序开发交流qq群 173683895 本文共有两个示例,先上图 示例一: 示例二: 示例一代码(微信小程序): // pages/test/test.js Page({containerTap: function (res) {var that thisvar x res.touches[0].pageX;var y res.touches[0].pageY 85;this.setData({rippleS…

webpack 占位符_通过示例学习Webpack:占位符图像模糊

webpack 占位符by Kalalau Cantrell通过Kalalau Cantrell 通过示例了解Webpack&#xff1a;占位符图像模糊 (Learn Webpack by Example: Blurred placeholder images) The repo that goes along with this post uses webpack 3. If you are interested in learning webpack 4,…

UIImage 各种处理(分类)

1 interface UIImage (conversion)2 3 //压缩图片到宽度10244 (UIImage *)imageCompressSizeToMin1024Width:(UIImage *)image;5 6 7 //修改图片size8 (UIImage *)image:(UIImage *)image byScalingToSize:(CGSize)targetSize;9 10 //UIColor 转UIImage 11 (UIImage *)…

Matlab随笔之矩阵入门知识

直接输入法创建矩阵 – 矩阵的所有元素必须放在方括号“[ ]”内&#xff1b; – 矩阵列元素之间必须用逗号“&#xff0c;”或空格隔开&#xff0c;每行必须用“;”隔开 – 矩阵元素可以是任何不含未定义变量的表达式。可以是实数&#xff0c;或者是复数。 – 例a[1,2;3,4] 或 …

[微信小程序]提交表单返回成功后自动清空表单的值

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文&#xff1a; 实现思路: 给每一个input绑定相同的value对象,提交成功后把这个对象赋值为空. 下面看代码: <form bindsubmitformsubmit><view><span>* </span>公司名称:&l…

xebium周末启动_我如何在周末建立和启动聊天机器人

xebium周末启动by Mike Williams由Mike Williams 我如何在周末建立和启动聊天机器人 (How I Built And Launched A Chatbot Over The Weekend) 在数小时内将您的想法带入功能性bot&#xff0c;获得真实的用户反馈&#xff0c;并在周末结束前启动&#xff01; &#xff1f; (Ta…

transition属性值

一、transition-property: transition-property是用来指定当元素其中一个属性改变时执行transition效果&#xff0c;其主要有以下几个值&#xff1a;none(没有属性改变)&#xff1b;all&#xff08;所有属性改变&#xff09;这个也是其默认值&#xff1b;indent&#xff08;元素…

[微信小程序]下拉菜单

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文&#xff1a; 动画效果是使用CSS3 keyframes 规则(使 div 元素匀速向下移动) <view class page_row><view class"nav" wx:for{{nav_title}} wx:key"index"><vi…

文件解析库doctotext源码分析

doctotext中没有make install选项&#xff0c;make后生成可执行文件在buile目录下面有.so动态库和头文件&#xff0c;需要的可以从这里面拷贝build/doctotext就是可执行程序。doctotext内置了两种检测文件类型方法&#xff1a;1、以后缀为依据检测文件类型2、以内容为依据检测文…

tmux系统剪切板_实践中的tmux:与系统剪贴板集成

tmux系统剪切板by Alexey Samoshkin通过阿列克谢萨莫什金(Alexey Samoshkin) 在实践中使用tmux&#xff1a;与系统剪贴板集成 (tmux in practice: integration with the system clipboard) 如何在tmux复制缓冲区和系统剪贴板之间建立桥梁&#xff0c;以及如何在OSX或Linux系统…

【Java面试题】54 去掉一个Vector集合中重复的元素

在Java中去掉一个 Vector 集合中重复的元素 1)通过Vector.contains&#xff08;&#xff09;方法判断是否包含该元素&#xff0c;如果没有包含就添加到新的集合当中&#xff0c;适用于数据较小的情况下。 import java.util.Vector; public class DeleteVector {public static v…

tornado+nginx上传视频文件

[http://arloz.me/tornado/2014/06/27/uploadvideotornado.html] [NGINX REFRER: Nginx upload module] 由于tornado通过表达上传的数据最大限制在100M&#xff0c;所以如果需要上传视屏文件的情况在需要通过其他方式实现&#xff0c; 此处采用nginx的nginx-upload-module和jQu…

微信小程序swiper组件宽高自适应方法

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文&#xff1a; 我把 swiper 的 width 设定成了屏幕的95%宽度, 如果想宽度也自适应的话请改成 width:{{width*2}}rpx <swiper classadvertising2 indicator-dots"true" styleheight:{{…

全面访问JavaScript的最佳资源

Looking for a new job is a daunting task. There are so many things to consider when trying to find the perfect role - location, company, job responsibilities, pay and compensation, training and much more.找一份新工作是艰巨的任务。 试图找到理想的职位时&…

Redis集群官方推荐方案 Redis-Cluster

Redis-Cluster redis使用中遇到的瓶颈 我们日常在对于redis的使用中&#xff0c;经常会遇到一些问题 1、高可用问题&#xff0c;如何保证redis的持续高可用性。 2、容量问题&#xff0c;单实例redis内存无法无限扩充&#xff0c;达到32G后就进入了64位世界&#xff0c;性能下降…

[微信小程序]单选框以及多选框实例代码附讲解

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文&#xff1a; 效果图 <radio-group class"radio-group" bindchange"radioChange"><label class"radio" wx:for"{{k7}}" wx:key"index&q…

IDL_GUI

菜单栏设计 PRO IDLGui;构建界面;显示;添加事件tlbWIDGET_BASE(xsize400,ysize400,/column,mbarmbar);实现基类fileWIDGET_BUTTON(mbar, $ &#xff1b;新建button&#xff0c;value文件)openwidget_button(file,value打开,/menu)jpgwidget_button(open,valuejpg)existwidget_…

git隐藏修改_您可能不知道的有关Git隐藏的有用技巧

git隐藏修改I have launched a newsletter Git Better to help learn new tricks and advanced topics of Git. If you are interested in getting your game better in Git, you should definitely check that out.我已经发布了Git Better通讯&#xff0c;以帮助学习Git的新技…