VKontakteのネットワークUnity3Dゲームのセキュリティ分析





こんにちは この投稿が悪い結果をもたらさず、すべてがうまくいき、世界が光で満たされることを願っています! VKのソーシャルユニティ3Dゲームのすべてがそれほど悪いのはなぜですか?



週末は無料でしたが、アプリケーションセキュリティの弱点を特定するために 、1つの興味深いことにそれらを捧げました。 なぜなら 主に団結して仕事をしてから、このエンジンで作成したゲームを撮りました。 私はプロではなく、そのような分析の経験がなかったことにすぐに注意します。 ユーザーがどのように認証されるかについての知識があり、(VKのドキュメントにある)彼のidの有効性を検証しました+ c#(それは一切ありません)。 4つのアプリケーションが手に落ち、4つすべてに穴があり、最後の1つでは「 サーバーメソッド 」にアクセスできるようになりました。 これはどのようにして生じたのですか?







1.ツール


ウェブの広がりをさまよいながら、 Unity 3D Obfuscatorプログラムに出会いました。このプログラムには次の機能があります。

-逆コンパイルに対する保護。

-オブジェクト名(クラス、関数、プロパティなど)の難読化(意味のない文字セットへの名前変更);

-フローグラフの難読化。

-Unity3Dプロジェクトの開梱。

-イベントおよびプロパティのメタデータの削除。



.unity3d(ウェブビルド)ファイルを解凍するだけで、後で役立つDLLを取得できます。 したがって、最初にダウンロードしてインストールしたのはUnity 3D Obfuscatorでした。



Naryl ILSpy (無料)の分解用。 C#<-> ILコードを見る機能は非常に便利でしたが、それについては後で詳しく説明します...



Unity3d + VS2012により、テスト用の小さなアプリケーションをすばやく作成できました。



2.プロセス


まず、特定のアプリケーションのviewer_idページとauth_keyページをHTMLソースから取得しました。 ちなみに後者は、ユーザーとアプリケーションのペアごとに一意です。 ここで、iframeのURLを見つけることができます。ここで、.unity3dファイルへのパスを見つけることができます。 NotePad ++にコピー/貼り付け。





(htmlソース)


それから、あるアプリケーションで拡張子が.pdfに置き換わっていることに気付きました。 なぜ私には謎でしたが、DownloadMasterでダウンロードして元の形式に名前を変更するのは簡単でした(pdfから得られる利益が何かを知っているなら、コメント欄に書いてください、とても面白いです)。



さらに、Unity 3Dを使用して、Obfuscatorはビルドをアンパックし、出力でdllを受け取りました。 Assembly-CSharp.dllが必要です! 0.5リットルのコーヒーを入れて、彼はオナニーを練習し続けました...





(Unity 3D難読化ツール)




ここでのタスクは、コード内のデータ転送ポイントを見つけることでした。 署名がある場合は、コンテンツ署名メカニズム。



ILSpyはアセンブリを非常にすばやく飲み込み、クラスのキャンバスを作成しました。 彼の創意工夫を結びつけて、彼は検索でネットワークを獲得しましたが、検索はPhoton Cloudに関連するクラスのみにつながりました。 それではありません、先に進みます。 数分後、誰かのid-auth_keyペア(判明したように、アプリケーション管理者)を見つけました。 しばらくしてから-要求を送信するサーバーのアドレス。



「Used By」というリンクを使用して、アプリケーションの場所を見つけました-ゲームサーバーのAPIをプルするメソッド。



最初のアプリケーションですべてが簡単な場合(データを取得して置換する)、他の人ともっといじる必要がありました。 リクエストを送信しようとする試みは、サーバーからの「Hello Mazafacka」応答で終了しました。



何かが欠落しています... Md5Sumというメソッドを見て、十分なハッシュがないことを理解しています! しかし、それを構築する方法は? コードを見てみましょう:



private IEnumerator UpdateScor(string vid, ...)

{

df.c__Iterator20 c__Iterator = new df.c__Iterator20();

c__Iterator.viewer_id = vid;

...

return c__Iterator;

}





. ...



- yield return , , , . df.c__Iterator20 ... . IL . , . , (string.concat) (MD5(string.concat)). !



, , , - ( , 0).



:

0. - ~6 .

1. 3 - , ..

2. App_Secret! , ...



? ( )

1. - . . .

2. . : ( ), .

3. , -.





. . , -(>1 000 000 ), , , .



, . - ? , . , ArtMoney ?( ) -?( 5)



, , ?




private IEnumerator UpdateScor(string vid, ...)

{

df.c__Iterator20 c__Iterator = new df.c__Iterator20();

c__Iterator.viewer_id = vid;

...

return c__Iterator;

}





. ...



- yield return , , , . df.c__Iterator20 ... . IL . , . , (string.concat) (MD5(string.concat)). !



, , , - ( , 0).



:

0. - ~6 .

1. 3 - , ..

2. App_Secret! , ...



? ( )

1. - . . .

2. . : ( ), .

3. , -.





. . , -(>1 000 000 ), , , .



, . - ? , . , ArtMoney ?( ) -?( 5)



, , ?




private IEnumerator UpdateScor(string vid, ...)

{

df.c__Iterator20 c__Iterator = new df.c__Iterator20();

c__Iterator.viewer_id = vid;

...

return c__Iterator;

}





. ...



- yield return , , , . df.c__Iterator20 ... . IL . , . , (string.concat) (MD5(string.concat)). !



, , , - ( , 0).



:

0. - ~6 .

1. 3 - , ..

2. App_Secret! , ...



? ( )

1. - . . .

2. . : ( ), .

3. , -.





. . , -(>1 000 000 ), , , .



, . - ? , . , ArtMoney ?( ) -?( 5)



, , ?







All Articles