誰もがよく知っているように、フラッシュアプリケーションコードはクライアント側で実行されるため、不正行為から保護することは非常に困難な作業です。 実際、唯一の正しい決定は、すべてのゲームメカニクスをサーバー側に転送することであり、フラッシュアプリケーションはAPIのクライアントとして機能します。
Aeroflotがこのタスクにどのように対処するかを見てみましょう。
まず、開発者のコンソールをGoogle Chromeで開いてゲームを起動します。 そして...どうやら、すべてが退屈になります。 判明したように、サーバーへのリクエストはゲームの最後に一度だけ送信されます。
要求内のデータは疑いなくbase64に似ていますが、このエンコードからの変換はバイナリデータのセットのみになります。 これは、リクエストがクライアントの深部のどこかで暗号化されることを意味します。 残念ながら、または幸いなことに、swfファイルは逆コンパイルに対して耐性がありませんでした。
ActionScriptコードを表示してから10秒後に、次のフラグメントが検出されます。
public static function prepareForSend(param1:Object, param2:String) : String { return Xor64.encode(JSON.stringify(param1), "aef-game" + param2); }
はい、それは通常のXOR暗号化です。つまり、このような暗号のキーを数秒で逆コンパイルして復元することはできませんでした。 それでも最後まで理解した場合、ここでのキーは2つの部分で構成されます。最初の部分は関数にハードコードされ、2番目の部分はSWFの初期化パラメーターから取得されます。
// main.as this._token = stage.loaderInfo.parameters["token"]; // http://aeroflotbonus15.ru/media/js/aef.js start : function( token, authState, connector, autoStart ){ . . . this._token = token; . . . }, . . . AEF.flashController.buildFlash({ token: this._token, connector: this._connector }, this._lang ); . . . // http://aeroflotbonus15.ru/ AEF.start('c958c089505d321994578a12fabbe73d', true, "http://aeroflotbonus15.ru/api/", false, 'ru');
つまり、完全なキー-aef-gamec958c089505d321994578a12fabbe73dほぼすべてがページのコード内にあり、単純な視界にあります。
ちなみに、明らかに、開発者は怠encryptionすぎて暗号化アルゴリズムを独立して実装することができず 、 既製のソリューションを利用していました 。
音声キーによる復号化結果:
{ "result":{ "cities":11, "miles":749.9018522566122, "time":58356, "bonuses":2, "wins":6 }, "version":0.98, "bytes":7205605, "system":{ "cpuArchitecture":"x86", "screenDPI":72, "playerType":"PlugIn", "isDebugger":false, "version":"MAC 15,0,0,152", "manufacturer":"Google Pepper" }, "url":"http://aeroflotbonus15.ru/media/swf/game.swf?68" }
読みやすくするためにフォーマットが追加されました。
その結果、誰でも好きな評価を送信できます。 主催者が正直な参加者を詐欺師からどのように分離するつもりなのかわかりませんが、個人的にはこの行動に参加したいとは思いません。
PS
アエロフロートボーナスカードは持っていないので、結果は総合評価に影響しません。