2008年5月1日 星期四

little fun

前陣子裝了一款olg
讓我注意到nProtect這個防止作弊的軟體
許多線上遊戲都有用這款軟體
他的其中一項功能就是擋下模擬鍵盤的api
像是SendKey這類win32 api

但它檔的下kernel mode的鍵盤模擬嗎?
對於這點我很有興趣,但並不是真的想寫什麼賣錢的外掛
結論是[真的會擋,但是有方法可以逃過]

hardware software
keyboard (i8048) -> (acpi) -> port driver(i8042) -> kbd driver(kbdclass) -> filter driver

irp, 這玩意我想有點像是軟體中斷, 由ioctl或是read write等送出, driver 再由
call back function處理, port, kdb各有一個buffer用來放置進來的資料
當irp沒有將資料讀完那些資料就會放在buffer中,等待下次再讀

實驗的方法:使用windows driver development kit
對鍵盤驅動程式(kbdclass)新增一個ioctl, 再藉由外部程式add key

使用ioctl, 傳進去一個make code buffer, 進到kernel mode
(這時已經把那些buffer copy到 kernel stack),使用syscall
然後將這些buffer包裝成keyboard data的struct, notify os

nProtect會擋下送出ioctl的process, 但是他在process執行一段時間後才會偵測到
如果我的process每次只送出少數的key呢 ;) 這樣就擋不下了

沒有留言: