線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:9770
推到 Plurk!
推到 Facebook!

硬體級的模擬滑鼠問題

答題得分者是:bugmans
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-04 08:08:35 IP:222.135.xxx.xxx 未訂閱
各位先進: 最近玩QQ幻想,挖礦太累,所以想做個外掛自動掛機,沒想到QQ的遊戲不支援軟體級的模擬滑鼠點擊,那位元大哥知道模擬硬體級的滑鼠點擊? 不要回答我類似: SendMessage(hWnd,WM_LBUTTONUP,MK_LBUTTON,NULL); 或者 mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); 之類的,在QQ幻想裏用來走路還可以,但要點擊物品就不行了。 網上有一篇關於QQ遊戲檢測軟體類比滑鼠的,網址是: http://pic.5267.net/index.asp?ID=335 還據說"類比精靈"可以支援“硬體模式”,不知其怎麼實現的,網址是: http://tech.sina.com.cn/s/2005-06-08/0912629627.shtml
ccobj
一般會員


發表:6
回覆:27
積分:21
註冊:2003-12-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-07 00:42:11 IP:220.134.xxx.xxx 未訂閱
我也想知道答案 因為也有遇到這個問題 想要模擬按鍵 SendMessage PostMessage keybd_event SendInput 都用過了 沒用 所以想知道那些按鍵精靈之類的軟體是怎樣模擬的 希望有大大可以解惑 發表人 - ccobj 於 2005/11/07 00:43:24
ccobj
一般會員


發表:6
回覆:27
積分:21
註冊:2003-12-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-19 21:17:04 IP:220.134.xxx.xxx 未訂閱
http://dev.csdn.net/develop/article/7/7181.shtm 我有找到這個 應該是硬體模擬的 不過BCB不支援 有大大知道怎麼解決嗎 發表人 - ccobj 於 2005/11/19 21:18:54
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-20 07:36:16 IP:222.135.xxx.xxx 未訂閱
看來還無法結帖,期待各位先進回復
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-03 10:42:46 IP:125.224.xxx.xxx 未訂閱
FILE: joyflt.exe 包含搖桿和鍵盤篩選器驅動程式
http://support.microsoft.com/kb/176417/zh-tw
不知道改用Driver等級的範例是否可以,只是安裝了win2000DDK後還是無法編譯成功,所以也無法測試

If the filter detects that a button has been pressed, it adds the appropriate raw keystroke to the keyboard buffer.
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-04-25 18:22:33 IP:125.225.xxx.xxx 未訂閱
這是我在ptt回答別人時所寫的文章
原問題http://www.ptt.cc/bbs/C_and_CPP/M.1208982013.A.52E.html
我的回答http://www.ptt.cc/bbs/C_and_CPP/M.1208996952.A.37F.html
我將回答的內容備份到這裡

http://zh.wikipedia.org/wiki/NProtect_GameGuard
既然人家都要反作弊了,普通的API當然都被擋下來了
所以才會有人賣這個東西http://www.yfyf.com.tw/iPro.asp (不是為他廣告,舉例用)
或是用按鍵精靈http://tw.vrbrothers.com/qmacro/
安裝後可以找到.sys的檔案,應該用到DDK的技術

如何模拟键盘之学习笔记一http://bbs.pediy.com/showthread.php?t=59982

因为本人也是个菜鸟,所以就GOOGLE BAIDU了下来学习键盘模拟分3个层次,第一个层次.局部级模拟,简单说就是PostMessage,这个没啥多说的。了解消息机制就行。
第二个层次,全局键盘消息,简单说就是keybd_event / SendInput 函数,也可以用全局钩子,比如,你可以用WH_JOURNALPLAYBACK这个钩子来模拟按键,据说,keyboard_event填写硬件扫描码对DriectInput有效,虚拟健码只对窗口有效,(测试到DIRECT X 9) 也就是说这样也是可以过Direct Input的。。
第三个层次 ,驱动级别,大家登陆QQ的时候都主意到了。密码框旁边有个小小的金锁,这是什么??这就是大名鼎鼎的nProtect,如果你要模拟QQ密码输入,那就是驱动级别的。
那驱动级别如何模拟键盘呢?经查知道, 键盘驱动直接读写 i8042 芯片,通过 i8042 间接的向键盘中的 i8048 发命令,所以俺们只要和 i8042 打交道就可以了。
i8042 有 4 个 8 bits 的寄存器,他们是 Status ReGISter(状态寄存器),Output Buffer(输出缓冲器),Input Buffer(输入缓冲器),Control Register(控制寄存器)。使用两个 IO 端口,60h 和 64h。
好了。菜鸟我喜欢先动手做个程序出来。因为只是个DEMO。所以没有任何功能。只是10秒之后模拟产生100个a....(运行程序的结果就是。10秒内如果你打开记事本。。等满10秒。就会出现100个a)
代码很简单。。先去下载WINIO ,然后直接用他的EXAMPLE WINIOTEST
if (bResult)
{}内部修改如下。。。
Sleep(10000);
for(int i=1;i<100;i )
{
Sleep(100);
MykeyDown(65);
}
ShutdownWinIo();
//增加2个函数
void KBCWaitEmpty()
{
DWORD dwPortVal;
do
{
bool flag = GetPortVal(0x64, &dwPortVal, 1);
}
while ((dwPortVal & 0x2) > 0);// 缓冲区满则继续等待,空则退出,
}
void MykeyDown(int vKeyCoad)
{
int btScancode = 0;
btScancode = MapVirtualKey((BYTE)vKeyCoad, 0);//虚拟键码转换成扫描码,主要是虚拟键码表比较容易GOOGLE到
KBCWaitEmpty(); // 等待键盘缓冲区为空
SetPortVal(KBC_KEY_CMD, 0xD2, 1);// 发送命令 总共12个命令 D2h表示准备写数据到Output Register中。
//随后通过60h写入到Input Register的字节会被放入到Output Register中,此功能被
//用来模拟来自于Keyboard发送的数据。如果中断被允许,则会触发一个中断。
// KBCWaitEmpty();
// SetPortVal(KBC_KEY_DATA, 0xe2, 1);// 写入按键信息
KBCWaitEmpty(); // '等待键盘缓冲区为空
SetPortVal(KBC_KEY_CMD, 0xD2, 1);// '发送键盘写入命令
KBCWaitEmpty();
SetPortVal(KBC_KEY_DATA, btScancode, 1);// '写入按下键
}
OK .程序编译通过,可以运行了吧??俺这是VS 2005 XP SP 2操作系统下完全成功,然后俺的目标就是QQ的那个金锁了!!!。。。。
事实证明,这个金锁形同虚设,简单起见,使用一个记时器记录按键
SetTimer(hWnd,IDT_TIMER1,10,(TIMERPROC) NULL);

case WM_TIMER:
vKeyCoad = ReadkeyDown();
if(vKeyCoad > 0)
outfile<
break;
ReadKeyDown 只是简单的读下端口
int ReadkeyDown(){
int vKeyCoad;
DWORD btScancode = 10000;
DWORD dwPortVal;
bool flag;
flag = GetPortVal(0x60,&btScancode,1);//
vKeyCoad = MapVirtualKey(btScancode,1);
return vKeyCoad;

}
结果。。。QQ密码框输入的密码真的被记录下来了。(QQ 2007 II 版本,就是官网下的版本)晕死。。。nProtect 的保护都没看到呢!!
当然,这样记录还有一点小小问题。。因为使用的是记时器,所以,同一按键,就会被多次读取,导致重复,,不过我想,这个问题是可以解决的。暂时就先到这吧。

我在BCB6試著將程式碼建立起來,測試時的確可以執行,但我沒有拿遊戲來試

[code cpp]
#include
#include
#include "winio.h"
const int KBC_KEY_CMD = 0x64;
const int KBC_KEY_DATA = 0x60;
void KBCWaitEmpty()
{
DWORD dwPortVal;
do
{
bool flag = GetPortVal(0x64, &dwPortVal, 1);
}
while ((dwPortVal & 0x2) > 0);//缓冲区满则继续等待,空则退出,
}
void MykeyDown(int vKeyCoad)
{
int btScancode = 0;
btScancode = MapVirtualKey((BYTE)vKeyCoad, 0);
//虚拟键码转换成扫描码,主要是虚拟键码表比较容易GOOGLE到
KBCWaitEmpty(); // 等待键盘缓冲区为空
SetPortVal(KBC_KEY_CMD, 0xD2, 1);
// 发送命令 总共12个命令 D2h表示准备写数据到Output Register中。
//随后通过60h写入到Input Register的字节会被放入到Output Register中,此功能被
//用来模拟来自于Keyboard发送的数据。如果中断被允许,则会触发一个中断。
// KBCWaitEmpty();
// SetPortVal(KBC_KEY_DATA, 0xe2, 1);// 写入按键信息
KBCWaitEmpty(); // '等待键盘缓冲区为空
SetPortVal(KBC_KEY_CMD, 0xD2, 1);// '发送键盘写入命令
KBCWaitEmpty();
SetPortVal(KBC_KEY_DATA, btScancode, 1);// '写入按下键

}
void main()
{
DWORD dwPortVal;
DWORD dwMemVal;
bool bResult;
HANDLE hPhysicalMemory;
PBYTE pbLinAddr;

// Call InitializeWinIo to initialize the WinIo library.
bResult = InitializeWinIo();
if (bResult)
{Sleep(10000);
for(int i=1;i<100;i )
{Sleep(100);
MykeyDown(65);
}
ShutdownWinIo();
}
else
{
printf("Error during initialization of WinIo.\n");
exit(1);
}
}

[/code]
編輯記錄
bugmans 重新編輯於 2009-04-13 22:33:23, 註解 無‧
bugmans
高階會員


發表:95
回覆:322
積分:188
註冊:2003-04-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-13 22:41:40 IP:125.225.xxx.xxx 未訂閱
再補充一篇從網路找到的文章<Delphi下利用WinIo模拟鼠标键盘详解>
附範例執行檔,但轉貼過來格式會跑掉,就請各位自行點連結
http://bbs.pediy.com/showthread.php?t=80101
原來的出處
http://programbbs.com/bbs/view12-17207-2.htm
系統時間:2017-10-23 5:14:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!