winio模拟键盘鼠标的输入

winio模拟键盘鼠标的输入


做一个游戏外挂,发现其屏蔽了sendinput消息。
但是按键精灵能够实现。得知其原理是使用winio.dll,伪装硬件消息。

网上winio关于鼠标键盘模拟极少。

void CIotestDlg::KbcWait4IBE()
{
  DWORD dwRegVal=0;
  do
  { 
    GetPortVal(0x64,&dwRegVal,1);
  }
  while(dwRegVal & 0x00000001);
}

void CIotestDlg::KeyPress(BYTE byScancode)
{
  KbcWait4IBE();//Wait for KBC input buffer empty
  SetPortVal(0x64,0xD2,1);//Send data back to the system command
 
  KbcWait4IBE();//Wait for KBC input buffer empty
  SetPortVal(0x60,(ULONG)byScancode,1);//Send the key down scancode
 
  KbcWait4IBE();//Wait for KBC input buffer empty
  SetPortVal(0x64,0xD2,1);//Send data back to the system command
 
  KbcWait4IBE();//Wait for KBC input buffer empty
  SetPortVal(0x60,(ULONG)(byScancode | 0x80),1);//Send the key up scancode
}

这是找到的键盘模拟片断。
做了一个测试程序,发现没有成功响应虚拟的按键消息。

进行keypress(VK_LBUTTON)的时候,测试的dialog直接自动退出,未知原因。
其他keypress(VK_TAB)则没有响应。
 
以下是采用WinIo直接向ps2键盘(或鼠标)缓冲区写数据的方法。
winxpsp2下测试通过!

procedure SetKey(SCanCode: byte);
begin
  asm
    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
    @Loop1:
    in al, $64
    and al, 01b
    jnz @Loop1
    //向$64端口写命令
    mov al, $D2//写键盘输出缓存命令
    out $64, al

    //无论向0x60,还是0x64写东西前都要等状态寄存器OBF变0
    @Loop2:
    in al, $64
    and al, 01b
    jnz @Loop2
    //向$60端口写参数
    mov al, SCanCode
    out $60, al
  end;
end;

模拟非扩展键:
SetKey($1F);//make codes
Sleep(25);
SetKey($9F);//break code

模拟扩展键:
SetKey($E0);//因为这是一个扩展键
SetKey($4B);//make codes
Sleep(25);
SetKey($E0);//因为这是一个扩展键
SetKey($CB);//break code
模拟鼠标的类似。

不管什么游戏,SendInput不太可能被屏蔽!

不建议采用winio自身的SetPortVal函数,这样效率太慢,而是直接用汇编写端口,当载入winio驱动后就可以直接操作端口了。
载入驱动:InitializeWinIo
卸下驱动:ShutdownWinIo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值