1. 程式人生 > >一個苦逼遊戲輔助開發人員的自述

一個苦逼遊戲輔助開發人員的自述

關注NBE好長一段時間了。看到前一段時間,有一個遊戲輔助作者同行發的連載系列文章《一個苦逼遊戲輔助開發人員的自述》,真得是深有感觸,所謂外行看熱鬧,內行看門道,看看評論,有人說他是在吹牛逼,有人說他是靠自己想象力天馬行空亂寫,我也只能是“微微一笑”呵呵!因為我也算是個外行!

今天,我也來分享一下寫遊戲輔助的點滴歷程,是微微一笑,還是呵呵,都無怕所謂了。

對於遊戲輔助行業而言,我屬於“外行”。我本身算得上比較“老”的一代程式設計師了,趕上了2000年網際網路泡沫的尾聲。在學校的時候就喜歡搞一點黑客、破解什麼的,但僅僅是出於興趣愛好。畢業之後,一直從事軟體開發相關的工作,做過網路遊戲,開過網際網路公司,眨眼間,在軟體行業裡面混了十幾年了。興趣原因,經常混跡於當時的看雪學院、小榕軟體、綠盟論壇等,膜拜各路大神的時候,也在默默的積累技術。

最早準備寫輔助是當時玩完美的遊戲,完美世界、誅仙之類的網遊。現在的遊戲輔助基本框架也都是在那個時候積累下來的。因為搞傳統軟體研發養成的習慣,輔助框架寫的質量還算可以,並且文件什麼的也比較規範,算是給現在的工作打下了比較好的基礎,很多東西都可以重用。當時有一個本地的遊戲工作室想讓我給他們專職做輔助,但是考慮到種種因素,沒有答應,後來輔助的開發進度也一拖再拖,最後也逐漸不好意思和他們聯絡了。再後來,工作越來越忙,也就把這個事情放下了。

再後來,朋友的朋友找到我,希望給他開發輔助,當時有一搭沒一搭的聊,因為自身收入還不錯,所以也就沒有很上心。再後來,礙於朋友的面子,加上對方一催再催,只好答應對方。

對方是一個不算大的網路遊戲工作室,大約有60臺E3+32G電腦主機,在當時算是不錯的配置了。遊戲工作室老闆A是一個非常聰明能幹的小夥子。

A從輔助代理商人那裡買的遊戲輔助,但是因為遊戲工作室不大,所以價格、服務等方面都不能讓A滿意。因為很久不碰輔助的東西了,並且當時要做的遊戲J3我也沒有玩過,所以我讓A給我了一份他正在用的輔助。經過分析之後,感覺能做,於是開始動工。

當時的J3是有巨集介面的,並且出金思路主要圍繞試煉副本和幫會釣魚,所以核心功能很容易就完成了,先讓A跑起來。在當時,J3已經是被很多遊戲工作室稱為夕陽遊戲了,開服時間太長了,但是A認為,J3是點卡遊戲,生命週期本身就會相對較長,並且,如果出金思路正確,可以在做上至少1年。現在看,當時A的思路是非常正確的,因為,現在已經過去了一年半多了,他們依然還在圍繞J3做。

核心跑起來之後,遊戲工作室需要大量的人工去看機器,並且,因為J3自身的優化的問題,單機的多開受到了極大的限制。圍繞人工問題,我又製作了控制檯,可以同時監控本機各個視窗的角色、等級、狀態、紅藍、地圖/位置、揹包、金錢、體、精、幫貢等一系列資訊,這樣,遊戲工作室員工只需要看一眼控制檯,就可以瞭解本機的所有視窗的掛機情況。

圍繞效率問題,我徹底修改了掛機方式,通過降低渲染幀數的方式,把幀數降低到了30秒一幀,基本上算是解決了CPU佔用過高的問題。基本上前面提到的E3機器可以開48開沒有什麼壓力。這次的修改大約陸陸續續用了我半年的時間。

至此,輔助的整體框架已經和最初的設計天差地別了。最初僅僅是要製作一個簡單的外掛,通過修改遊戲客戶端的資源包載入到客戶端就可以了。但是現在,已經變成了一個主控臺,通過主控臺自動批量啟動、自動登入,支援卡位報警、能夠執行自定義指令碼、能夠定時執行命令、能夠定時關閉客戶端(每週1周4停服維護),然後針對客戶端能夠進行鎖屏,能夠進行遊戲內自定義指令碼除錯、錄製等等等等……

一切看上去那麼美好,我都深深的為自己的偉大創舉而內牛滿面……

然而,2014年暑假期間,相信做J3的朋友都不會忘記,J3開始大面積封停。那段時間,基本上起一批封一批,起了就封、再起再封。A和他朋友的遊戲工作室損失慘重。那段時間也恰巧碰上我的工作也很忙,只能晚上熬夜除錯,找問題、找方案。基本上那段時間每天只能睡三四個小時,其餘的時間,要麼做公司的事情,要麼在除錯輔助。

整整2個月的時間,處於崩潰的邊緣。因為嚴重睡眠不足,上下班路上開車,半個月三次事故,其中有兩次發生在4天內,也就是剛從4S店把車提出來的第二天,就又來了一次事故。所幸都是刮擦和追尾事故,也沒有碰上對方是豪車,前後兩個保險槓都換過了,噴漆也免不了。

期間,不止一次想要放棄,畢竟自己的工作收入也不錯,加上這麼多年的打拼,也算是衣食無憂了,真沒有必要這麼拼命了。然而,A和他朋友的遊戲工作室已經都切換到了我的輔助,我有退路,他們卻沒有退路。

思量再三,只能堅持。終於,通過分析客戶端和網路封包,找到了J3上報的檢測資料,找到了規則,就很簡單了,APIHook,把異常部分跳過去就OK了,對於無法跳過的規則,簡單粗暴的重啟客戶端重登入即可,畢竟無法處理的機率比較低,好幾天才能碰到一次。終於,經過幾次調整之後,總算是穩定了。

美美的睡了兩三個周之後,問題又來了,J3又開始進行無節操的封停了。檢查之後發現,客戶端的檢測規則沒有變化,那麼問題只能是出在伺服器端了。因為在座APIHook的時候,我已經對本機硬體序列號、MAC地址、區域網IP等資訊都做了處理,那麼伺服器端能夠檢測的只能是公網IP了,應該是通過類似於對網咖IP段做白名單,個人的同一個IP如果同時登入的客戶端過多的話,就會進入封停判定。我讓A去嘗試同IP登入上限,同時開始考慮應對方案。

因為A的機器前邊是48開或者多的掛到50開,而Windows自身又沒有機制能夠對多個網絡卡進行可定製的分流,所以這個多IP的方案又讓我犯了難……
考慮再三,我讓A直接使用市面上的IP代理軟體先跑起來。跑了大概有2個周的時候,A告訴我,還會有封停。初步考慮IP代理可能會一個IP賣給多個遊戲工作室,從而導致封停問題。

至此,沒有退路和藉口的我又開始了漫漫的熬夜的日子。其實解決方案倒也簡單,我自制了個路由器的ROM,讓路由器充當代理伺服器,然後在本地使用LSP劫持了通訊的函式,通過自己寫的代理客戶端完成通訊,通訊時按照配置選取通過那個代理伺服器通訊。雖然各種不完美,但總算是能夠穩定的跑起來了。

測試沒有問題之後,A和他的朋友們開始批量採購定製的路由,批量拉網線。據說光A自己就新增了近600條網線。

A的遊戲工作室規模越來越大,管理也越來越複雜。在完成了定製路由之後,休息了沒幾天的我又被A要求想辦法降低人工。

沒辦法,顧客就是上帝……

於是,我又製作了網路控制檯,可以監控多臺機器上的角色,同時能夠進行一些簡單的維護工作,像重啟客戶端、傳送命令什麼的都可以在網路控制檯上。又是一個多月的熬夜,終於算是穩定運行了。至此,A的160多臺機器,只需要3個員工就可以輕鬆維護,時不時還能休個假、聚個餐什麼的。

而我,因為長時間的熬夜,身體被嚴重透支,頭暈、耳鳴、神經衰弱,腰椎和頸椎也都出現了問題。嚴重的一次,左手拿了一杯水,硬生生的給抖的灑了一地,死活沒法送到嘴裡。當時正好快年底了,從公司請了年假,帶著老婆孩子省內逛了一圈,玩了大概半個月,身體才逐漸好了一點。

休整回來後,陸陸續續完善了一些功能。像11月份更新後出售需要確認、4月份版本更新後神行的過圖問題等等,都是一些小的調整。比較大的改動是做了自動合成螢石的功能,後來合成螢石不需要跑洗煉臺了,辛辛苦苦做的半仙羅盤、試煉臺尋路什麼的也就都沒有什麼用處了。

執行到今年,剛過春節,A又找到我,說出金效率隨著金價的降低,需要調整了,否則遊戲工作室開始沒有利潤了。

於是乎,又一次開啟熬夜模式,比較湊巧的是,公司也恰好在這時開始一個重要專案的合作,前期的準備工作交給我來完成。熬夜,熬夜再熬夜……

經過把試煉和釣魚功能完全推翻重寫,終於能夠做到5000分裝備的號平均4分30秒左右試煉通過,全部用來打試煉的話,每天大概能打330封到350封信,配合每晚的釣魚活動,只需要極少量的副本就能把精力完全消耗光。

就在前幾天,新版本更新後五行石合成介面變了,不能合成五行石了,又進行了簡單的調整。

林林總總,也算是在遊戲輔助這個圈子裡做了幾年了。

這是一個嚴重透支體力精力的工作。在這幾年裡,身體每況愈下,到現在已經算得上是渾身是病了。如果按照投入產出比來說的話,也沒有大家想象的那麼划算。我現在的工作,每年能拿個小20萬,加上年底分紅,也能有個10幾20萬吧,並且基本上每年都能夠上一個臺階。而寫遊戲輔助,付出的要比工作更多,雖然看上去一年也能有個幾十萬的收入,但是真的是太累太累了。

我有的時候就在想,如果我拿寫遊戲輔助的這些精力放在工作上,或者再重新創業,應該不會比現在做輔助收益少。但是無奈,上了這條船,遊戲工作室一幫人還在指望著我,只能再堅持一段時間了。

大約2個月前,我也和A也進行了一次長聊,雖然沒有直接說不想開新專案了,但我告訴他,應該考慮一下雙專案並行,不要把寶全押在J3上面了,我真的累了。

我估計J3再做1年應該沒有大問題,但是,J3結束之後,我不想再繼續寫輔助了。畢竟也老大不小了,體力和精力都跟不上了,遊戲輔助這個行業還是年輕人的天下。

對於想入行的,在NBE徘徊的年輕人,我想說,這個行業其實沒有那麼難,同時也沒有那麼美好。技術層面如果要開發精品的話,還是得靠C/C++來支撐。如果是需要趕暴利期的話,那就隨意了,什麼開發快用什麼,像什麼E語言什麼的,雖然我沒有學過,但是可以肯定它學起來很容易。入門很簡單,網上有大批的教程。

學習遊戲輔助製作,還是需要有比較全面的知識的。比如常見的系統API什麼的,肯定是要熟悉的,而如果是注入式的內掛的話,各種注入方式、各種Hook技術也是必須要會的。比如,我的這個輔助,算不上完美、也算不上強大,裡面用到的技術我簡單的把想到的羅列一下:

一套自己的網路框架,能夠處理客戶端和控制檯之間的各種訊息通訊,同時也用在了單機控制檯和網路控制檯之間的通訊上;

一套自己的Hook引擎,用於在關鍵點掛接,比如幀數優化、反和諧等。這裡面採用的方式有Jmp跳轉方式的inline-hook、除錯中斷(包括int3中斷和硬體中斷),其他的還有記憶體訪問中斷等;為了配合上下文資訊的獲取,還有呼叫堆疊的處理等;

一套自己的DLL載入器,通過DLL載入器,徹底隱藏注入的DLL,避免被掃描到;

一套自己的資源打包、解包管理,將一些文字、指令碼等檔案進行打包處理,提高破解門檻;

一套自己的特徵碼掃描引擎,能夠根據特徵碼自動掃描出exe和dll裡面的基址、偏移等資訊,減少遊戲新版本更新後的基址查詢工作量。通過它,我基本上能夠做到開服前更新基址;

一套自己實現的socket代理客戶端,能夠改變制定程序的網路訪問路徑;

一套基於lua語言的指令碼引擎,能夠解析並執行自定義命令及其引數,帶有分支、迴圈等特性,同時能夠自定義變數、自定義函式等;

暫時就想到這些,有的內容寫的時間也比較久遠了,很多東西都需要翻文件或者程式碼才能想起來了。

如果有別的出路的話,先考慮去工作吧,這個行業的艱辛超過你的想象。雖然我走的算是一路順風順水,但是這些和A的支援、天時地利都分不開。

不要小看一個簡單的輔助軟體。要知道輔助對於Bug的容忍度要遠遠低於普通的專案軟體。要知道,一旦遊戲輔助商業化之後,同時執行的數量和持續時間,都遠遠大於普通的商業軟體。

正是因為長時間、大批量的執行,程式的任何缺陷都會被放大。比如試煉中的推石頭關卡,有百分之一的機率會失敗,那麼,在A的遊戲工作室裡面160臺機器同時執行,就相當於同時執行7000多個視窗,每個視窗每天大約通關320次,其中推石頭關卡出現的機率是4/9,也就是所有的機器裡面推石頭關卡會出現近100萬次,失敗大約1萬次,如果每次失敗增加通關時間2.5分鐘的話,相當於為整個遊戲工作室浪費了25000分鐘,這相當於單號打試煉通關5500次,遊戲工作室的利潤,就這麼被浪費了。

可能會有童鞋質疑,比如J3能不能做,能做的話利潤太低什麼的,做過童鞋的可以幫我回應一下,我沒有做過遊戲工作室,沒有概念。我只能給出幾個基本的資料:

釣魚進行了加速,基本上魚兒上鉤那個訊息一到,就開始了下一次甩杆動作了,省掉了收杆動作,具體的釣魚次數我沒有統計;

試煉之地只打第一層,4500分裝備大約4分40秒,5000分裝備大約4分30秒,6000分裝備大約4分20秒,這都是比較保守的數字;

每條網線跑8個視窗,A那邊的網費比較便宜,每條線每個月30左右;

遊戲工作室需要員工3人,加上A自己出貨交易;

基本上能夠做到平價煉號,不賺不虧(指令碼+滿級號組隊帶,有工具配合);

宣告:我不賣輔助,不帶隊,不收徒弟,我只是一個外行遊戲輔助外掛作者,今天與各位寫輔助的同行分享一下自己的經歷而已。身心俱疲,前言不搭後語,見諒。就說這些吧,諸君見仁見智,有意見使勁拍磚。