天龍八部基於顏色的簡易動作式外掛
來源:互聯網
上載者:User
首先聲明,本文重在記錄寫這麼一個玩意的過程。因為恢複了系統,所查閱的技術上的資料地址已經丟失,無法貼出來與大家分享,但最後我會附上源碼,代碼我也已經做了比較詳細的注釋。為了操作API方便,代碼是C++的,程式本身沒有什麼技術含量,大多內容也都來自網上,文中就不對技術方面過多的解釋了,對鍵盤滑鼠類比關心的朋友直接看代碼就可以了。
起因是一個哥們勾引我玩天龍八部遊戲,3個月前他開始玩天龍八部,現在角色名稱字已經出現在熱門排行榜上,他的幾個同事也都在玩,無疑這是一個很好的環境,不由的動了心。 通常我會在瞭解了遊戲之後,弄個協助工具輔助減輕一下工作量,玩征服征途的時候,都弄了個簡單的補血補藍,施放輔助技能,撿東西等,自動打怪還沒有做過,這次想嘗試一下,最簡單的自動打怪是根據顏色來的,按鍵精靈就可以實現。按鍵精靈可以根據指定圖片找到螢幕上相似圖片的位置,對於圖片的尋找,一直沒有搞清楚如何來實現,下過一篇論文,用到了小波變換,也沒看懂,汗。不用圖片當然也可以,那麼這就要根據怪物特徵色來判斷,特徵色就是螢幕上只有怪物才有的顏色。有了這個顏色,我們就可以搜尋螢幕座標的顏色來和這個顏色對比,如果足夠相似,那麼就可以認為是怪物,也就可以找到怪物的座標,之後的事情就簡單了,Attack之就可以了。
接下來對這個大體思路要細化了,首先如何搜尋螢幕座標,逐行逐列挨個座標搜尋肯定不行,1280*800的解析度掃描一遍要多久啊。看來不能挨個掃描,那就有個步長或者說是跨度,那麼這就有個問題,那如果正好錯過了和怪物特徵色一樣的那個座標,就漏了這個怪了。那麼對於顏色相似的判斷,用RGB比較就不如用HUE來比較了,後者使用色調,灰階,飽和度來表示顏色。都是綠色,不管是深綠還是淺綠,他們的色調相差是不大的,也就是H值是差不多的,這樣我們用這個來判斷座標在不在怪物身上就方便多了,畢竟我們取得怪物特徵色並非只有一個點,一般會有一片都是類似的顏色。並且這樣也可以忽略3D遊戲中光照對於顏色的影響了。
顏色比較的方案確定了,接下來考慮找怪的掃描方式。以角色為中心,往四周漸開掃描應該是最好的,這樣可以找到距離自己最近的怪。在此呢我又多想了依稀,一般遊戲都有小地圖,小地圖上會有角色以及周邊怪物的表示,不論什麼怪都是相同的標誌,並且能看到的怪物也比螢幕上要多,而且小地圖範圍很小,逐個像素掃描也是很快的,於是考慮通過小地圖來找怪,這樣就牽扯到兩個座標系轉換的問題,一個座標原點是小地圖角色標誌,一個是螢幕中心,能把這兩個轉換過來就好,找怪速度會快很多。事實證實通過小地圖直接找怪這個想法不現實,因為座標的轉換隻能通過實踐出來一個大體的轉換比例關係,並不準確,更多的情況是能指到怪物旁面,並不能指到怪身上。那麼只好通過以螢幕中心為中心,漸開跨度掃描怪物特徵色的掃描方式來尋找怪了。經過測試,效果還可以。
接下來就只剩下滑鼠鍵盤的類比了,對於滑鼠鍵盤的類比,最簡單的就是mouse_event()和keyboard_event()了,同時結合SetCursorPos()就能搞定了,以前就這麼乾的。沒多久,寫好了,簡單測試一下,ok了,能用了。晚上回到家,開啟遊戲,一測試,傻眼了,SetCursorPos還可以用,把滑鼠如期放到怪物身上了,但是mouse_event()失效了。不小的打擊啊,現在遊戲放外掛,一般會屏蔽一些API函數。於是開始狂查資料,因為很少用C++,好多東西都不知道,查遊戲如何攔截API,查注入,查如何反np,查如何hook API,還看了《windows核心編程》第19章和第22章關於dll和注入的一些,查類比滑鼠鍵盤的其他方式。很快 一星期過去了,也該回家過年了,關於api hook部分,會單拿出來一篇文章介紹一個簡單的vs2005能編譯啟動並執行例子(ps網上能找個能運行又清楚的例子著實花了不少時間)。
年後回來靜靜心,繼續琢磨,到此,我已經用SendInput()這個更底層的API,和WinIO驅動級類比實現了,但是在遊戲中始終不行,網上也說np可以封到核心API,因為WinIO用了特徵碼,又大名鼎鼎,也可以被np封了。那難道只能寫滑鼠驅動了嗎?不會寫啊。我開始考慮我的思路出了問題。既然說mouse_event()被封了,那為什麼不一起把SetCursorPos()也封了?下載按鍵精靈,裝上,寫個簡單指令碼,進入遊戲,一試,再次傻眼,按鍵精靈竟然可以。又下了快電7,也可以,開啟這兩個程式的檔案夾發現快電7應該用了自己的驅動級類比,有個sys檔案,但是按鍵精靈檔案夾下有WinIO.Dll以及VXD檔案,沒有相應的Sys檔案,dll檔案的大小也比我下載的大了十幾k,難道按鍵精靈重寫了這個dll?換上按鍵精靈檔案夾中winio的dll和vxd,發現程式可以照常編譯運行,拿到遊戲下依舊不起作用。難道是因為按鍵精靈的神盾保護了自己的進程不被注入?想到此,我覺得應該查看以下我的程式是否被天龍八部的保護程式給注入了以攔截我程式調用的API。於是從網上下了冰刃,查看的結果又大吃一驚,程式的進程乾乾淨淨,除了被安全衛士和靈格斯注入了以外沒有其他任何線程。這就奇怪了,百思不得其解。
昨天,一怒之下下了好幾個滑鼠鍵盤類比工具,有的可以,有的失效。終於有個鍵盤滑鼠鍵盤記錄的小軟體引起了我的關注清單,軟體很小,單獨一個exe和一個設定檔,檔案裡有座標值以及操作WM_LBUTTONDOWN這樣的訊息,難道用PostMessage()可以嗎?試了一下不行,更加困惑了。一邊琢磨一邊拿他試,忽然發現一個小細節,在重播我滑鼠按鍵動作的時候,按下和彈起的動作很清晰(遊戲中滑鼠按下滑鼠會變樣子),一個小手一勾一勾的,而我的程式完全不會看到有任何動作,因為按下和彈起之間沒有一點時間間隔。加個時間間隔試試吧,Sleep了0.1秒,一試,天,果然可以了,如果說我這篇文章還有一丁點值得你看的地方也許就在此了,遇到相同問題的朋友不妨在按鍵按下和彈起的中間加個延遲試試,或許能成功。這個看似很小很沒技術含量的操作確著實花了我大部分的時間。做程式有時就是這麼有趣。說到這也就沒有啥好說的了,程式還不完整隻有個大概的準系統,還有幾個地方臨時用簡單的不完善不雅的方案有待替換。另外對於螢幕沒有怪或者怪超出搜尋範圍的情況,可以用先搜小地圖移動到怪物附近再搜大地圖的方式解決。
對基於顏色的動作式的外掛的學習和實踐就到此為止吧,還有更重要的更有意義的事情去做,最後附上代碼,希望對大家能有所協助。
源碼:http://files.cnblogs.com/pcant/tlbb.rar