在通过回调函数模拟键盘按键的过程中,遇到一个问题,请教大家
void SetKey(DWORD scan, BOOL isDown, BOOL isExtern)
{
DWORD dwBytesReturned;
DWORD keyType;
if(isExtern)
keyType = isDown?IOCTL_KEY_E0:IOCTL_KEY_E1;
else
keyType = isDown?IOCTL_KEY_DOWN:IOCTL_KEY_UP;
DeviceIoControl(m_hControl, keyType,
&scan, sizeof(ULONG), NULL, 0, &dwBytesReturned, NULL);
}
我调用 SetKey(MapVirtualKey(VK_LEFT), TRUE, TRUE);
模拟按下方向左键,这个得到了正确的执行效果
但是调用 SetKey(MapVirtualKey(VK_LEFT), FALSE, TRUE);
模拟松开方向左键,确没有效果,非常奇怪,
驱动层代码如下,没有做其他变化,
dprintf("[KeyMouse] KeymouseDispatchDeviceControl IOCTL_KEY_E1 = 0x%x\n", lKeyCode)
;这个一句得到了正确的执行,参数也是正确的
case IOCTL_KEY_E1:
{
if (ioBuf)
{
lKeyCode = *(ULONG*)ioBuf;
dprintf("[KeyMouse] KeymouseDispatchDeviceControl IOCTL_KEY_E1 = 0x%x\n", lKeyCode);
dwSize = sizeof(KEYBOARD_INPUT_DATA);
__asm {
push eax
mov kid.UnitId,0 ; 构造 KEYYBOARD_INPUT_DATA
mov eax,lKeyCode
mov kid.MakeCode,ax
mov kid.Flags,KEY_E1 ;模拟松开
mov kid.Reserved,0
mov kid.ExtraInformation,0
lea eax,dwRet
push eax
lea eax,kid
add eax,dwSize
push eax
lea eax,kid
push eax
push g_kbDeviceObject
call orig_KeyboardClassServiceCallback ;利用 KeyboardClassServiceCallback 模拟按键
pop eax
}
status = STATUS_SUCCESS;
}
break;
百思不得其解,忘大牛们指点迷津,我现金不多了,全部奉上,再次感谢!
[课程]Linux pwn 探索篇!