首页
社区
课程
招聘
[求助]请问如何给后台窗口发送鼠标按键消息
发表于: 2008-12-30 12:01 42656

[求助]请问如何给后台窗口发送鼠标按键消息

2008-12-30 12:01
42656
收藏
免费 0
支持
分享
最新回复 (45)
雪    币: 247
活跃值: (141)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
[QUOTE=;]...[/QUOTE]
这样就不好玩了,解决了就要共享嘛!牛人不说,以后直接关坛算了吧!只有问题没有答案的事,开着没意思了!
2009-4-6 01:15
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
我虽然对这个技术不感兴趣, 但是像楼主这样来问问题, 碰巧自己解决了, 就龟缩了的人, 确实不厚道啊

后面竟然还有这么多人问..., 看来任何问题都不可能从像楼主这样的人问出点点线索的

还是像大富翁论坛这样的, 才堪称典范啊
2009-4-6 11:34
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
提示一下要解决这些问题的人, 因为我自己也是用这种方法:
不管是遇到什么问题, 只要有现成的程序能够实现的, 就不要怕麻烦, 仔细的逆向, 多跟踪跟踪, 一来可以增加逆向经验, 二来可以学习人家怎么实现的, 别出来问了, 实在不济, 就多 Google 几下吧
Google + 逆向, 所向无敌 ...... (呵呵)
2009-4-6 11:37
0
雪    币: 219
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
29
自己不厚度,还说别人呢
2009-5-12 02:38
0
雪    币: 278
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
样就不好玩了,解决了就要共享嘛!牛人不说,以后直接关坛算了吧!只有问题没有答案的事,开着没意思了!
2009-5-12 10:52
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31
会的不说,想知道也没办法搞定。靠自己吧
2009-5-25 08:47
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
龟缩,说的很好啊
2009-7-17 12:40
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
有成功后台发送了鼠标消息的跟我交流一下,我对加密比较精通的。我的qq511876813
2009-11-10 21:33
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
到现在还没有人搞定这个吗?
高手给个思路也好呀
2009-11-12 22:28
0
雪    币: 1265
活跃值: (5119)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
35
我无玩过什么游戏,但想了一下, 单用发送鼠标消息没多大作用(功能)。

你说你对“加密比较精通”,还不如直接分析一下游戏封包,搞个双向欺骗。

退一步,搞不成也可以直接调用游戏内部分能。

建议刚入门的朋友不要想做外挂来发财。这里有很多很多方面的高手,但来这里只是学习的,我相信,大部分来这里的高手,他们不会去写外挂的。

  (我基本上晚上都不睡,用来上网找资料,日间就工作,从不花时间去玩游戏)

  你们以后可能就会明白的了。
2009-11-13 03:10
0
雪    币: 1265
活跃值: (5119)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
36
楼主问的问题不难(我以前编写过游戏的基本的外挂),只是他们(指会的人)不想帮你,也不想花时间去帮楼主去分析什么游戏,只想楼主不如自已学下基本的语言, 再去学分析。
2009-11-13 03:17
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
用POSTMESSAGE  看看可以不可以
2009-11-13 07:12
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
38
最近闲来无事,想给按键精灵写一个插件而已,免费的呦。
要想做外挂还用什么模拟鼠标呢。
2009-11-14 10:31
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
39
下面这个也许对大家有点帮助:
转载自 http://blog.csdn.net/kylixfire/archive/2008/06/09/2526688.aspx

很多游戏或者3d模拟软件为了更好的支持外设使用directinput作为输入接口调用。那么如果要模拟鼠标或键盘来控制游戏或者3d软件进行自动作业如何才能做到呢?

我研究了键盘部分。鼠标应该以此类推
入手模块:dinput8.dll
使用软件:idapro5.0,ollydbg,C32asm

思路是这样的。在进行dinput编程的时候有一个循环查询状态的处理。被调用的函数为CKbd_GetDeviceState (此函数地址可以从idapro5.0的分析结果中找到)

调用代码类似:
  HRESULT   UpdateInputState(void)   
    {   
      DWORD   i;   
   
      if(lpKeyboard   !=   NULL)     
      {   
        DIDEVICEOBJECTDATA   didod[DINPUT_BUFFERSIZE];   //   Receives   buffered   data   
        DWORD   dwElements;   
        HRESULT   hr;   
   
        hr   =   DIERR_INPUTLOST;   
        while(hr   !=   DI_OK)   
        {   
          dwElements   =   DINPUT_BUFFERSIZE;   
          hr   =   lpKeyboard->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),didod,&dwElements,0);  这里调用 CKbd_GetDeviceState
          if   (hr   !=   DI_OK)   
          {  

            hr   =   lpKeyboard->Acquire();   
            if(FAILED(hr))   
              return   hr;   
               }   
        }   
             if(FAILED(hr))   
            return   hr;   
      }   
   
      for(int   i=0;   i<dwElements;   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指向的内存为一个键盘状态表不同的键位如果按下为0x80,没有按下为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
通过跟踪得知存放缓冲区的是一个全局变量内存区 键盘表对应键位如下 我列出常用键。

基地址为:6d1a4448 这个地址可以通过跟踪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中跟踪调试呢.
我们可以通过c32asm 修改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。这里就是键盘缓冲区

那么既然知道键盘缓冲区地址固定。我们就可以编码模拟了。
首先要做的就是插入我们的代码到要修改的进程里面去。用hook也好远程线程也好。方法很多不讲了。
我这里使用的是键盘hook
BYTE keyMap[0x100]={NULL};
BYTE *dinput8KeyMap=(BYTE*)0x24448; //键盘映射区地址偏移
//在程序的初始化处计算缓冲区相对位置
HINSTANCE hDinput8 = 0;
hDinput8 = GetModuleHandle("dinput8.dll");
   if(!hDinput8)
   {
    __asm
    {
     
     mov eax,dinput8KeyMap
     add eax,hDinput8
     mov dinput8KeyMap,eax
    }
   }else
   {
    hDinput8 = LoadLibrary("dinput8.dll");
    __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)
{
//大小写转换
if(vk>='A' && vk<='Z')
{
  vk|=0x20;
}
for(int cnt=0;cnt<0x100;cnt++)
{
  if(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
2009-11-14 13:30
0
雪    币: 7079
活跃值: (4015)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
多谢LS的,好好研究去...
2009-11-16 10:47
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
严重鄙视,虽然这样的人很多,但认识一个算一个
2009-11-22 08:07
0
雪    币: 156
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
42
ccfer..膜拜
2009-11-22 14:58
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
这个游戏对鼠标消息的坐标做了偏移处理,如果你用全局移动,就可以
2010-1-1 10:17
0
雪    币: 314
活跃值: (271)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
44
求答案 啊,我最近也在弄这个,
什么sendmsg,post,mouse_event,都用了,就是不行..
2010-9-12 05:17
0
雪    币: 217
活跃值: (45)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
45
当心账号被封,反外挂的内核模块有可能有IRP追踪,你在R3下就这么来一下,
保证有个程序发通知告密。

还不如在发包收包那里做手脚,前面有人已经说的很清楚了,《双向欺骗》。
2010-9-14 10:03
0
雪    币: 217
活跃值: (45)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
46
当心账号被封,反外挂的内核模块有可能有IRP追踪,你在R3下就这么来一下,
保证有个程序发通知告密。

还不如在发包收包那里做手脚,前面有人已经说的很清楚了,《双向欺骗》。
2010-9-14 11:05
0
游客
登录 | 注册 方可回帖
返回
//