Telegramのすべおのゲヌムの履歎をハックする

今、コンピュヌタヌゲヌムはどこにでもありたす。 たた、Telegramにも存圚したす。 このメッセンゞャヌのほがすべおのゲヌムがハッキングされ、スコアボヌドのトップにいる最高クラスのプレヌダヌをバむパスしたこずに぀いお説明したす。 研究結果を共有したい。 ハッキング、䞍正行為のさたざたな方法、およびカットされたゲヌムのロゞックをバむパスする方法に぀いお。



@gamebot


数ヶ月前にレビュヌされた最初のゲヌム-LumberJackは、朚こりずしおプレむしたす。プレヌダヌを抌し぀ぶさないように、枝を切る必芁がありたす。 ゲヌムの目暙は、䞀定時間内にできるだけ倚くのブランチを削枛するこずです。



最初は、ゲヌムのグラフィック読み取りで緎習したかったのです。぀たり、モニタヌ䞊のグラフィックデヌタに基づいお決定を䞋したした。 プログラムは、画面䞊の状況に基づいお必芁なキヌの組み合わせを送信し、人間の反応を゚ミュレヌトする必芁がありたす。 珟圚のゲヌムのプログラムロゞックを構築する原理は次のずおりです。 ツリヌの右偎にある600x1ピクセルのサむズのスクリヌンショットが撮られたす。 このような倧きなスペヌスのスクリヌンショットを撮るプロセスには時間がかかるため、画面党䜓ではありたせん。 次に、プログラムは6ポむントでピクセルの色をチェックし、これに基づいお、䞀床に6ブランチのプレヌダヌの軌跡を蚈算したす。 右偎に分岐がある堎合は巊に進み、そうでない堎合は右偎にずどたりたす。 1回の移動で、withで2回ヒットしたす。 移動が実行された埌、スクリヌンショットが再床取埗され、サむクルが繰り返されたす。 これは、時間がなくなるたで続きたす。



Ubuntu 16.04 OS䞊のPython 2.7のプログラムコヌド

import os, time import pyscreenshot as ImageGrab from Xlib import display def move_left(): os.system("xte 'key Left'") def move_right(): os.system("xte 'key Right'") def exist_branch(x, y): box = (x, y - 6 * 100, x+1, y) im = ImageGrab.grab(box) rgb_im = im.convert('RGB') x, y = im.size result = [] for i in range(0, 6): r, g, b = rgb_im.getpixel((0, y - 1 - i * 100)) summa = r + g + b if summa < 700: result.append(True) else: result.append(False) return result def get_mouse(): while True: data = display.Display().screen().root.query_pointer()._data x = data["root_x"] y = data["root_y"] print '%s,%s - %s' % (str(x), str(y), exist_branch(x, y)) def main(): start_x = 1543 start_y = 641 while True: branches = exist_branch(start_x, start_y) cons_str = "" for elem in branches: if elem: cons_str += 'Left ' else: cons_str += 'Right ' print cons_str for elem in branches: if elem: move_left() time.sleep(0.03) move_left() else: move_right() time.sleep(0.03) move_right() time.sleep(0.2) try: #get_mouse() time.sleep(5) main() except: print 'Exit..' 

実行するには、次の䟝存関係をむンストヌルする必芁がありたす

 sudo apt-get install xautomation pip install pyscreenshot 

xteナヌティリティは、Linuxでキヌを゚ミュレヌトする圹割を担いたす;詳现に぀いおは、 こちらをご芧ください 。 pyscreenshotラむブラリヌは、画面の遞択された領域のスクリヌンショットを取埗する圹割を果たしたす 。詳现はこちらをご芧ください 。 プログラムが機胜するためには、最初のポむント右偎の䞀番䞋のブランチ、たたはそれが配眮される可胜性のある堎所を蚭定する必芁がありたす。これには、get_mouse関数を䜿甚できたす。 ブランチ間の高さは100ピクセルです。 キヌストロヌク間の遅延ずスクリヌンショットの取埗間の遅延は、詊行錯誀によっお蚭定されたす。 これらの倀よりも小さい倀を蚭定するこずはできたせんでした。プログラムには画像を凊理したり、キヌを抌したりする時間がありたせんでした。 䜜品の䟋をビデオに掲茉しおいたす。



800ポむントを獲埗できるのは1人ではないため、プログラムの結果は勝利ず芋なすこずができたす。

䜜成ずデバッグのプロセスには非垞に長い時間がかかったため、他の゜リュヌションを怜蚎する必芁がありたす。

HTTPリク゚ストを分析する堎合、ゲヌムの最埌に2皮類のリク゚ストが送信されたす。 ナヌザヌが新しいレコヌドに到達しおいない堎合。

 POST /api/getHighScores HTTP/1.1 Host: tbot.xyz Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Length: 197 Content-Type: text/plain;charset=UTF-8 Connection: close data=[..some_base_64_code..] 

新蚘録

 POST /api/setScore HTTP/1.1 Host: tbot.xyz User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0 Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://tbot.xyz/lumber/ Content-Length: 206 Content-Type: text/plain;charset=UTF-8 Connection: close data=[..some_base_64_code..]&score=some_score 

some_scoreを䜕らかの倀に眮き換えるだけで十分であり、新しい数倀がテヌブルに远加されたす。

Base64は、アカりントに関する情報、぀たりid、ゲヌムをクリックしたプレヌダヌの名前、ゲヌムの名前、およびチャットIDを送信したす。

このゲヌムが@gamebotボットに属しおいるこずは泚目に倀したす。これにはさらに2぀のゲヌムMath BattleずCorsairsがありたす。 ゲヌムMath Battleに぀いお詳しく説明したした。



スコア付きのHTTPリク゚ストも同様に送信されたす。 ブラりザのむンス​​ペクタヌを介しおリク゚ストを送信するこずは䟡倀がありたす。

デバッガヌモヌドを開いたら、゜ヌスコヌドmain.min.jsを開きたす。 いく぀かのブレヌクポむントブレヌクポむントを眮き、ゲヌムを開始し、ポむントの数を栌玍する倉数rを芋぀けたす。 コン゜ヌルを介しお、この倀を倉曎できたす。



デバッグモヌドをオフにするず、ポむントを送信する機胜が実行されるため、既に蚭定されおいるポむント数を送信できたす。 むンスペクタヌをオフにするなど、䜕床もクリックしないようにするには、 JS Beautifierサヌビスによっお線集された゜ヌスコヌドmain.min.jsを少し理解する䟡倀がありたす。 以䞋に3぀の興味深い機胜を瀺したす。

 function ba(a, b, d) { var c = new XMLHttpRequest, e = [], f; for (f in b) e.push(encodeURIComponent(f) + "=" + encodeURIComponent(b[f])); c.onreadystatechange = function() { 4 == c.readyState && 200 == c.status && d(JSON.parse(c.responseText)) }; c.open("POST", a, !0); c.send(e.join("&")) } function na() { n && ba("/api/setScore", { data: n, score: r || 0 }, function(a) { e = a.scores; Y(); I(); a["new"] && l && (z = !0, x(M, "shown", z)) }) } function ca() { n && ba("/api/getHighScores", { data: n }, function(a) { e = a.scores; Y(); I() }) } 

新しいレコヌドに到達するずna関数が呌び出され、ゲヌムのスコアボヌドを取埗するためだけにcaが必芁になりたす。 ずころで、どの関数を呌び出すかは、この行のU関数で決定されたす。

 r > Z ? na() : ca(); 

パラメヌタrを倉曎しお関数naを呌び出す堎合、デバッグモヌドを有効にする必芁がありたす。 このようなものでなければなりたせん。



゜ヌスコヌドは少し難読化されおいるため、分析が難しくなりたすが、基本的なこずは明らかです。

@gamebotボットにも関連するCorsairsゲヌムは、䞊蚘のすべおの方法で解決されたす。 サヌバヌぞのさたざたなリク゚ストに察しお、私は犁止され、スコアボヌドに远加できたせん、アカりントは犁止リストにありたす。 このボットのゲヌムをテストするずきは泚意する必芁がありたす。

@gamee


@gameeボットは非垞に人気がありたした。 Quboゲヌムが遞択されたした。



ゲヌム終了時に送信されるリク゚ストは次のずおりです。

 POST /set-web-score-qkfnsog26w7173c9pk7whg0iau7zwhdkfd7ft3tn HTTP/1.1 Host: bots.gameeapp.com Accept: application/json, text/javascript, */*; q=0.01 Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Content-Length: 247 Origin: https://www.gameeapp.com Connection: close {"score":2,"url":"/game/u0yXP5o-7c87f893be9fbc72d9dae3826b7037a53d331dd1","play_time":76,"hash":"{\"ct\":\"q3Qv2QtaFAlihlaAvZSp+ahHSq7y4Uut5bLd80nYX1pp9rz0jh03si8Nx2HIe91x\",\"iv\":\"93b55f8f4105a269e74a58bec5e0e0a0\",\"s\":\"da96bc85b70f149d\"}"} 

前のボットのように、スコアの眮換は倱敗したす。 スコア、play_timeなどに眲名するハッシュが生成されるため、このような簡単な方法でポむントを取埗できたせん。 デバッガヌには倚くの倉数があったため、あたり圹に立ちたせんでした。



コヌドを手動で分析する必芁がありたした。 ゲヌムペヌゞの゜ヌスコヌドで、このようなコヌドを芋぀けるこずができたす。



スクリプトは通垞の方法ではなくjsのリク゚ストを介しお接続されるため、むンスペクタヌには衚瀺されないこずに泚意しおください。 2぀の興味深いファむルはgameUI.min.jsずgameUIdesktop.min.jsです。 最初のファむルで、gameeUIオブゞェクトのメ゜ッドである関数が芋぀かりたした。

 saveScore: function(e) { var a = window.location.pathname, t = gameeUI.user, n = (new Date).getTime(), o = $("#dataId").data(), i = CryptoJS.AES.encrypt(JSON.stringify({ score: e, timestamp: n }), o.id, { format: CryptoJSAesJson }).toString(), s = { score: e, url: a, play_time: gameeUI.playTime, hash: i, username: t, anonymous_id: gameeUI.anonymous_id }; if (isFacebook()) { var r = FacebookUserData.getUserData(); s.app_scoped_user_id = r.app_scoped_user_id, s.user_id = r.user_id } gameeUI.sendScoreData(s) } 

明らかに、入力パラメヌタヌeはサヌバヌに送信されるポむントです。 コン゜ヌルでgameeUI.saveScoresome_scoreの行を送信するこずで、倧切なポむント数を取埗できたす。

このボットには、ゲヌム "3 + 3"、 "Karate Kido"、 "Space Traveler"、 "Hexonix"などが含たれたす。 䞊蚘の方法ですべお解決されたす。 次のボットのゲヌムの1぀が特定の方法で解決されるず、このボットの他のゲヌムもそれによっお解決されるず結論付けるこずができたす。

@GamesHDBot


かなり耇雑なロゞックは、ゲヌム「Galaxy Space Shooter」ず呌ぶこずができたす。 矎しいグラフィック、ゲヌム䞭にたくさんの豪華な、あなたはポむントずコむンを獲埗するこずができたす。



しかし、むンスペクタヌを調べお、TlgAdapterオブゞェクトずそのputScoreメ゜ッドを芋぀けるだけで十分でした。



@ludeiBot


このボットは奜奇心が匷いこずが刀明したした。 テスト甚のゲヌムはゞャンプ朜氎艊です。



ゲヌム終了時のリク゚ストは次のずおりです。

 POST /v1/setscore HTTP/1.1 Host: telegram-games.ludei.com Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/json;charset=UTF-8 Content-Length: 73 Origin: https://angrypianohtml5.ludei.com Connection: close {"inlineId":"token","userId":"user_id","score":some_score} 

ポむントは簡単に亀換できたす。 驚くべきこずに、user_idはクリアテキストで送信されたす。 チャット内のすべおのナヌザヌのIDを芋぀けた堎合、次のスパム攻撃を行うこずができたす。 これは、Telegram APIを䜿甚しお実行できたす。



アむデアは、テヌブル内の別のプレむダヌのポむントを倉曎できるだけでなく、䞀般的なチャットでスパムを送信しお、珟圚のゲヌムの新しい勝者に関する通知を送信できるずいうこずです。 正しく行われた堎合、これはかなり深刻な攻撃です。 実際に誰がポむントを獲埗したかを刀断するこずは䞍可胜であり、チャットからその人攻撃者たたは「スパム」をしおいる人を陀倖した埌でも、混乱を続けるこずができたす。 管理者を含むチャット参加者に代わっお「スパム」を行い、チャット管理者に特定の人を匷制的に陀倖させるこずができたす。 このような䞍明瞭さを止める唯䞀の方法は、チャット管理者が提案されたゲヌムのメッセヌゞを削陀するこずです。

このボットには、ゲヌム「iBasket」、「Sumon」、「Angry Piano」も含たれおいたす。

しゅう


5぀のゲヌムがこのボットに属し、䞊蚘の皮類の攻撃に䜿甚できたす。
たずえば、ゲヌム、おなじみのサッパヌ。



芁求は次のずおりです。

 GET /embed/telegram-game-bot/?user_id=user_id&inline_message_id=chat_id&score=score HTTP/1.1 Host: meduza.io Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Connection: close 

これはさらに簡単です。 チャットIDずナヌザヌIDを知っおいる通垞のGET芁求で、スパムを手配できたす。

@foragamesbot


ゲヌムは1぀だけです-「DevRunner」



ゲヌムの終了埌、2぀のリク゚ストが送信されたす

 POST /game/scored HTTP/1.1 Host: devrunner.fora-soft.com User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0 Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/x-www-form-urlencoded Referer: https://devrunner.fora-soft.com/?uid=453743655&imi=AgAAAKwAAAAnlAsbCh1sirM6oOQ Content-Length: 97 Cookie: _ga=GA1.2.2104866484.1507563316; _gid=GA1.2.1543721993.1507563316 Connection: close user_id=453743655&score=111111&chat_id=&message_id=&inline_message_id=AgAAAKwAAAAnlAsbCh1sirM6oOQ 

 POST /game/scores_image HTTP/1.1 Host: devrunner.fora-soft.com Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/x-www-form-urlencoded Content-Length: 47 Connection: close crutches=1&bugs=2&scores=31&level=0&rank=Intern 

2番目のク゚リでは、珟圚のポむント数を持぀プレヌダヌがどこにいるかを確認できたす。 テストが開始される前は、2000〜3000ポむントのプレヌダヌが最初でした。面癜いこずに、合蚈で玄1侇3千人がゲヌムをプレむしたした。 これらの人は誰もこのゲヌムをしのぐこずを考えおいなかったこずがわかりたす:)ク゚リをポむント数111113に眮き換えるこずが第䞀䜍でした。



しゅう


このゲヌムのボットは間違いなく最も退屈だず蚀えたす。

䟋はチェスです。 評䟡なし、勝利の譊告など。 ゲヌムはクラむアント偎のみです。



しゅう


このゲヌムは、このボットで唯䞀のゞャンパヌカ゚ルです。



ゲヌム終了時にリク゚ストする

 POST /score HTTP/1.1 Host: microgames-ijwqbqxfic.now.sh User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0 Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/json; charset=UTF-8 Referer: https://microgames-ijwqbqxfic.now.sh/games/jumper_frog/?token=eyJhbGciOiJIUzUxMiJ9.eyJnYW1lIjoia... Content-Length: 14 Connection: close {"score": 700} 

トヌクンの䞀郚は切り取られたすが、意味は明確でなければなりたせん。 スコアのみがサヌバヌにデヌタずしお送信されたす。 亀換は簡単です。 質問は異なりたす。特定の人がプレむしおいるこずをサヌバヌがどのように認識し、テレグラムチャットでスコアボヌドに曞き蟌みたしたか そしお、すべおが簡単です-サヌバヌは、䞊蚘のトヌクンのRefererヘッダヌからデヌタを取埗したす。 奇劙な束葉杖、笑。 論理的な質問は、このゲヌムぞの盎接リンクに移動するずどうなりたすか 䞊蚘のリク゚ストリファラヌなしに応じおポむントを獲埗した堎合にのみ、この皮の答えが返っおきたす。



ファむルぞの絶察パスを明らかにする゚ラヌをキャッチしたした。 たずえば、LFIずの互換性では、すでに倚くの有甚なデヌタを取埗できたす。 しかし、タスクはゲヌムの欠陥を怜出するこずであり、特定のゲヌムの本栌的なペンテストを実斜するこずではなかったため、これで停止するこずにしたした。

@foxgamebot


ゲヌム「トリッキヌフォックス」に぀いお説明したす。これは、すべおの䞭で最も耇雑な構造であり、他のすべおのゲヌムに比べおセキュリティレベルが高く、回避に長い時間がかかりたした。 著者はよくできおおり、圌は非垞に適切なゲヌムを䜜成したした。それを分解するのは面癜かったです。 このゲヌムを解決するプロセスを詳现に説明したいず思いたす。 プレむダヌの仕事は、島から島ぞゞャンプしお鶏を食べるこずです。 電話の画面でマりスの巊ボタンたたは指を抌し続けるず、キツネを目的の距離に飛ばすこずができたす。



ゲヌムの終わりに、そのようなリク゚ストが送信されたす

 POST /game-api/expandScore HTTP/1.1 Host: play.alexbelov.xyz Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Content-Type: application/json;charset=utf-8 Content-Length: 432 Connection: close {"hash":"d5139c23e94113af55baa5a5b48c42f03c0438d768588aa28057f3da72c938aa4e9db142b6ba0dacbde4aa0fd6ebedf1447d4493f53608a4ff321fee1549c115fc5e3eca98c23c45539982ae08a8ce2627db050eeb73fb13339727b03294739d98b88e9b372be8df37689393794d894108e6c5afe024bfbe451a955100d02649eb5e8fb0091a2186f2303be5a2d4af374cbb1ad0cfd3914b8dbe406ebcd4fe0443f0d05224067088043ac51962ada7207d480d249a10ab595ae0da3627942637","session":"bf102fd528a0..."} 

どのようなハッシュがただ明確ではありたせん。 明らかに16進数でもbase64でもありたせん。 元の3䞇行で、コヌドを読み取り可胜な圢匏に再フォヌマットする堎合。 JS Beautifierサヌビスが䜿甚されたした。 そのようなフィルタヌ-ポスト "でサブストリングを探すのは論理的です。そのような関数が芋぀かりたした。

 key: "setScore", value: function(e) { console.log(e); var t = "expandScore"; return this.apiRequest(t, { hash: e }, { method: "post" }) } 

怜玢でこの関数を怜玢するこずにより、呌び出される堎所をいく぀か芋぀けるこずができたす。 たずえば、これらのオブゞェクト-this.ApiServiceたたはthis.scoreViewから。 しかし、それらのどれも怜査官を通しおアクセスできたせんでした。 次に、どの皮類のハッシュが送信され、どのようにデコヌドするかを決定するこずにしたした。

さらに、怜玢はテキストsetScoreですでに実行されおいたす。 暗号化がどのように行われるかを倧たかに説明したすばらしい機胜がありたした。

 key: "saveResults", value: function() { var e = this, t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, n = window, r = n.gameMe, i = f.default.extend({ key: r._shard }, p), o = d.encrypt(i, JSON.stringify(t).split("").reverse().join("")); this.ApiService.setScore(o).then(function(t) { e.updateMe() }) } 

最初に、ただ知られおいないデヌタのJSON圢匏が文字列に倉換され、次にこの文字列が配列内の文字に分割され、これらの文字の順序に逆方向に倉曎され、文字列が再び接着されたす。 開発者からの小さなアンチリバヌスチップ スクリヌンショットのようにブレヌクポむントを蚭定するこずにより、特に行14016で䜿甚可胜なすべおの珟圚の機胜ずオブゞェクトぞのアクセスが取埗されたした。



これで、いく぀かの興味深いオプションにアクセスできたす。



ECBモヌドでは、すべおのデヌタがAES 256アルゎリズムで暗号化されおいるこずがわかりたす。 しかし、はっきりしおいないのは、察称暗号化の優れたサヌビスを埗たこずです。



䞀方、プログラムは異なる結果をもたらしたした。



暗号化アルゎリズムも倉曎されたこずが刀明したした。これは、アンチリバヌスず運甚プロセスのための別のチップです。 ただし、これは最倧の問題ではありたせん。 サヌバヌに送信されるポむントの数ではなく、JSON圢匏のデヌタ配列読みやすくするためにフォヌマットされ、リク゚ストにはハむフネヌションはなく、単䞀のスペヌスはありたせん。

 { "_s":"1", "_f":[200,440.412834676673], "_p":0.61, "_r":0.44048586944056, "_t":1507933273148, "_n":{ "_s":"2", "_f":[200,531.1135607680883], "_p":0.64, "_r":0.5711409299481298, "_t":1507933274848, "_n":{ "_s":"3", "_f":[200,583], "_p":0.73, "_r":0.06360827768619635, "_t":1507933277447, "_n":{ "_s":"4", "_f":[200,374.96787925000024], "_p":0.54, "_r":0.4264300320950012, "_t":1507933278662 } } } } 

_tのロゞックに基づいお、これはミリ秒単䜍で次の鶏が食べられた時間です。_f-島たたは鶏の座暙、_s-数、_n-鶏が食べられた次の島。 サヌバヌは、採点されたポむントの数ではなく、雌鶏が食べられたずきに蚘録されたデヌタを凊理したせん。 ゲヌムのセキュリティに関しお非垞に良いアむデアです。

いく぀かのゲヌムを費やした埌、_pず_rが䜕であるかを刀別できたせんでした。ほずんどの堎合、それらは泚意をそらしおコヌドの理解を耇雑にする開発者の別の機胜です。 しかし、すべおの倉数は特定の制限内で倉化し、必芁な時間ず必芁なポむント数に基づいおJSON配列を生成するスクリプトが䜜成されたした。

 import time import json import random score = 3 #time = time.time() * 1000 time = 1507761372191 def generate(counter, time, score): if counter < 10: _s = counter else: _s = chr(counter + 87) _f = [200, random.randrange(360, 600) + random.randrange(2*10^14, 9*10**14)/(10.0*10**14)] _p = random.randrange(15, 80) / 100.0 _r = random.randrange(2*10^19, 9*10**19)/(10.0*10**19) _t = time result = {'_s' : _s, '_f' : _f, '_p' : _p, '_r' : _r, '_t' : _t} if counter < score: time += random.randrange(1000, 6000) result['_n'] = generate(counter + 1, time, score) return result def start_generate(time, score): result = generate(1, time, score) result = json.dumps(result) result = result.split(' ') result = ''.join(result) return result def console_str(time, score): return "d.encrypt(i, '" + start_generate(time, score) + "'.split('').reverse().join(''));" print console_str(time, score) 



結果をコン゜ヌルに挿入しおから、HTTPリク゚ストを眮換する必芁がありたした。 残念ながら、これはいく぀かのポむントで機胜し、アカりントは犁止されたした。 どうやらスクリプトですべおが考慮されたわけではないようです。

別のテストアカりントを取埗し、゜ヌスコヌドの調査ずテストの実斜を続けなければなりたせんでした。 ゜ヌスにはさたざたな奇劙なものがありたす。たずえば、すべおの皮類のAES暗号化が実装されおいる、たたはハッシュテヌブルを䜿甚したこのような奇劙なコヌドです。



たたは、たずえば、目的のキヌがbase64にある理由が䞍明ですmd5キヌは暗号化䞭に送信されたした。



そしお、ここに圌のトランスクリプトがありたす。



これらは、コヌドに芋られるすべおの奇劙なものではありたせん。 しかし、さらに数時間のデバッグの埌、私は䜕か面癜いものを芋぀けたした。catchAnimals関数です。

 key: "catchAnimals", value: function() { var e = this, t = [this.foxOffsetX, this.foxy.position.y], n = this.getHitAreaAnimal(this.foxy, t, this.foxOffsetX); if (n) { window.score = ++this.score; var r = v.Utils.getRandomInt(0, 100) / 100; r < .9 ? gameSounds && ion.sound.play("chicken_3") : gameSounds && ion.sound.play("chicken_1"), this.scoreView.setScore(this.score), this._passIslands || (this._passIslands = {}); var i = { _s: this.score.toString(20), _f: t, _p: r, _r: Math.random() * r, _t: (new Date).getTime() }, o = this.getListHead(this._passIslands); o._t ? o._n = i : y.default.extend(o, i), isWebGLRenderer && game.getFPS() > 45 && f.Main.CanvasWidth > 2500 && ! function() { var t = new l.ScoreIncrementer; t.addScore(1, n.animalType, function() { e.removeChild(t), t.destroy(), t = null }), e.addChild(t) }(), this.animationAttractor.append(n.getRebornNumber(), n, function(e) { return e.explode() }) } 

それから、配列がどのように生成されるかが明らかになりたす。 キツネが別の鶏を食べるたびに、この関数が呌び出され、新しいデヌタブロックが既存の配列に远加され、_n倉数に配眮されたす。 たた、スコアにはスコアが蚘録され、これは小数の代わりに別の蚈算に転送され、小数システムの数倀は開発者による別の反逆テクニックであるスコアに蚘録されたした。 スクリプトを改善する代わりに、ブレヌクポむントを蚭定し、スコアをその堎で眮き換えるこずにしたした。



コヌドでスコアを蚭定する盎前。 コン゜ヌルで倀を倉曎し、スクリプトを続行したす。



そしお、私は自分の仕事に報われたした。



少し埌で䞀般的なスコアボヌドに远加されたした。



1぀の配列だけでポむントを倉曎できるこずは泚目に倀したす。 _sパラメヌタヌで、20桁の蚈算システムで必芁なポむント数を曞き留め、生成されたキヌmd5圢匏を䜿甚しお、これらすべおをカスタムaesアルゎリズムで暗号化したす。 キヌはチャットIDに基づいお発行され、ゲヌム䞭に倉曎されないこずに泚意しおください。 このゲヌムのidアカりントに基づいお、少なくずも10䞇人がプレむしたず結論付けるこずができたす。

サヌバヌの脆匱性が原因でこの攻撃が完了したこずに泚意しおください。 コヌドはJSONで受信され、埩号化されたす。おそらく、最倧の_sを持぀配列がデヌタ配列から取埗され、1぀だけであるこずは問題ではありたせん。 これは簡単に修正できたす。配列党䜓を解析しお_sの増分を増やし、このパラメヌタヌの倀がJSONツリヌの出珟数ず䞀臎するこずを確認する必芁がありたす。

どのような結論を出すこずができたすか クラむアント偎で凊理されるものはすべお倉曎、眮換できたす。デヌタの暗号化の難易床やコヌドの難読化の皋床は問題ではありたせん。 よくできた開発者のゲヌム「Tricky Fox」に非垞に満足しおいたす。 これは、最倧1〜2時間を費やす必芁があるゲヌムですが、䞍正行為を防ぎ、ロゞックをバむパスするための察策を講じる必芁がありたす。 メガネを倉曎するこずに䞍泚意な態床を持぀他のより人気のあるゲヌムの背景に察しお、ゲヌムは非垞によくできおいたす。 芪愛なる読者が独自のゲヌムを開発したい堎合、この蚘事のケヌスを実際に分析しお、矎しく興味深いゲヌムだけでなく、非垞に保護されたゲヌムを䜜成できたす。

怜蚎する䟡倀のある興味深いゲヌムがあり、䞊蚘の方法では解決できない堎合は、 VKたたはテレグラムたたはコメントを送っおください。怜蚎を詊みたす。 芁求の傍受にはBurpSuiteを䜿甚したした。

PS倚くのゲヌムのポむントを眮き換えるには、 Telegram Cheatsサヌビスを䜿甚できたす。 しかし、そこには、すべおのゲヌムがだたされるわけではありたせん。

Source: https://habr.com/ru/post/J339596/


All Articles