Googleのエイプリルフールのリバースエンジニアリング





4月1日に、Googleはインタラクティブなゲーム「Snake」をAndroidおよびiOS向けのGoogleマップアプリケーションに追加したことに気づいたのではないでしょうか。



チェックポイントの専門家は通常、最新のサイバー脅威の調査に従事していますが、このゲームには非常に興味がありましたが、損失のために彼らは非常に怒っていました...それで、なぜそれをクラックしないのか論理的な考えがありました!



したがって、最もいたずら好きな従業員は、リモートデバッグを使用したアプリケーションの逆開発について考え始めました。 一般的に、彼らはそれを行い、すぐに負けないというタスクを成功裏に完了しました-そしてゲーム自体をプレイするシンプルなAIを追加しました。



















このノートでは、ハックについて詳しく説明します。



まず、Genymotionを介して仮想デバイスでアプリケーションを開き、右上隅のメニューにある「Snake」を起動しました。



ゲームがWebViewに表示されているように見えるため、Chrome開発者ツールでリモートデバッグを開始しました。







次に、サイトにアクセスし、ソースを含むタブでv18.jsファイルを見つけました。このファイルにはいくつかの興味深い機能が含まれていました。



まず、 fa()関数は20×20フィールドを開始します。



this.height = this.width = 20;
      
      





私たちの主な目標は、ヘビが壁や自分自身に衝突したときを判断する機能を見つけて変更し、失う可能性を無効にすることです。 高さの変数は競技場の寸法を表すため、ソースコード内で高さを探し、 F(a、b)関数を見つけました。











F(a、b)は、ヘビの体の座標がフィールド内にあるかどうかをチェックしているようです。 1つの選択肢は、関数内の条件を完全に削除して、常に真実を返すようにすることです。これにより、死ぬことなく壁を通過できる「神の体制」に移行します。



これを行うには、リモートコンソールの[ 検査 ]ボタンを押して、 F(a、b)関数を次のように変更しました。











これで壁を通過できます。





1.神モード



これはすべて非常に良いことですが、ポイントを獲得するために自分で人を選んでプレイする必要があります。 次のハックはこの問題を解決します。



呼び出しスタックには、 wa(a)への呼び出しが多数あります。 この関数を調べると、再帰関数であり、アニメーションフレームのクエリを実行することがわかります。 wa(a)は関数xa(a、b)およびya( a)を呼び出し、それぞれゲームのピース(電車、人)およびフィールドを表示します。



関数xa(a、b)を考えてみましょう:











「a」と「b」の2つの引数を取ります。 1つはグローバル変数Qの一部です。この変数には、プレイフィールドである配列(図2)、電車(M)、人とオブジェクト(K)を含む、ゲームに関する興味深い情報が含まれています。 また、この関数はスコアを計算してciに保存します。これはQbと同等​​です





2.競技場の配列



この配列は、次のフィールドに対応しています。









3.競技場



xa(a)は、図の関数sa (a)も指します。 4、新しい人が作成されるたびにランダムな座標を生成します。 関数を複数回呼び出すと、必要な数の人を作成できます(図5)。









4.関数sa(a)を呼び出します



ここのように:









5.マップ上の任意の数の人を作成する関数呼び出し



sa(a)を複数回呼び出してその人を連れて行っても、スコアは変わりませんのでご注意ください。 乗客を選択するとき、図の関数ka(a、b) 6.このように、コールごとに10ポイントを追加し、画面上のスコアを更新するように変更する必要があります。









6.更新された機能



列車の各部分の座標はQbobで示されます。最初の要素は列車の最初のトレーラーです。









7.ワゴンの配列



これは、単純なAIを作成するために必要になります。 彼の論理から始めましょう:









8. AIロジック



ヘビは状態機械(状態機械)です:



  1. X = 19で、Y = 19になるまで下降します。
  2. X = 19およびY = 19で、 にX = 0に進みます。
  3. ジグザグの状態マシンに渡します。

    1. 1セル上で、X = 18の右側
    2. 1つ上のセルで、X = 0のままにします。
    3. 手順Aに戻ります。
  4. Y = 0で、X = 19に進みます。
  5. 手順1に戻ります。


完全なコードはGitHubで公開されています



ビデオ:






All Articles