【甜點】腳本外掛的檢測及預防

作者:amnesiac 首發(fā):官方論壇中文版
導言:一些游戲在運行時能檢測并屏蔽腳本外掛骂因,原理是什么徘键?有什么辦法可以知道當前系統(tǒng)中開了多少腳本兑牡?包括使用默認托盤圖標央碟、自定義圖標甚至隱藏了托盤圖標的腳本。還有均函,能發(fā)現(xiàn)已編譯成可執(zhí)行文件的腳本嗎亿虽?是否能控制這些腳本?苞也?

檢測在運行的腳本

獲取系統(tǒng)中當前運行的所有 AutoHotkey 腳本的信息(下面的腳本獲取腳本標題和進程路徑):

DetectHiddenWindows, on
WinGet, AHKWinList, List, ahk_class AutoHotkey 
Loop, %AHKWinList%
{
  AHKWinHWND := AHKWinList%A_Index%
  WinGetTitle, AHKWinTitle, ahk_id %AHKWinHWND%
  WinGet, AHKWinProcessPath, ProcessPath, ahk_id %AHKWinHWND%
  MsgBox, % "腳本標題:" AHKWinTitle "`n腳本進程路徑:" AHKWinProcessPath
}
return

由于可以獲取到窗口句柄洛勉,所以可以直接通過窗口命令獲取指定腳本的各種信息。其中腳本標題中包含了腳本文件名和執(zhí)行腳本的 AutoHotkey.exe 版本號如迟,例如:

D:\Software\AutoHotkey\Scripts\test.ahk - AutoHotkey v1.1.15.00

當然收毫,還可以使用其他方法。下面通過消息獲取某腳本的進程 ID:

AHKScriptName := "MyScript.ahk"
SetTitleMatchMode, 2
DetectHiddenWindows, on
SendMessage, 0x44, 0x405, 0, , %AHKScriptName% ahk_class AutoHotkey
MsgBox %ErrorLevel% is the process id.

想判斷哪些是未編譯腳本, 哪些是已編譯腳本, 請看下圖:


運行的 AutoHotkey 腳本列表
運行的 AutoHotkey 腳本列表

圖中顯示當前系統(tǒng)運行了兩個 AutoHotkey 腳本氓涣,我們對比這兩個腳本的窗口名稱:

  • D:\Software\AutoHotkey\Scripts\test.ahk - AutoHotkey v1.1.15.00
  • D:\Software\AutoHotkey\Scripts\test.exe

可以看出一個是未編譯腳本牛哺,一個是已編譯腳本陋气,因此可以根據窗口名判斷(其他信息也有差異)劳吠。注:從我使用這種方法開始到現(xiàn)在,窗口名稱的規(guī)律沒有發(fā)生變化巩趁,不過這里無法保證以后的所有版本都會遵從痒玩。

對這些腳本進行控制

在寫腳本時,我們都知道可以很方便的對當前腳本進行控制议慰,如:

Pause::Pause
^!s::Suspend
^!r::Reload
^+q::ExitApp
!l::ListLines
!v::ListVars
!k::KeyHistory

提示:我以前寫腳本時習慣加上許多這樣的熱鍵蠢古,包括暫停、重啟别凹、列出熱鍵草讶、列出執(zhí)行行、列出變量炉菲、顯示按鍵歷史等堕战,調試時很方便。那么拍霜,對其他腳本我們可以實現(xiàn)這些功能嗎嘱丢?

AHKScriptName := "MyScript.ahk"
DetectHiddenWindows On  ; 才可以檢測到腳本的隱藏主窗口.
SetTitleMatchMode 2  ; 避免為下面的文件指定完整的路徑.
WM_COMMAND := 0x111
ID_FILE_PAUSE := 65403
ID_FILE_SUSPEND := 65404
PostMessage, WM_COMMAND, ID_FILE_PAUSE,,, %AHKScriptName% ahk_class AutoHotkey
PostMessage, WM_COMMAND, ID_FILE_SUSPEND,,, %AHKScriptName% ahk_class AutoHotkey
WinClose, %AHKScriptName% ahk_class AutoHotkey ; 關閉腳本,也可以使用消息祠饺,不過這里使用窗口命令可能直觀一些越驻。
; 下面兩個同樣是掛起和暫停的功能
PostMessage, 0x111, 65305,,, %AHKScriptName% ahk_class AutoHotkey ; 掛起
PostMessage, 0x111, 65306,,, %AHKScriptName% ahk_class AutoHotkey ; 暫停

注意:當前我不清楚如何判斷腳本當前處于哪種狀態(tài)(當前腳本可使用 A_IsSuspended、A_IsPaused)。

還有哪些可用的消息缀旁?我提供幾點思路供參考:

  • 執(zhí)行操作時通過工具截取消息(消息很多记劈,這些屬于 WM_COMMAND)
  • 直接到官方論壇詢問作者

我比較懶,下面是通過源代碼提取的一些消息號(可能不完整并巍,前面部分是消息號分配的說明):

0: unused (possibly special in some contexts)
1: IDOK
2: IDCANCEL
3 to 1002: GUI window control IDs (these IDs must be unique only within their parent, not across all GUI windows)
1003 to 65299: User Defined Menu IDs
65300 to 65399: Standard tray menu items.
65400 to 65534: main menu items

消息號 含義
65300 ID_TRAY_OPEN
65400 ID_FILE_RELOADSCRIPT, ID_TRAY_RELOADSCRIPT
65401 ID_FILE_EDITSCRIPT, ID_TRAY_EDITSCRIPT
65402 ID_FILE_WINDOWSPY, ID_TRAY_WINDOWSPY
65403 ID_FILE_PAUSE, ID_TRAY_PAUSE
65404 ID_FILE_SUSPEND, ID_TRAY_SUSPEND
65405 ID_FILE_EXIT, ID_TRAY_EXIT
65406 ID_VIEW_LINES
65407 ID_VIEW_VARIABLES
65408 ID_VIEW_HOTKEYS
65409 ID_VIEW_KEYHISTORY
65410 ID_VIEW_REFRESH
65411 ID_HELP_USERMANUAL, ID_TRAY_HELP
65412 ID_HELP_WEBSITE

注:一般而言在更新版本時消息號的用途不太可能發(fā)生變化抠蚣,不過為了安全,在使用前最好明確其用途履澳,否則可能發(fā)生意外情況嘶窄。

實現(xiàn)的具體原理

在前面的腳本中我們應該注意到兩點:

  1. 開啟了對隱藏窗口的檢測
  2. 使用 AutoHotkey 類名獲取窗口

每個 AutoHotkey 運行時都有類名為 AutoHotkey 的主窗口(這個窗口為什么稱為主窗口?請參閱 A_ScriptHwnd)距贷,與是否創(chuàng)建自定義 GUI 窗口(自定義窗口的類名為 AutoHotkeyGUI)柄冲、是否隱藏托盤圖標、是否打開調試窗口(這里的調試窗口即是主窗口忠蝗,未打開時為隱藏狀態(tài))等無關现横。

說到這里,我想起了一個有趣的事情:為什么 AutoHotkey 被稱為模擬多線程呢阁最?從這里可以判斷出戒祠,每個腳本運行時至少有兩個線程:

  • 主線程,運行主窗口速种,負責接受消息姜盈、緩沖熱鍵及偽線程的中斷和切換等
    這里的描述可能不太準確和全面,不過大體上可以這么理解配阵,其中的偽線程是指幫助中所說的線程概念(例如 Thread 中所描述的線程馏颂,注意幫助中除了 A_ScriptHwnd 外從未涉及到主線程)。
  • 腳本線程棋傍,實際執(zhí)行腳本的線程救拉,這不用多說了,它執(zhí)行的就是我們寫的腳本瘫拣。

從 Microsoft Spy++ 中可以看到亿絮,實際上每個腳本也只有兩個線程(你多開幾個熱鍵,多用幾個計時器并不會出現(xiàn)更多線程)麸拄。

小結

盡管未談到游戲派昧,不過主要內容前面都說完了。因此感帅,要檢測 AutoHotkey 腳本的外掛只需在腳本啟動及運行時定期執(zhí)行:

DetectHiddenWindows, on
While WinExist("ahk_class AutoHotkey")
    WinKill

游戲不大可能用 AutoHotkey 寫斗锭,這里的演示大家能看懂它的用途吧?不過這種檢測方法只是我猜測的,對于如 AutoIt、按鍵精靈這樣的腳本語言應該具有一定的可行性(如果是 C 語言這種估計沒那么容易預防了)导而。正常的腳本如改鍵工具也無法例外了歹篓,有了解游戲開發(fā)的朋友能否能爆個真實情況葡粒。規(guī)避的方法也很簡單胁澳,自己下載源碼修改過類名編譯喔炕檩。

本文與游戲關系不大留攒,最開始的標題為腳本主窗口的妙用聪轿,不過這個標題是否更好呢爷肝?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陆错,隨后出現(xiàn)的幾起案子灯抛,更是在濱河造成了極大的恐慌,老刑警劉巖音瓷,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件对嚼,死亡現(xiàn)場離奇詭異,居然都是意外死亡绳慎,警方通過查閱死者的電腦和手機纵竖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杏愤,“玉大人靡砌,你說我怎么就攤上這事∩郝ィ” “怎么了通殃?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亥曹。 經常有香客問我邓了,道長,這世上最難降的妖魔是什么媳瞪? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮照宝,結果婚禮上蛇受,老公的妹妹穿的比我還像新娘。我一直安慰自己厕鹃,他們只是感情好兢仰,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剂碴,像睡著了一般把将。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忆矛,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天察蹲,我揣著相機與錄音请垛,去河邊找鬼。 笑死洽议,一個胖子當著我的面吹牛宗收,可吹牛的內容都是我干的。 我是一名探鬼主播亚兄,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼混稽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了审胚?” 一聲冷哼從身側響起匈勋,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膳叨,沒想到半個月后颓影,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡懒鉴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年诡挂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片临谱。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡璃俗,死狀恐怖,靈堂內的尸體忽然破棺而出悉默,到底是詐尸還是另有隱情城豁,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布抄课,位于F島的核電站唱星,受9級特大地震影響,放射性物質發(fā)生泄漏跟磨。R本人自食惡果不足惜间聊,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抵拘。 院中可真熱鬧哎榴,春花似錦、人聲如沸僵蛛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽充尉。三九已至飘言,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驼侠,已是汗流浹背姿鸿。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工谆吴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人般妙。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓纪铺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碟渺。 傳聞我的和親對象是個殘疾皇子鲜锚,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容

  • 從三月份找實習到現(xiàn)在,面了一些公司苫拍,掛了不少芜繁,但最終還是拿到小米、百度绒极、阿里骏令、京東、新浪垄提、CVTE榔袋、樂視家的研發(fā)崗...
    時芥藍閱讀 42,275評論 11 349
  • 注:中文應用部分仍需更新。轉者按:本文屬于零基礎入門專題教程铡俐,原發(fā)表于 Download!網絡密技王第三期凰兑,后轉載...
    amnesiac閱讀 3,382評論 0 6
  • Ubuntu的發(fā)音 Ubuntu滩报,源于非洲祖魯人和科薩人的語言锅知,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,362評論 9 467
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,288評論 25 707
  • 昨天最焦慮脓钾,尤其是中午做完磁共振后售睹,聽說周四還要再做一次的時候,感覺這手術遙遙無期了呢惭笑。 老爸平身第一次要上手術臺...
    吳佟閱讀 344評論 0 1