こんにちは この投稿が悪い結果をもたらさず、すべてがうまくいき、世界が光で満たされることを願っています! 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)
, , ?
{
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. , -.
. .
, . - ? , . , 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)
, , ?