• 银行安全控件自动输入


    手里银行卡较多,经常忘记还信用卡,想做个应用自动查询银行卡余额。

    在做网页自动登录时,碰到银行安全控件,控件屏蔽了windows的sendmessage和postmessage

    只能求助winio,模拟最底层的按键

    1. 下载winio

    http://www.internals.com/utilities/WinIo.zip

    2.安装数据签名证书

    3. 打开windows的测试模式

      管理员模式在 cmd 下运行 bcdedit /set testsigning on

    4. 代码

      导入方法

    [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;
                }
                else
                    throw new Exception("Load WinIO Failed!");
            }
    
            public static void Shutdown()
            {
                if (IsInitialize)
                    ShutdownWinIo();
                IsInitialize = false;
            }

    模拟键盘按下和弹起

    //等待键盘缓冲区为空
            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(0x64, (IntPtr)0xD2, 1); //发送准备写命令
                KBCWait4IBE();
                SetPortVal(0x60, (IntPtr)btScancode, 1); //写入按键
            }
            // 模拟键盘弹出
            public static void KeyUp(Keys vKeyCoad)
            {
                if (!IsInitialize) return;
    
                int btScancode = 0;
                btScancode = MapVirtualKey((uint)vKeyCoad, 0);
                KBCWait4IBE();
                SetPortVal(0x64, (IntPtr)0xD2, 1);
                KBCWait4IBE();
                SetPortVal(0x60, (IntPtr)(btScancode | 0x80), 1); //弹出
            }

    重要的事情说三遍

    管理员运行

    管理员运行

    管理员运行

  • 相关阅读:
    React 组件的生命周期方法
    Ant Design 错误记录与常用例子
    roadhog中如何拷贝文件
    API加密框架monkey-api-encrypt发布1.2版本
    必杀技:当报错信息看不出原因时,怎么办?
    当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花
    Kitty-Cloud服务搭建过程剖析
    Maven快照版本要这样用才真的香!
    Kitty-Cloud环境准备
    双剑合璧的开源项目Kitty-Cloud
  • 原文地址:https://www.cnblogs.com/devilfeng/p/6884481.html
Copyright © 2020-2023  润新知