以前常常想辦法用偏門來改Flash網路遊戲的成績,後來好像越來越少Flash game的分數競賽贈獎,之前有個中華三菱 VIRAGE iO盃GT4大賽,不過後來被主辦單位刪除記錄,這就沒辦法了,今天早上收到台灣大哥大的贈獎信,省錢大作戰,後來用Sniffer看了一下(圖如下),發現這網站有奇怪的編碼,amf不知是什麼?問google,後來在Luar's Flash Playground查到AMFPHP等等訊息。

馬上利用Action Script Viewer來看看其中的程式。如下圖。

原來送出成績和個人資料是透過game_form.swf,在看看其內容。

發現用到NetConnection來保持Client和Server持續連線,避免偽造成績。
這下不能用最快的方式,利用HTML的FROM來傳值了。
且又用amf的remote web services,在ASV可看到。如下圖。

而dataIO是remote web services的物件,這也映證了,Sniffer所監聽到的封包,有addPersonal20050205。
那還有什麼方法可以解決,既然game_form.swf才是傳值的程式,那執行遊戲的game3.swf卻沒有做這方面的檢查,就從game3.swf來動手腳,找看看有沒有可以Decompiler SWF檔案的工具,很快的google又顯示了一套叫Sothink SWF Decompiler,很棒,可以Export FLA,試看看能否修改其成績起始值。
在Flash MX 2004很快的找到_aaaa_abc_xyz_score = 0,修改一下。
問題又來了,那Server端可能會檢查網址的來源,除非可以上傳到Server端,其實可以騙Browser,小弟想到兩種方式,1.自行架設DNS,再指到那DNS,等要傳值時在改成正確的DNS。2.利用靜態對應表,在WINDOWS\system32\drivers\etc\host檔案直接修改,此方法較不適用,如下補充。如下圖。

這兩個方法,都必須要架設Web Server,才可以。
把那檔案放到Web Server,清空Browser快取。下圖可看到修改過後的game3.swf。因為沒有相同字型所以字會跑掉。

分數不要用太高,只是看看這方法能否成功。

按下填資料拿獎品之前,要將靜態對應表修正回來,刪除剛剛所加上的對應。
這樣才能導向真正的game_form.swf,從下圖的左下角可以看到持續連線中。

關鍵時刻來臨,送出看看。排名第四,奇怪怎麼沒有更新排名呢?

其實網路贈獎就是這樣,很多都是廣告公司的問題,就像之前Philips科技大亨的贏家是位女生,其實當時很多人分數都很高(遊戲有疏失,鬍子老爹事件),但是決不可能是位女生得到冠軍(非男女歧視,而是分數高都是有作手腳),加上那女生非資訊科系,所以小弟當時認為是廣告公司的宣傳手法,找位外表亮麗的女生來做宣傳。
至於Flash Game能否防止這類的作弊方式,FlashCom是對付「遊戲積分排行榜作弊」的解決方法有說明,這省錢大作戰也是有用到,只是它是用在game_form.swf的ActionScript,所以很可惜,1.改進方式應該把遊戲也用NetConnection來檢查。其它Luar所談到的2.RTMP Protocol,3.Flash Remoting用戶認證,小弟對FlashCom不熟以後再研究看看。4.VHost.xml跟5.main.asc可能依然沒法防範本文所說的欺騙方式。感謝Luar的文章,在MAX2004中有談到Flash資訊安全,Luar網站有提供下載。
歡迎來信討論有關Flash安全相關問題。
最後,本篇文章只是以台灣大哥大遊戲案例來討論Flash Game的問題,並非建議使用這種方式來得到獎品,小弟不負任何後續的法律責任。謝謝。
補充(2005-02-21)
感謝Luar的回應,在其示範怎樣利用偽造DNS進行Flash遊戲積分作弊補足了小弟第一個方法沒有示範的遺憾,經過測試發現雖然靜態對應表改過後,Ping DNS也是馬上更改,但是Browser卻不會馬上更新,必須經過一段時間還會導向改過的DNS,而小弟寫這篇文章是一邊試驗一邊寫,所以才使得Browser經過一段時間更新了DNS,如果在限定時間回應的Flash Game就不是用靜態對應表的方式,因此經過Luar的糾正,此靜態對應表並不是一個好方式。再次感謝Luar的回應。
補充(2005-02-23)
因為這遊戲還有檢查FlashVars變數(如下圖),小弟之前文章並未提起,所以導致整個傳值並未完整,所以並非廣告公司問題,是小弟的疏失所導致,還他們清白。

可以利用session的功能。
在遊戲的首頁產生一組變數丟給flash。
最後提交資料時,server端就可以去檢查變數是否一樣。
Flash Remoting用戶認證的方法
覺得被decompiler的軟體解出後,似乎就沒太大的幫助。
yuan,如果是利用單純的session,會因為sniffer監控封包而無法作用,利用AMF是比較好的方法,至少內部運作client端看不到,小弟看您的文章有講到這session,不知也是利用web service來防止。謝謝您的留言。
Posted by philipz at February 21, 2005 05:34 PM你好。利用session只是輔助確認。
該使用者是從遊戲的首頁進來這個遊戲
所以在遊戲的首頁會先利用php來產生一串亂碼。
再設變數 id 的值為亂碼
(1)將變數傳給flash。
(2)利用session將id的值記下。
最後,當flash要提交資料給server時。
也把id一併提交。
server端的程式會檢查這個id的值和session的id值
是否相等,如果相等。就確保這筆資料是由網站的game
所送過來的。
如果不相等。就另外處理。
所以你的分數是因為在server時,
檢查發現不是由遊戲送產生,
所以才沒有將你的分數送進排行榜中。
:)
Posted by yuan at February 21, 2005 10:06 PM這session檢查在sniffer分析時會看到,加上Decompiler工具太多,很方便就可以去知道編碼方式,並透過POST傳遞,所以這方法Luar應該之前就說過,不是好方法,之前三菱汽車的遊戲就利用類似方式。
至於為何分數沒送進排行榜,這就不明說了,這種Flash贈獎正常都會在最後一天看到很激烈的名次變化,但這卻沒有。呵呵。
呵,你好,能向你要一下email嗎?
我的是iamyuan@gmail.com
想向你請教一下。
別說請教,討論就好,小弟的email:philipz@everfine.com.tw,很高興跟您討論,之前參加聚會遇到阿修也討論的非常高興。
這款遊戲從推出到目前至少改了 10 個版本,
儘管這樣目前依然能夠作弊的, 加油吧 yuan !!
別讓漏洞導致公司名譽損失歐 !
那請問你後來有試成功了嗎? 呵呵..
因為,這個遊戲,就是我朋友請教我之後,請遊戲製作者他們一改再改的.
使用了 AMF + Session 的基本技術.., 只差沒把 Flash 加密..
我在想,
改到這個階段, 大概只剩下高手中的高手, 可以解決了.
後來的Session應該是可以破解了,但是沒有實際去試過。
主要最大的因素還是在FLASH可以Decode,加密是個好辦法,透過SSL(對網域做認證,應該可以防止偽造FLASH),不過目前還沒有看到。
呵呵 當然是可以破解,
且是在他們的 swf 加密後的狀態.
to philipz 兄
您提供的方式也是可以破解的歐.
如果有玩單機版遊戲的人應該知道有個東西叫"金手指",
只要 flash 中的變數是載入記憶體就一定可以被破解,
且這只是其中的一種方式( 我不是使用這個 ).
我想问的是,如果用DNS伪造了服务器后,如何把真正的原网址放到我的Web Server?我可以下到它原来的SWF,但网页文件呢?原先如果是ASP。PHP的,又怎么在我的WEB SERVER里生成同样的页面?
盼赐教,谢谢!
Posted by wei at April 7, 2005 12:18 PMTo Sam:
可以分享一下您的方法嗎?
個人認為金手指方式在目前Windows在Compiler完全包裹封閉下不是很容易可以知道變數的allocation,不像DOS軟體是在一定範圍下。雖然也有遊戲修改大師這樣的修改程式,但是在Flash player sandbox機制下和SWF加密,應該也是無法直接從記憶體下修改變數。
To Wei:
DNS方面請參考Luar的示範怎樣利用偽造DNS進行Flash遊戲積分作弊,至於ASP跟PHP方面,可以先抓取數值後,直接丟入。例如,Server端PHP透過Time產生TimeStamp,之後Flash抓這TimeStamp後才運作,所以就要偽造這TimeStamp。所以如果再把這TimeStamp作加密就不容易在Local端偽造。
To Philipz :
呵呵~
我有個朋友就是使用遊戲大師破解該款遊戲,修改其記憶體內變數.( Flash player sandbox連結失效 )
不好意思喔,
小弟僅能提供預防的方法 :P
如果有需要小弟亦可幫忙測試 :)
To Sam:
Flash player sandbox連結已經修復。
您的朋友是利用遊戲修改大師去破解Flash的嗎?
如果可以那真的是太神奇了,小弟就要再寫一篇這樣的破解方法。
如果有遇到的話, 因為他現在是學生.
我有大概看過他操作的方式
1. 開啟遊戲 flash
2. 開始玩遊戲
3. 使用遊戲大師掃描記憶體中與遊戲分數相同的值
4. 鎖定
5. 再掃描
6. 重複 3-4-5 這三個步驟 直到鎖定的位址到 10 個左右
7. 改變或鎖定那幾個數字
8. 成功
大概是這樣的步驟
他們已經是使用遊戲大師的專家級
小弟看他們用了很多次還是無法抓到訣竅 :P
不過此方法在台哥大此款遊戲中是會被偵測出來的
該款遊戲中隱含數防作弊的變數
如
1. 總操作時間
2. 被怪物碰了幾次
3. ...
大約 6 個吧 ( 因為實在改太多次了 )
所以導致資格被取消
也算該作者有防堵到一些人
谢谢philipz的回答,但PHP那段,我还是听得不大明白..我想问的大意是如果伪造了某个域名,那如果FLASH游戏的那个网页是ASP的页面,那如何在本地的WEB SERVER也作出这样一个ASP页呢?
另外这里推荐一个正在举办的活动给你们看看啊.
这个FLASH比起你们的是简单多了,但我作弊了多次,也都被查出,如用FORM GET 方式 ,还有就是这个FLASH有个BUG,有三关,在其中一关玩了一会后,可右键再点播放继续来,分数不变,会累加,造成很容易到第一名,但我这样作过也被发现了,不知是为什么,请各位赐教,谢谢!
http://www.mnssr.com/game/LLK.htm
另:Luar的示範怎樣利用偽造DNS進行Flash遊戲積分作弊 中,在IIS中选择的那个目录是什么目录?为什么会打开一个类似调试的页面?
是MAX 2004?有下载么?
Posted by wei at April 8, 2005 02:46 PMTo Wei:
您如果會寫PHP或ASP傳值到FLASH就知道我的意思。
至於這蒙牛贈獎看起來只需要HTML POST就可以了。
本篇方法也可以應用到這贈獎,詳細做法就您自己去實驗了。
因為我沒有買過,所以不知那生產日期格式。打錯可能就無法傳入DB。
Luar的偽造DNS我沒詳細看,您可以去詢問他。
To Sam:
透過遊戲修改大師這方法雖然可行,但是似乎非常麻煩,遇到類似本篇範例的FLASH,可能沒法偽造。所以從FLASH Decompiler應該是比較好的方式。因遊戲修改大師不是一個通用方法就不打算寫相關的文章了。
世上果然處處是高人阿~
小弟當初就是服務在各位所謂的網路廣告公司,也辦過不少活動。有幾個網路的Flash遊戲比賽,就是小弟規劃的。但正如各位大大所說的,有遊戲就有作弊。因此,只要辦這種活動,就會一堆作弊,然後公司人仰馬翻,加班加不完,客訴接不斷,客戶罵不停。
漸漸的,網路上越來越少看到遊戲比賽了。
因為各位「努力」的付出,台灣網路廣告和行銷的發展也小小的轉變了方向。
你們真是台灣奇蹟啊~~