xp下对dinput8.dll 游戏键盘输入的模拟 非函数hook

xp下对dinput8.dll 游戏键盘输入的模拟 非函数hook

    很多游玩或许3d仿照软件为了上进的证实次要的应用directinput作为输出啮合扣转学。这么即使要仿照鼠标或尖形表明牌来把持游玩或许3d软件举行自然的作业以任何方式才能做到呢?

我默想了尖形表明牌使分开。。鼠标应当是左右的
着手模块:
应用软件:

这执意心理方式。在DPin设计中有一散布查询遗产处置。。被转学的作用是CKBDGGETDEVECHANCE (这样作用的地址可以从剖析的果实中找到)

转学行为准则类似物:
HRESULT   UpdateInputState(void)  
{  
DWORD   i;  
if(lpKeyboard   !=   空)
{  
DIDEVICEOBJECTDATA   didod[DINPUT_BUFFERSIZE];   //   Receives   buffered   data  
DWORD   dwElements;  
HRESULT   hr;  
hr   =   DIERR_INPUTLOST;  
(人文资源) !=   DI_OK)  
{  
dwElements   =   DINPUT_BUFFERSIZE;  
hr   =   lpKeyboard->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),didod,&dwElements,0);  在这里喊叫 CKbd_GetDeviceState
if   (人文资源) !=   DI_OK)  
{  

            hr   =   lpKeyboard->Acquire();  
即使化为泡影(人文资源)
return   hr;  
}  
}  
即使化为泡影(人文资源)
return   hr;  
}  
为(int) i=0;   i{  
//   把处置行为准则放在在这里
//   didod[i].dwOfs   表明键被按下或放宽。
//   didod[i].dwData   记载此键的遗产,低音节极好的 1   表明压力机,0   显示松动
//   普通用   didod[i].dwData&0x80   来受试验  
}  
return   S_OK;  
}  
这么尖形表明牌遗产是以任何方式增加的呢?见上面的IDA剖析。
.text:6D18C5EA _CKbd_GetDeviceState@8 proc near        ; DATA XREF: .text:6D18C37Co
.text:6D18C5EA
.text:6D18C5EA arg_0           = dword ptr  8
.text:6D18C5EA arg_4           = dword ptr  0Ch
.text:6D18C5EA
.text:6D18C5EA                 mov     edi, edi
.text:6D18C5EC                 push    ebp
.text:6D18C5ED                 mov     ebp, esp
.text:6D18C5EF                 mov     eax, [ebp+arg_0]
.text:6D18C5F2                 mov     ecx, [eax+8]
.text:6D18C5F5                 test    byte ptr [ECX], 2
.text:6D18C5F8                 jz      short loc_6D18C60D
.text:6D18C5FA                 push    esi
.text:6D18C5FB                 mov     esi, [eax+4] 着陆随球剖析。ESI加标点于的内存是具有不一样键PLA的尖形表明牌遗产表。,缺少按下00
.text:6D18C5FE                 push    edi
.text:6D18C5FF                 mov     edi, [ebp+arg_4]
.text:6D18C602                 push    40h  拷贝大小为0x100音节40h×4
.text:6D18C604                 pop     ecx
.text:6D18C605                 rep movsd  将尖形表明牌遗产印刷到表面收执巨物
.text:6D18C607                 pop     edi
.text:6D18C608                 xor     eax, eax
.text:6D18C60A                 pop     esi
.text:6D18C60B                 jmp     short loc_6D18C612
.text:6D18C60D ; —————————————————————————
.text:6D18C60D
.text:6D18C60D loc_6D18C60D:                           ; CODE XREF: CKbd_GetDeviceState(x,X) EJ
.text:6D18C60D                 mov     eax, 8007001Eh
.text:6D18C612
.text:6D18C612 loc_6D18C612:                           ; CODE XREF: CKbd_GetDeviceState(x,x)+21j
.text:6D18C612                 pop     ebp
.text:6D18C613                 retn    8
.text:6D18C613 _CKbd_GetDeviceState@8 endp
经过随球,可以造成仓库巨物是全程变量仓库器。 尖形表明牌表对应的线索席位如次 我列出经用的钥匙。

根本地址是:6D1A448 这样地址可以经过随球ESI的物质来增加。
6d1a4448h+2 = 1 到 6d1a4448h+bh = 0
6d1a4448h+ch = –
6d1a4448h+dh = =
6d1a4448h+1eh = a
6d1a4448h+30h = b
6d1a4448h+2eh = c
6d1a4448h+20h = d
6d1a4448h+12h = e
6d1a4448h+21h = f
6d1a4448h+22h = g
6d1a4448h+23h = h
6d1a4448h+17h = i
6d1a4448h+24h = j
6d1a4448h+25h = k
6d1a4448h+26h = l
6d1a4448h+32h = m
6d1a4448h+31h = n
6d1a4448h+18h = o
6d1a4448h+19h = p
6d1a4448h+10h = q
6d1a4448h+13h = r
6d1a4448h+1fh = s
6d1a4448h+14h = t
6d1a4448h+16h = u
6d1a4448h+2fh = v
6d1a4448h+11h = w
6d1a4448h+2dh = x
6d1a4448h+15h = y
6d1a4448h+2ch = z
6d1a4448h+1ch = enter
6d1a4448h+c8h = up
6d1a4448h+d0h = down
6d1a4448h+cbh = left
6d1a4448h+cdh = right  

因而以任何方式在OllyDbg举行随球和调试。
咱们可以经过C32 ASM 修正CKbd_GetDeviceState 6D1880A7    8BFF            mov     edi, edi                         ;
该机具的第一音节的作用的行为准则是CC,即int。 3个断点
眼前,8BFF被修正为CCFF。 这么当执行遗产管理人的职责到这样作用的时分会注意事项发现物调试席位颠倒的0x80000003着陆注意事项进入调试
率先,应当将OllyDbg设置为零碎默许调试器。。
OllyDbg将有一站
CC              int3                                     ; CKbd_GetDeviceState
FF55 8B         call    dword ptr [ebp-75]
EC              in      al, dx
8B45 08         mov     eax, dword ptr [ebp+8]
ctrl+e 修正CC到8B
在这样句子中扩大一走近F8。
.text:6D18C5FB                 mov     esi, [eax+4]
当时的再次按下F8
ESI有一地址

看一眼ESI指的是什么。你会见0片。这是尖形表明牌巨物

如今你造成尖形表明牌缓冲液的地址是紧握的。咱们可以对仿照举行编码。
率先要将行为准则拔出到要修正的稳定的进程中。。应用钩子或长途线也晴天的。。很多方式都不话它。。
我在在这里应用尖形表明牌钩子
BYTE keyMap[0x100]={NULL};
BYTE *dinput8KeyMap=(BYTE*)0x24448; 在尖形表明牌晒区域击中要害地址换挡
在设定初值点计算缓冲液的对立席位。
HINSTANCE hDinput8 = 0;
hDinput8 = GetModuleHandle(“”);
if(!hDinput8)
{
__asm
{
mov eax,dinput8KeyMap
add eax,hDinput8
mov dinput8KeyMap,eax
}
}else
{
hDinput8 = LoadLibrary(“”);
__asm
{
mov eax,dinput8KeyMap
add eax,hDinput8
mov dinput8KeyMap,eax
}
FreeLibrary(hDinput8);
}
率先明确咱们的密码表并写一设定初值作用。
void InitKeyMap()
{
ZeroMemory(keyMap,0x100);
keyMap[0x2] =”1”;
keyMap[0x3] =”2”;
keyMap[0x4] =”3”;
keyMap[0x5] =”4”;
keyMap[0x6] =”5”;
keyMap[0x7] =”6”;
keyMap[0x8] =”7”;
keyMap[0x9] =”8”;
keyMap[0xa] =”9”;
keyMap[0xb] =”0”;
keyMap[0xc] =”-”;
keyMap[0xd] =”=”;
keyMap[0x1e]  A
keyMap[0x30]  =”b”;
keyMap[0x2e]  =”c”;
keyMap[0x20]  =”d”;
keyMap[0x12]  =”e”;
keyMap[0x21]  =”f”;
keyMap[0x22]  =”g”;
keyMap[0x23]  =”h”;
keyMap[0x17]  =”i”;
keyMap[0x24]  =”j”;
keyMap[0x25]  =”k”;
keyMap[0x26]  =”l”;
keyMap[0x32]  =”m”;
keyMap[0x31]  =”n”;
keyMap[0x18]  =”o”;
keyMap[0x19]  =”p”;
keyMap[0x10]  =”q”;
keyMap[0x13]  =”r”;
keyMap[0x1f]  =”s”;
keyMap[0x14]  =”t”;
keyMap[0x16]  =”u”;
keyMap[0x2f]  =”v”;
keyMap[0x11]  =”w”;
keyMap[0x2d]  =”x”;
keyMap[0x15]  =”y”;
keyMap[0x2c]  =”z”;
keyMap[0x1c]  =VK_RETURN;
keyMap[0xc8]  =VK_UP;
keyMap[0xd0]  =VK_DOWN;
keyMap[0xcb]  =VK_LEFT;
keyMap[0xcd]  =VK_RIGHT;
}
用尖形表明牌设置一作用为80

void SetKeyDown(BYTE VK)
{
//大小写替换
即使(vk>=a) && vk<=''Z'')
{
vk|=0x20;
}
为(int) cnt=0;cnt<0x100;cnt++)
{
(KEYMAP[CNT])
{
if(keyMap[cnt]==VK)
{
dinput8KeyMap[cnt]=0x80;
break;
}
}
}
}
这样作用是无效的。。即使紧固件伸出,咱们将整理0。
void SetKeyUp(BYTE VK)
{
ZeroMemory(dinput8KeyMap,0x100);
}
我用的尖形表明牌钩子。左右的造成
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{

 if(lParam==0xc0000001)
{
SetKeyDown((BYTE)wParam);
}
if(lParam==1)
{
SetKeyUp((BYTE)wParam);
}

return CallNextHookEx(winKbd,nCode,wParam,lParam);
}
左右做了。它可以经过顺序自然的把持。是否很重要
打开周围的事物:
vs2005,xp sp2

发表评论

电子邮件地址不会被公开。 必填项已用*标注