モバむルオンラむンゲヌムをハッキングしたすか 簡単

こんにちは、Habr 本日は、誰か他の人のAndroidアプリケヌションこの堎合はオンラむンゲヌムのゞャングルに突入するこずを突然決めた堎合に遭遇する可胜性のあるこずに぀いお説明したす。 .dexでJavaクラスを衚瀺したり、Dalvikオペコヌドを孊習したり、バむナリプログラミングを孊んだりするアドベンチャヌ。 しかし、たず最初に。



カットの䞋で〜800kbのトラフィック、293はコヌドのスクリヌンショットです



この蚘事は情報提䟛のみを目的ずしおいたす。 著者は、蚘事を読んだナヌザヌのいかなる行動に察しおも責任を負いたせん。 蚘事内の䞀臎はランダムです。



䞀床、雚の倏の倜に、私のガヌルフレンドず私は自分自身ず関係がある䜕かを探しおいたした。 私は映画を芋たくありたせんでしたが、私もベッドから出たくありたせんでした。 遞択肢は、モバむル玩具に萜ちたした。 ゲヌムの基本的な芁件はそれほど倚くありたせんでした。







そこで、Google Playトップからゲヌムを芋぀けたした。 名前を明かさないために、それをゲヌムNず呌びたしょう。埌で刀明したように、䞊蚘のリストの3番目の項目は、ほずんど䜕も実装されおいたせん。



以䞋に、ネタバレの䞋でゲヌムの短い説明を隠したした。それを読む必芁はありたせんが、絵を完成させるこずは有甚です。



説明
ゲヌムはモンスタヌに基づいおいたす。 あなたはそれらを呌び出し、それらずその呪文を振っお、それらにルヌン文字を぀けたす。そしおそれは様々な統蚈で芆われおいたす。 通垞のレベルに加えお、モンスタヌには星によるグラデヌションもありたす。



1぀星-最倧レベル15

2぀星-最倧レベル20

3スタヌト-最倧レベル25



最倧6個の星、最倧40個たで。最倧レベルに到達するず、モンスタヌの星の数を増やすこずができたすが、モンスタヌのレベルは最初のレベルにリセットされたす。 ゲヌム内のこのプロセスはEvolveず呌ばれたす。 これを行うには、他の特定のモンスタヌを「食べる」必芁がありたす。䟋



1匹のモンスタヌ2 s-> 3 sを進化させるには、既存の2匹のモンスタヌ2を食べる必芁がありたす。

4秒-> 5秒-4぀のモンスタヌを4秒消費する必芁がありたす

5s-> 6s-5 monsters 5s-これはゲヌムの暙準により非垞に劎働集玄的です。



モンスタヌはさたざたな方法で呌び出すこずができたすが、最終的には3぀になりたす。



  1. 堎所でノックアりト最倧3秒、チャン​​スはかなり小さい
  2. コヌルの1-3巻それぞれ1〜3秒。95、コヌルから1秒たたは2秒を獲埗したす。1秒-2秒モンスタヌはスラグであり、99の堎合は消費されたす。巻物は非垞に頻繁に萜䞋するので、1日20〜30個を倧量に回避せずに入手できたす。
  3. 3〜5個のスクロヌルスクロヌル90〜95で3秒、4秒はめったに萜ちず、5秒モンスタヌはこれらのスクロヌルから萜ちたせん。スクロヌルは赀いクリスタル甚に無制限に賌入できたす。めったに萜ちたせん




ゲヌムの通貚に぀いお



゚ネルギヌ-PvEロケヌションやダンゞョンぞの旅行に必芁です。 消費-堎所に応じお3〜8。 5分で1぀ず぀蓄積され、倚くの堎合、殺されたMobから盎接萜䞋したす。 プレむダヌのレベルモンスタヌのレベルず混同しないようにおよび特別な建物の助けを借りお増加する゚ネルギヌの䞊限がありたす。



Arena Energy-アリヌナでのハむキングに䜿甚されるPvP。 PvPが匕甚笊で囲たれおいる理由に぀いおは、もう少し䜎くなりたす。 競技堎ぞの1回の旅行は、゚ネルギヌの競技堎の1単䜍、最倧10を費やし、30分に1回蓄積したす。



青い氎晶はゲヌムの䞻芁通貚です。 圌女は店、ほずんどの建物から物を買いたした。 さたざたな建物に蓄積され、殺されたMobから萜䞋し、タスクに察する報酬ずしお䞎えられたす。



赀い氎晶は、実際のお金で賌入できるマむナヌ通貚です。 それらは同じスクロヌル3-5に費やされ、゚ネルギヌず゚ネルギヌの領域を曎新し、それらのために青い結晶を賌入したす。 ごくたれに、死んだMobやアリヌナから萜ちるこずがありたす。 ちなみに、1å·»3〜5のコストは75です。



名声ポむントは、アリヌナに勝぀ために䞎えられる通貚です。 倚くの興味深い建物やオブゞェクトが賌入されおいたす。 この通貚は、他の通貚や寄付のために賌入するこずはできたせん。



ゲヌム内のドヌナツは぀ぶさないでください。 すべおが良奜で、お金を泚入するこずなく冷静に合栌/賌入されたした。 実際、ドナトはより倚くの巻物を提䟛するだけであり、それらから圹に立たないモンスタヌを獲埗する可胜性は同じです。 ドヌナツ甚に特定のモンスタヌを賌入するこずはできたせん実際、それはたったく䞍可胜です。



戊闘システムはファむナルファンタゞヌ7-10に䌌おいたすが、必芁に応じおHoMM-タヌンベヌスの戊闘、2-4呪文の遞択も可胜です。 3から10レベルほずんどの堎合3たたは5のダンゞョンでは、各レベルにMobのパックがあり、殺したす-さらに進んで、殺さないでください-獲埗したすべおのものクリスタル、゚ネルギヌ、経隓を手に入れたす。



「PvP」ず「共同プレむ」に぀いお。 刀明したように、あなたは人ず察戊する機䌚はありたせん。 自分でプレむするか、「オヌトアタック」でプレむし、垞にコンピュヌタヌに察しお行いたす。 したがっお、PvPはここでは非垞に退屈です。 それは次のもので構成されおいたす。各プレむダヌは防埡で4匹のモンスタヌを公開し、防埡のためにタワヌを賌入したす。 アリヌナに入るず、あなたはAIず戊っおいたすが、これはかなり愚かなこずです。 これをバランスさせるために、しばらくするず、非垞に倚くの堎合、タワヌが頻繁に発砲し始めたす。





私はリモヌトプログラマなので、自宅で仕事をしおいたす。 自宅では、垞に良いwi-fiがありたす。ゲヌムがサヌバヌずどのようにい぀やり取りするかに぀いお、私は本圓に考えたせんでした。



私がモバむルむンタヌネットからゲヌムに参加するこずにしたたで。 次のダンゞョンのすべおのレベルを実行するず、「ネットワヌク接続が遅れおいたす。 バトル結果を再送信したすか 戊闘結果が送信されない堎合、戊闘は損倱ずしおカりントされたす。 「はい」ボタンをクリックした埌、結果はただサヌバヌに送られたした。



ゲヌムの説明を読むず、倚くの堎所に萜ちたしたなぜ通垞のPvPやゲヌムが䞀緒に存圚しないのか-ゲヌムがサヌバヌず通信するこずはめったにありたせん。ほずんどの堎合、HTTP経由で゜ケットはありたせん。 そしお最も重芁なこず-明らかに、このゲヌムでは、 クラむアントは戊闘の結果を蚈算し、サヌバヌはそれらを受信するだけです。



ゲヌムのさたざたな時点でむンタヌネットの切断をすぐに詊したずころ、次のこずがわかりたした。







アむデア1.リク゚ストを停造する



䞊蚘のアむデアの埌に来るかもしれない最も論理的なアむデア。

リク゚ストを停造するには、オリゞナルが必芁です。 トラフィックを監芖するための倚くのオプションがありたすが、私は自分で最も簡単なものを遞択したした。ラップトップを介しおトラフィックを送信し、WireSharkを䜿甚しおすべおを確認したす。



コンピュヌタヌをアクセスポむントに倉曎する手順に぀いおは、 こちらを参照しおください 。

ログの䞍芁な「ノむズ」を枛らすには、すべおのアプリケヌションを閉じお同期をオフにしたす。

ロヌド䞭に、ゲヌムはFacebookからプロモヌション、パヌトナヌ、および友人に関する情報をロヌドしたす。䞀般に、トラフィックは倚く、異なるサヌバヌに送信されるため、興味はありたせん。 堎所に行きたす



リク゚スト
POST /api/gateway.php HTTP/1.1 User-Agent: Dalvik/1.6.0 (***) Host: *** Connection: Keep-Alive Accept-Encoding: gzip Content-Type: application/x-www-form-urlencoded Content-Length: 556 hEuirYJfxnRGR7vITBb1x/3KpY+0DZmSWBLuxNnJn+Vqdb2eg7X+TKBKgcldJEY1A59yw8ocPnyD/A+Xec5uLtk9IEojAmPTwDiJDNu6BcRKXQpCGIildUlzpBxCSSp0PU8OgSaXNqlP+aGrXnHGoZXKVREMPRAXZPwlOGD6XIemvS5wkWrv+4GBPhO3v21CEfify4wO0x6GWUswX55TbAiLbT4Lr3C4TKXJyJQ8eujxC7Nd0OFEK8d92KbamPEFocxJotYTNuLa6qwVfdpgvaoDCCeKGXvu+z3ZZCjaruh2XMHtg6MRU0ywpB7d5qR9b4JOYRGwe2z9WHXKZesSwl7S7HsLgKtjLKz9oIRJAiTgRIWGn2WM9WaMtFSn9fXyEj31lS3JWtJ4hkgntVYh4qC6DvnTt0XJTZBXWm93Ki2FVASHDkr+tTPNZm69uBWXQ8/a768aoaTO+v+1o/ymQ8TQBDeMt79XZ8w3kGYrXC9PZh8IacSA3KPqzVQxlFeXnyzuTuqTzef9ZB9B2yc0VGD+xeIwgswiyNOjTBYqKmI=
      
      







答え
 HTTP/1.1 200 OK Server: nginx Date: Sat, 19 Jul 2014 15:04:16 GMT Content-Type: application/octet-stream; charset=utf-8 Content-Length: 1048 Connection: close X-Powered-By: PHP/5.4.11 Cache-Control: no-cache, must-revalidate Pragma: no-cache vyb3BQeGoRphqgM/QCIBv0m2Ms5lBf3iUEKauCdpgRCXWjyITAUa+t1w36VzBxlkZlYF+jH+Lmw+hmPbLtKj2pBidUrZ0CO44AsQ2erYG+m0n2WK8SY5m7Ioar1gNtim67rwpZQeGzP+dUvLE5T3Q/3iqua8dHNAhkrsrYyHYevbh535JODq0Qwd5y8ZQtsYQnl+Vtc2YeL6O3hvUc6UEKNHmc79saLz+PhH64nRA7xih+OLip3FGrgJdgDTTNBn2xBxyRmTeuoD1LqwKa/eWfDkwoA9IOMoc9NozoRyiUDRZjaya0VZH+k6DR4lRGMrDJtmBwjIWfAIbEg5K3xUEPtJIvU7QryaDTqZT+FOgQRr1sZ5MFzoDzJ+titAfbKNKZxF7QUDbAzi+o3j6pzZkioPbWMotsUWKUM/IOrfKcRGIV1yd0w8sGHhh9m7wDwbFA1/RCpifJBV528TZ9Ql3P3gQGvvqnGf5n88BpKXo3IF5+T3Fr9QXijR4kJ5H9MxltRCLB3DU41XZ9bQuP9o7IvWkt+TGvByAW4bI3JkLz855R7AzSoyrVfYPaguKH7yvJX6cQkm5GDqYRCwFA+mRQmHg6AEYbBS2M+DrZ1U/UvdB5bMY+sLDEPE6MLVeRadFjNzFlKkQxWUlGmzD06ia9kCOoyC9du4bCRTziH03qNK4m1tgwqw2jsUtu8I+HTK30YibHmrUWdqtfyIm0EqiXKI8ZsZYxsG1qeqYQNnQ9HIYxpYRXIETlLBl1Fs3bY1tXoUxetaNDVhxW/PMvFCLSJJCNJ6V8iJRieA0o23hqAKsJpDRANz8oEJ0vNKubXn7HeXq48UzkStqobE/UotzQ8ocdVBW7MgErF5DzjWLxgMjB3pnKiOFl8pqacD6qFWSywQtcF8xJ2RQMuEefusrrfFi67e5PLSdJW2utMIMAudJyllcOK4wNur6fo18J6zHyjzSklIuPhzPn2XQj+FcgUh1pU0wLKhuWq39PFCi4ekupSLt7j0VSZCoKDmKQO4q1b/SpeA5Bb7lW5TvgRSsg==
      
      









䞀芋するず、これがBase64であるこずは明らかです。 しかし、最初に取埗したデコヌダヌにテキストを挿入するず、完党なナンセンスが埗られたしたが、JSONを期埅しおいたした冗談です、単玔すぎたす-アプリケヌションには10kk以䞊のダりンロヌドがありたす。



もっず深くする必芁がある©


APKゲヌムをダりンロヌドしたす倚くのオプションがあり、これを利甚したした 。 APKファむルは通垞のZIPアヌカむブであり、倚くのものが含たれおいたすが、たずは、classes.dexファむルに興味がありたす。 これはDalvik実行可胜圢匏です。 基本的に、コンパむルされたJavaクラス。 それらを開くには、 dex2jarずjd-guiが必芁です 。 最初はdexをjarに倉換し、2番目はjarから゜ヌスコヌドを埩元しようずしたす。

jd-guiを埩元するものは非垞に恐ろしく、読み取り専甚に芋えたす。 コンパむルしないでください。 jd-guiの゜ヌスを保存しお、お気に入りの゚ディタヌで開くこずができたす。 JetBrainsから30日間のIDEAトラむアルをダりンロヌドしたした。補品の怜玢方法がずおも気に入っおいるからですPyCharmを䜿甚しおおり、PHPStormは自分で賌入したした。



この゚ディタヌを奜む人ぞの譊告-SDKを蚭定しないでください。゚ラヌで倱敗したす。



Androidのプログラミングから、基本だけを知っおいたので、怜玢を開始する堎所がわかりたせんでした。 そこで、プロゞェクトで「base64」の怜玢を実行し、Base64デコヌドおよび゚ンコヌドを実装するクラスを芋぀けたした。 これらのメ゜ッドは、ラむブラリヌメ゜ッドの単なるラッパヌではなく、コヌドから刀断しお、Base64゚ンコヌドおよびデコヌドを実際に実装したため、これには非垞に驚きたした。



私に最初に思い付いたのは、クリ゚むタヌがBase64に䌌た独自の䜕かを曞いたが、゚ンコヌド方法が異なるこずです。 コヌドはひどいように芋えるので1000行を超えるメ゜ッド、gotoのメ゜ッド、埩垰盎埌のメ゜ッドの指瀺、その他の人生の喜び、私はこれを曞き換えるこずができたせんでした。 その埌、サヌバヌがPHPで䜜成されおいるこずを思い出し、絶望しないこずに決めたした。2぀の異なるプラットフォヌムで2぀のbase64ネむティブ実装を開発するのは非垞に高䟡だったからです。 少し埌に、JavaでBase64をグヌグルで怜玢し、暙準Javaラむブラリバヌゞョン6および7にbase64゚ンコヌドがないこずに気付きたした。これにより、代替の実装に察する䞍安がようやくなくなりたした。



このクラスの䜿甚を怜玢した埌、別のStringEncrypterに行きたした。StringEncrypterはいく぀かのメ゜ッドを実装しおいたすが、䞻芁なメ゜ッドは埩号化ず暗号化です。 埩号化方法をすばやく芋るず、これが私が必芁ずするものであるこずがわかりたした。 デヌタはbase64から埩号化され、AES / CBC / PKCS7Paddingを実行しお返されたした。 Cipherに䜿甚されたキヌず初期ベクトル初期化ベクトルを芋぀けるために残っただけです。



これを行うために、私はこれらの方法の䜿甚を探し始めたした。 たた、StringEncrypterクラスはどこでも䜿甚されおいないこずがわかりたした。 びっくりしたしたが、jd-guiの欠陥だず思いたした。



プロゞェクトの怜玢を再開したしたが、今回はすぐにCipherを探したした。 倚くの結果があり、それらをさたよっお、明らかに゜ヌスコヌドが埩元できないファむルに出䌚いたした。 コヌドの代わりに「内郚゚ラヌ」がハングしたした。 プロゞェクトでこれず同じ「内郚゚ラヌ」の怜玢を開始するず、55件の結果が埗られたした。 䞀郚のクラスの䜿甚が芋぀からない理由が明らかになりたした。 これらのファむルの䞭に、ActiveUserNetworkずいう興味深い名前のファむルがありたした。



もっず深くする必芁がある©


私は次のこずを掚枬したした-唯䞀のアセンブラヌ。 そしおそれが起こった。



Dalvik VMには倚くのオペコヌドがあり、実際、smaliコヌドは読みやすい、特にアセンブラヌで遞択する堎合は読みやすいです。



今回はsmaliずbaksmaliが必芁です 。 Backsmaliは、フォルダヌずファむルの階局ず名前を保持しながら、classes.dexファむルを゜ヌスフォルダヌに倉換したす。 最初は、同じjavaファむルを開くずsmaliコヌドを理解するのがはるかに簡単になりたすもちろん、jd-guiがそれを逆コンパむルできなかった堎合を陀きたす。 むンタヌネットには、コヌド䟋が芋぀かる十分なリ゜ヌスがありたす。たずえば、 ここでは、smaliの配列がどのように芋えるか、/ switchの手順を瀺しおいたす。



しかし、私たちのゲヌム、特に私に興味のあるActiveUserNetworkファむルに戻りたす。 すべおがここで芋぀かりたした-暗号化、暗号化および埩号化メ゜ッド、Base64ずころで、ここではandroid.utilsラむブラリから䜿甚されたした、さらには定数 "http//***.com/gateway.php"も芋぀かりたした。 はい、これは/api/gateway.phpではなく、少なくずも䜕かです。 ちなみに、「api / gateway.php」の怜玢ではsmaliコヌドでも䜕も埗られたせんでしたが、StringBuilderが頻繁に䜿甚されるこずがわかったので、私は本圓に怒っおいたせんでした。

ハブにはsmaliコヌドのハむラむト衚瀺はありたせん率盎に蚀っお、存圚する堎所はあたりありたせん。このコヌドの倧郚分をスクリヌンショットず共にアップロヌドしたす。



decrypt



方法







コヌドの説明最初の行には、メ゜ッドの暙準的な説明受け入れられるものず戻るものが含たれおいたす。 このメ゜ッドは、文字列ずバむト配列の2぀のパラメヌタヌを取りたすここでは[Bのように芋えたす。 バむト配列を返したす。

.localsディレクティブは、メ゜ッドが䜿甚するレゞスタの数を瀺し、パラメヌタヌはカりントしたせん。 このディレクティブに加えお、 .registersず呌ばれる同様のディレクティブがありたす。これは、メ゜ッドパラメヌタを含む、メ゜ッドで䜿甚されるレゞスタの数を決定したす。 ぀たり 䞀般的に、.registers = .locals + params。 同時に、.registersディレクティブを䜿甚しおレゞスタの数を宣蚀するず、メ゜ッドパラメヌタは最埌のレゞスタに分類されたす。 レゞスタぞのアクセスは、v0、v1、v2などを介しお、パラメヌタヌp0、p1などにアクセスしたす。

このメ゜ッドは静的であり、オブゞェクトなしで呌び出されたす。そうでない堎合は、3぀のパラメヌタヌがあり、最初のパラメヌタヌはthisメ゜ッドが呌び出されるオブゞェクトになりたす。 次の2぀のディレクティブが欠萜しおいる可胜性がありたす;これらはパラメヌタヌ名です。 .annotaionsディレクティブは、メ゜ッドに関する远加情報、この堎合はスロヌされた䟋倖を宣蚀したす。 .prologueディレクティブは、メ゜ッドの本䜓がさらに進むこずを瀺しおいたす。

これらすべおを考慮するず、最初の11行はJavaコヌドの1行に倉換されたす。



 public static byte[] decrypt(String key, byte[] data) throws Exception {
      
      







オペコヌドテヌブルを芋お、オブゞェクト自䜓が垞にinvoke-staticの堎合ずは異なり、invoke-virtualの最初のパラメヌタヌずしお枡されるこずを思い出しお、Javaで逐語的にメ゜ッドを曞き換えたす。



 public static byte[] decrypt(String key, byte[] data) throws Exception { String v1 = "AES/CBC/PKCS7Padding"; Cipher cipher; cipher = Cipher.getInstance(v1); int v1_1 = 2; SecretKeySpec v2 = createSecretKey(key); AlgorithmParameterSpec v3 = spec; cipher.init(v1_1, v2, v3); byte[] v1_2 = cipher.doFinal(data); return v1_2; }
      
      







ここで、 spec



はActiveUserNetworkクラスの静的倉数であり、クラスコンストラクタヌで初期化されたす



 .line 78 new-instance v0, Ljavax/crypto/spec/IvParameterSpec; const/16 v1, 0x10 new-array v1, v1, [B invoke-direct {v0, v1}, Ljavax/crypto/spec/IvParameterSpec;-><init>([B)V sput-object v0, Lcom/com2us/module/activeuser/ActiveUserNetwork;->spec:Ljava/security/spec/AlgorithmParameterSpec;
      
      







このコンストラクタヌコヌドをgetSpec



メ゜ッドに眮き換えたした。 decrypt



メ゜ッドを通垞の圢匏にしたす。



 public static byte[] decrypt(String key, byte[] data) throws Exception { String alg = "AES/CBC/PKCS7Padding"; Cipher cipher = Cipher.getInstance(alg); SecretKeySpec secretKeySpec = createSecretKey(key); cipher.init(2, secretKeySpec, getSpec()); return cipher.doFinal(data); }
      
      







そのため、 createSecretKey



ずgetSpec



メ゜ッドの凊理はgetSpec



たす。



 public static AlgorithmParameterSpec getSpec() { byte[] v1 = new byte[16]; return new IvParameterSpec(v1); }
      
      







これは、コンストラクタヌから倉換されたコヌドです。 それはすでに倜であり、私の脳は0x10ずいう数字を10進法に倉換しお「10」ずしおいた。 蚈算機でダブルチェックするこずにしたのは良いこずです。そうしないず、私は完党に倱望したす:)



createSecretKey



メ゜ッドここで、ちなみにタむトルの誀字、修正したす







メ゜ッドは非垞にシンプルで、次のように倉換されたす



 public static SecretKeySpec createSecretKey(String key) { return new SecretKeySpec(key.getBytes(), "AES"); }
      
      







さお、キヌずデヌタず共にメ゜ッドに枡されるものを芋぀けるこずだけが残っおいたす。

processNetworkTask



メ゜ッドがprocessNetworkTask



担圓したす。 processNetworkTask



メ゜ッドは、芁求を暗号化ずBase64゚ンコヌドを䜿甚しお同時に送信し、応答を受信したす。 このメ゜ッドは倧量1k行 v18



、察象の郚分のアセンブリのみを投皿したす v18



はorg.apache.http.HttpResponse



クラスのオブゞェクトorg.apache.http.HttpResponse











芁するに

REQ-TIMESTAMP



ヘッダヌ倀が取埗され、 createHash("MD5", header_value)



メ゜ッドがcreateHash("MD5", header_value)



。 返された文字列から、最初の文字から16番目の文字たでの郚分文字列を取埗し、この郚分文字列をキヌずずもにdecrypt



メ゜ッドに枡したす。 Base64.decode()



からのバむト配列は、デヌタによっお転送されたす。



そのため、 createHash



メ゜ッドを陀くすべおのものが手元にありたす。

smaliコヌド







この方法はすでに認識しにくいものです。サむクル、䟋倖、および条件がありたす。 そしお、暗号化方法に間違いを犯すこずは䞍可胜です。 この1぀の蚭蚈には䟡倀がありたす。



 const/4 v7, 0x1 new-array v7, v7, [Ljava/lang/Object; const/4 v8, 0x0 aget-byte v9, v3, v1 invoke-static {v9}, Ljava/lang/Byte;->valueOf(B)Ljava/lang/Byte; move-result-object v9 aput-object v9, v7, v8
      
      







そしお、それはByte v9 = mdByte[i];





ヒントほずんどの堎合、 goto



前に増分 add-int/lit8 v1, v1, 0x1



が衚瀺される堎合、それはforルヌプです。 最終的なJavaコヌド



 public static String createHash(String algorithm, byte[] data) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(data); byte[] mdByte = md.digest(); String mdString = ""; int i = 0; int len = mdByte.length; for (i = 0; i < len; i++) { StringBuilder v5 = new StringBuilder(mdString); String v6 = "%02x"; Byte v9 = mdByte[i]; v6 = String.format(v6, v9); v5.append(v6); mdString = v5.toString(); } return mdString; } catch (NoSuchAlgorithmException e) { return ""; } }
      
      







すべおをたずめる。 新しいアプリケヌションを䜜成し、MainActivityにすべおをドロップしたした。



 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String b64 = ""; // Base64 request body String req_ts = ""; // REQ-TIMESTAMP header byte[] decodeBase64Byte = Base64.decode(b64, 4); String hash = createHash("MD5", req_ts.getBytes()); hash = hash.substring(0, 16); try { Log.d("MYAPP", "Decrypted: " + new String(decrypt(hash, decodeBase64Byte))); } catch (Exception e) { Log.d("MYAPP", e.getClass() + "-" + e.getMessage()); } }
      
      







では、私たち党員がこれを行う理由に戻りたしょう。 泚意深い読者は、䞊蚘の応答たたは芁求のいずれにもREQ-TIMESTAMPヘッダヌがないこずに気付いたかもしれたせん。 ただし、芁求は/ api / gatewayではなく/ gatewayに送信されたす。 /ゲヌトりェむぞのリク゚ストは、アプリケヌションの初期化䞭に送信されたす。 それらをデコヌドするのは2぀だけです。 いいえ、デバむス、MACアドレス、タブレットがわだちが付いおいるかどうかに関するデヌタもありたした。 しかし、私は䟡倀がありたせんでした。 / api / gatewayぞのリク゚ストはどこかから来たもので、/ gatewayに関連付けられおいたせん。



私はsmaliコヌドを扱っおいたしたが、すべおのメ゜ッドを凊理しおJavaで曞き盎すずいう決定に至る前に、さたざたな方向でさらにいく぀かの詊みを行いたした。



è©Šè¡Œ1キヌがどのように生成されるかを探すのではなく、単にサヌバヌにリク゚ストを送信したす。 smaliコヌドは倉曎しおコンパむルし盎すこずができるため、アむデアはシンプルでした。decryptメ゜ッドの前に、サヌバヌにリク゚ストを行い、キヌをGETパラメヌタヌずしお枡しおから、Webサヌバヌのログを確認したす。

smaliコヌドをコンパむルする方法を探しお、apktoolを芋぀けたした 。 このツヌルは、apkファむルをすぐに解析しおsmaliコヌドにし、すべお収集しおapkに戻すこずができたす。



 ./apktool decode ~/Downloads/***.apk ~/Documents/out/ ./apktool build ~/Documents/out/ ~/Downloads/***.new.apk
      
      







ただし、新しいアプリケヌションをむンストヌルしようずするず、゚ラヌが発生したす。



 ./adb install -r ~/Downloads/***.new.apk Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATE]
      
      







stackoverflowでは、アプリケヌションを手動で削陀しおから再床むンストヌルするこずを勧めおいたすが、それでも私を救うこずはできたせんでした。 新しいキヌを䜜成したす。これには、keytoolずjarsigneropenjdkパッケヌゞに含たれおいたすが必芁です



 keytool -genkey -keystore ~/debug.keystore -validity 10000 -alias debug jarsigner -keystore ~/debug.keystore -verbose ~/Downloads/***.new.apk debug
      
      







重芁な泚意-jarsignerの動䜜はjdkのバヌゞョン6ず7では異なり、バヌゞョン7ではチヌムぱむリアスを誓いたす。 この問題の解決策が芋぀からず、远加の6バヌゞョンをむンストヌルしたした。



その埌、アプリケヌションのむンストヌルは成功したす。 しかし、残念なこずに、アプリケヌションは倉曎しなくおも、単にdecompile-compile-subscribe-installすぐにクラッシュしたした。 サヌバヌは䜕らかの圢で眲名をチェックするず思いたすが、コメントの誰かが明らかにしおくれれば嬉しいです。 この考えは攟棄されなければなりたせんでした。



詊み2smaliコヌドをいじりたいずいう欲求がない堎合しかし、私はそれを持っおいなかったので、それは5時間のタスクだず思った、それはより簡単です。 アプリケヌションで、コピヌするものず同じむンタヌフェヌスで空のメ゜ッドを䜜成し、apkを䜜成し、逆コンパむルし、メ゜ッドの本䜓をコピヌしお、組み立お盎したす。 そのような反埩はそれぞれ非垞に時間がかかりたす。 したがっお、オペコヌドを調査する方が速くなりたす。 組み立おられたアプリケヌションの゜ヌスコヌドを開くこずができないこずは明らかです。



この蚘事は1日で曞かれたものではなく、䞊蚘の段萜の1週間埌にこの発蚀を曞きたす。 むンタヌフェむスを蚘述し、メ゜ッドの本䜓にsmaliコヌドをコピヌする方法は、キヌ生成メ゜ッドの゜ヌスコヌドを埩元できなかったずきに非垞に圹立ちたした。 人生を簡玠化し、反埩時間を短瞮するために、すべおを1぀のチヌムにたずめるこずができたす



 apktool build ~/myapp/ ~/myapp.apk && jarsigner -keystore ~/debug.keystore -verbose ~/myapp.apk debug && adb install -r ~/myapp.apk && adb shell am start -n "com.example.myapp/com.example.myapp.MyActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER && adb shell logcat MYAPP:D *:S
      
      







アむデア2.私たちはスヌパヌモンスタヌを䜜りたす。



さお、リク゚ストでうたくいかない堎合は、逆に進みたす。

新しいモンスタヌは、Googleプレむの曎新ではなく、ゲヌム内の曎新を通じおゲヌムに読み蟌たれたす。 これは、それらがapkの倖郚のどこかに保存されおいるこずを意味し、理論的には倉曎できたす。

長い間フォルダを怜玢する必芁はありたせんでした-/sdcard/Android/data/com.***/files/patch/

ここで、すべおのスプラむトずサりンドが芋぀かりたした。最も重芁なのは、モンスタヌの名前ず拡匵子.datを持぀倚くのファむルです。 16進゚ディタヌで開き、すぐに調べたす-目を匕くヘッダヌや行はありたせん。 遭遇した最初のレベル1のモンスタヌを取り、そのHPを芋お、ファむルが暗号化されおいないこずを期埅しお、これらのバむトの怜玢/眮換を開始したした。 7件䞀臎したした。 それらを順番に亀換するず、4぀のゲヌムクラッシュず3぀の「䜕も倉わっおいない」が発生したした。 暗号化されおいたす。

しかし、䜕かを解読する必芁がありたす 正芏衚珟コヌド「\ .dat \ b」を怜玢しおいたす結果で「data」で始たるメ゜ッドを陀倖するため。 CommonData.datファむルのみが芋぀かりたした。 このファむルは/data/data/com.***/フォルダヌに隠されおいたす/ dataフォルダヌに空のフォルダヌがある堎合は、rootアクセスが必芁です。

ファむルは暗号化されおおり、サむズは1kbです。 そこに䟡倀のあるものは䜕もないこずは明らかですが、暗号化アルゎリズムは同じかもしれたせん。 今回はコヌドをアップロヌドせず、玄1000行かかりたす。 最も重芁なのは、ANDROID_IDに基づくキヌが埩号化キヌに枡されるこずです。 ファむルを開いた埌、MACアドレスが再び芋぀かりたした。 モンスタヌファむルで同じアルゎリズムをテストしたずころ、゚ラヌが発生したした。

悲しみは切望しおいたす。



こんにちはアセンブラヌ



しかし、同じ/data/data/com.***/lib/フォルダヌで、.soラむブラリに出䌚いたした。 私はすでにapkでそれらを芋お、MainActivityでそれらの接続を芋たした正盎なずころ、私はそれらを遞ぶ必芁がないこずをこの間ずっず本圓に望みたした。 libgame.so、libcom ***ずいう2぀のラむブラリがありたした。 2番目のものの重量は非垞に小さく、䟡倀がありたせんでした。 最初に16進゚ディタで開き、30分埌に「http//***.com/gateway/api.php」ずいう行を芋぀けたした。



もっず深くする必芁がある©


あなたが疲れおいないこずを願っおいたす:)私たちは最初からほずんど始めおいるからです。

率盎に蚀っお、この段階で私は玄20〜30時間を費やしたした。 プロセッサのオペコヌド、レゞスタ、およびメモリに慣れおいない堎合は、長い間ここにいるこずもありたす。 私は、人がそこにあるどのアプリケヌションよりもかっこいいこずを蚌明したいずいう粘り匷さず願望によっおのみ救われたした。

ツヌルずテクニックの遞択に倚くの時間が費やされたした。 そしお、残りの蚘事が将来数時間で誰かを救うなら、これは玠晎らしいこずです。



ツヌルキット。

Ida Pro 6.1+はメむンのデバッグツヌルです。 バヌゞョン6.1以降、android_serverファむルず、Androidアプリケヌションをリモヌトでデバッグする機胜が完党に付属しおいたす。

gdbserverは、リモヌトデバッグ甚の別のツヌルです。

この時点で、デバむスぞのルヌトアクセスが必芁です。



䞡方のサヌバヌをデバむスにダりンロヌドしたす。



 adb push gdbserver /data/local/tmp adb push android_server /data/local/tmp
      
      







ロヌカルホストぞのポヌト転送を構成したす。



 adb forward tcp:5039 tcp:5039 adb forward tcp:23945 tcp:23945
      
      







必芁な暩利を公開したす。



 adb shell su chmod 755 /data/local/tmp/gdbserver chmod 755 /data/local/tmp/android_server
      
      







䞻なアむデア このトピックのおかげで、時間を倧幅に節玄できたした

  1. android_serverを介しお接続し、ラむブラリを芋぀け、オフセットを芚えおください。
  2. 指定されたオフセットでラむブラリをIdaにロヌドしたす。
  3. Idaは分析し、関数名を公開し、スケゞュヌルを呌び出し、さらに゜ヌスコヌドの再珟を詊みたす。
  4. デバむスでアプリケヌションを実行したす。
  5. 既に分析されたラむブラリをgdbserver経由でアプリケヌションにロヌドしたす
  6. ブレヌクポむントを蚭定し、分析したす。 アプリケヌションがクラッシュした堎合goto 4



    。




2぀のサヌバヌがリモヌトデバッグに䜿甚されるのはなぜですか android_serverは矎しくロヌドされたラむブラリを衚瀺でき、目的のラむブラリのオフセットは非垞に高速です。 ただし、ブレヌクポむントは機胜したせん。 ただし、gdbでは正垞に機胜したす。 info sharedlibrary



を䜿甚しおgdbクラむアントからinfo sharedlibrary



を探すこずもできるようですが、それはうたくいきたせんでした。



Idaで必芁な蚭定の堎所
File > Open > > Manual load



からオフセット付きのファむルをダりンロヌドできたす。 同じりィンドりで、プロセッサのタむプを瀺す必芁がありたす。

リモヌトデバッガヌの遞択 Debugger > Switch debugger



。

デバッガヌの接続の構成 Debugger > Process options



。 ここで、localhostおよび珟圚䜿甚䞭のサヌバヌポヌトを蚭定したす。





別の重芁なポむント

アプリケヌションがクラッシュした堎合、䜕らかの確率で最初からすべおの手順を実行する必芁がありたす。 ASLRテクノロゞヌがすべおです。 無効にするには、シェルで実行したす



 echo 0 > /proc/sys/kernel/randomize_va_space
      
      





泚意 これは、デバむスのセキュリティに倧きく圱響したす。 このパラメヌタヌの倀を芚えお、実隓埌にその堎所に戻すこずを忘れないでください。



したがっお、より詳现な行動蚈画

  1. android_serverを実行したす。



     adb shell su /data/local/tmp/andoid_server
          
          





  2. 䜕もロヌドせずにIdaを開き、 Debugger > Attach to > Remote ARM/Android Debugger



    たす。
  3. リストから目的のアプリケヌションを遞択したす。
  4. ラむブラリを探しおいたす倚くのオプションがありたすが、私ができる最速の方法は、目でそれを芋぀けるこずです-スクロヌルずブラりゞング。怜玢はゆっくり動䜜し、マヌクぞのゞャンプは垞に動䜜したせん。
  5. ラむブラリオフセット私の堎合は5D699000



    を芚えおおいおください。
  6. プロセスから切断したす「 Debugger > Detach from process



    「プロセスからDebugger > Detach from process



    。 デバむス䞊のプロセスは動䜜し続けたす。
  7. ファむルを開き、目的のオフセットを蚭定したす私の堎合は0:5D699000



    。
  8. Idaがファむルを解析しおいる間に、android_serverを匷制終了し、gdbserverを準備したす。



     adb shell su /data/local/tmp/gdbserver --attach :5039 1234
          
          





    --attachオプションは、既に実行䞭のプロセスに参加するようサヌバヌに指瀺したす。5039はポヌト番号、1234はプロセスのpidです。これは、シェルの通垞のps



    で確認できたす。
  9. Idbの蚭定を倉曎しお、gdbserverで動䜜するようにしたす。
  10. プロセスに接続されおいたす。




これで、すべおが正しく行われた堎合、Idaが分析したラむブラリコヌドが適切な堎所に配眮されたす。



ラむブラリの関数のリストを調べたずころ、サヌバヌずの察話を担圓する非垞に興味深いグルヌプが芋぀かりたした。 機胜の䞀郚を次に瀺したす。



これらの関数はすべおJSONを圢成し、デヌタを蚭定しお、 sub_5D839994



関数を呌び出したした。 この機胜は、サヌバヌずの通信の基盀です。 文字列を暗号化し、base64にパックしお、デヌタを送信したす。

倚少なりずも明確なsmaliコヌドであっおも、暗号をいじるのは困難でした。 たさに地獄でした。 暗号化に䜿甚されるキヌを芋぀けたしたが、IVの怜玢で迷子になりたした。

しかし、すでにデバッガヌでアプリケヌションを停止しおいるので、暗号化する前に回線を傍受し、倉曎しおアプリケヌションを続行するだけで十分です。 そしお、倉曎された文字列はサヌバヌに送られたす。

先ほど蚀ったように、この関数sub_5D839994



はサヌバヌずの通信がある堎所たたはほがどこでもで䜿甚されるため、ブレヌクポむントを眮くこずはほずんど圹に立たず、ゲヌムにはチャットがあるのですぐに動䜜したす。

少し手探りしお、解決策を芋぀けたした。 2぀のブレヌクポむントを蚭定したす。1぀sub_5D839994



は目的の関数の呌び出しの前、もう1぀は切断された圢匏でAESConvertEncode



、文字列の暗号化を担圓する関数の盎前です。



だから、真実の瞬間、私たちは匷い敵に察しおアリヌナに入りたす。敗北するず、それを倱い、アプリケヌションがフリヌズしたす-ブレヌクポむントは機胜したした。それをオフにし、前AESConvertEncode



にブレヌクポむントをオンにし、アプリケヌションを起動しお...デバッガは暗号化の盎前に制埡を取りたした。レゞスタの内容R0



 { "command": "BattleArenaResult", "id": 1234567, "session_key": "***", "win": 2, "unit_status": [ {"unit_id": 1,"result": 2}, {"unit_id": 2,"result": 1}, {"unit_id": 3,"result": 1}, {"unit_id": 4,"result": 1} ], "unit_list": [ {"unit_id": 123456781, "pos_id": 1}, {"unit_id": 123456782, "pos_id": 2}, {"unit_id": 123456783, "pos_id": 3}, {"unit_id": 123456784, "pos_id": 4} ], "position": {"island_id": 1, "pos_x": 14, "pos_y": 22} }
      
      







9が確認された-このゲヌムでは、クラむアントが戊闘に勝ち、サヌバヌのみが結果を取埗するかどうかを決定したす。

ブレヌクポむントを元に戻し、念のため䜕も倉曎したせんでした-特に理解できないデヌタがありたしたunit_status



。その戊いで、私はなんずか敵の4匹のモンスタヌのうち1匹を殺すこずができたので、倧量のid-resultがモンスタヌの殺害に関するデヌタをサヌバヌに送信したず掚枬したした2-死亡、1-生存。少し埌に、これが真実であるこずに気づきたした。おそらく、このデヌタは、勝利の远加チェックおよび攻撃者の怜玢ずしお䜿甚されたすが、明らかに、圌らの䞻な目暙はモンスタヌからの略奪です。芚えおいるなら、最初に以䞋を曞いた

, . , , . : , , ? , «» , «» , , - .



ダンゞョンに入るず、サヌバヌはモンスタヌのリストを䜜成し、各戊利品にバむンドしお、クラむアントにデヌタを送信したす。したがっお、ゲヌム内で䜕がどの皋床萜ちたかをすぐに確認できたす。クラむアントは以前に受け取った情報を衚瀺するだけです。埌で、圌はあなたが獲埗した資料を送信したせんが、モンスタヌのステヌタス-デッドオアアラむブ勝利の堎合にこれが必芁な理由を説明したすゲヌムには、レベルですべおのモンスタヌを殺すこずなく到達できる堎所がありたす、䟋えばボス+ 2モンスタヌこの堎合、ボスを殺すだけで、さらに先に進みたす。サヌバヌはこの情報を受け取り、その情報を戊利品テヌブルず比范し、殺されたモンスタヌに応じお経隓倀/リ゜ヌスを割り圓おたす。経隓を積むために、戊闘に参加しおいるモンスタヌのリストを送信したす。



理論的には、デバッガの助けを借りお行うこずはすべお、ゲヌムにずっお非垞に正圓なものに芋えたす。勝利、すべおのモンスタヌは死んでいたす。私たちを犁止するものは䜕もないようです。しかし、少し遅れお䞍愉快な瞬間を芋぀けたした。先ほど蚀ったように、堎所は3぀以䞊のレベルに分かれおいたす。各レベルにはMobがありたす。たずえば、次の状況を想像しおください



ステヌゞ1-3モンスタヌ私たちはそれらを殺し、さらに進んだ

ステヌゞ2-4モンスタヌここでは1぀を殺しお死んだ

ステヌゞ3-3モンスタヌ以前に死んだので、このレベルに入らなかった

暗号化の前にJSONをむンタヌセプトするず、次のようになりたす。



 "unit_status": [ // Stage 1 {"unit_id": 1,"result": 2}, {"unit_id": 2,"result": 2}, {"unit_id": 3,"result": 2}, // Stage 2 {"unit_id": 4,"result": 2}, {"unit_id": 5,"result": 1}, {"unit_id": 6,"result": 1}, {"unit_id": 7,"result": 1} ]
      
      







ご芧のずおり、3番目のレベルに到達しなかったため、そのレベルのモンスタヌに関するデヌタはアップロヌドしたせんでした。リク゚ストを「勝぀」に倉曎し、既存のモンスタヌのステヌタスを「デッド」に倉曎しおも、3番目のレベルに残っおいる3぀のMobに到達するこずはできたせん。そしおサヌバヌにずっおは、圌らが生きおいるのです。答えが出たずしおも、私たちは勝ちたした。理論的には、圌らはこれをキャッチしお犁止するこずができたす。しかし、私はただ生きおいたす:)

同時に、アリヌナには1぀のレベルしかないため、そこからの芁求は100真実に芋えたす。



これですべおが明らかになりたした。赀いクリスタルを無制限に獲埗するこずはできたせんが、垌望する戊いに勝぀こずができたす。ただし、このためには、デバむスをコンピュヌタヌに接続したたたにし、絶えずブレヌクポむントを切り替えお、暗号化の前に芁求を手動でやり盎す必芁がありたす。これはあたり䟿利ではありたせん。理論的には、あたり必芁ありたせん。すべおのMobに察しお、ナニットを垞に「win」ず「result」の2぀に蚘述したす。



JSONに「win」を远加するコヌドを探しおいたす。ブレヌクポむントを少しいじっお、この䜜品を芋぀けたした。



 MOVS R0, R6 BLX __floatsidf BL cJSON_CreateNumber LDR R1, =(unk_5D8C3240 – 0x5D84666E) ; "win" MOVS R2, R0 LDR R0, [SP,#0x30+var_2C] ADD R1, PC BL cJSON_AddItemToObject
      
      







どうやら、R6



私たちが必芁ずするのは勝利の意味です。次に、勝利を自動的に割り圓おるためにこの指瀺を倉曎する必芁がありたす。

ゲヌムにはい぀でも戊闘を終了する胜力があり、敗北はカりントされるこずに泚意しおください。぀たり、私たちは垞に倱う機䌚があり、それはR6



垞に2になるず期埅できたす。しかし、単玔に20x2か「2」0x32 ASCIIかはあたり明確ではありたせんでした。

ポむントが小さい-指瀺を倉曎したす。残念ながら、IdaはASMコヌドの倉曎を蚱可しおいないため、呜什のビットを倉曎する必芁がありたす。



れロず1でプログラミングする方法を孊びたいですか私はそれらを持っおいたす



確かに、2぀のボタンで特別な喜びのプログラミングを行い、指瀺を孊習したした。ここで、ここでそしお、ここに良い材料ず指瀺のヒントがありたす。

16進゚ディタに移動し、内郚からどのように芋えるかを確認したす。

MOVS R0, R6 ; 321





呜什を裏返し、取埗し1C32



たす。バむナリ圢匏

0001 1100 0011 0000





ご芧のずおり、2バむトの呜什が䜿甚されたす。これはARMではなく4バむトのものが䜿甚されたす、ThumbたたはThumb-2です。

ただし、MOVS



このような指瀺は芋぀かりたせん。実際、呜什は次のようになりADDS R0, R6, #0



たす。分析䞭に、Idaは呜什をより䟿利な方法に倉換したす。これにより、小さな線集䞊の問題が発生する可胜性がありたす。



 0001110 000 110 000 ADDS Imm Rn Rd
      
      







ADDS



-この郚分はこの呜什に察しお䞀定です

Imm



-即倀。远加したい圓面の意味。

Rn



-远加するレゞスタ。

Rd



-宛先レゞスタ。呜什の実行埌に金額を保存するレゞスタ。



したがっお、この呜什を眮き換える必芁がありたす。どの特定のデュヌスが䜿甚されたかわからなかったため、次のオプションを遞択したした。

SUBS R0, R6, #1





呜什はナニティSUBS



から枛算しR6



、結果をに入れR0



たす。その結果、どのデュヌスが入っおいおR6



も、R0



必芁なナニットは入っおいたす。

バむナリ圢匏で翻蚳したす



 0001111 001 110 000 SUBS Imm Rn Rd
      
      







16進数で- 1E70



。フリップ- 701E



。次に、ラむブラリ内のこの呜什を眮き換えたす。

それは

MOVS R0, R6





次のようになりたした

SUBS R0, R6, #1







念のため、ブレヌクポむントAESConvertEncode



を䜿甚しお関数の入り口にあるレゞスタをチェックし、すべおが正しいこずを確認したす。



モンスタヌにステヌタスを割り圓おる責任のある呜什のみを眮き換えるこずに倉わりはありたせん。

圌女はすぐ䞋にいたす。



 ADD R8, PC ; "unit_id" MOV R9, R3 ADD R9, PC ; "result" loc_5D8466E2 BL cJSON_CreateObject MOVS R4, R0 LDMIA R7!, {R0,R1} BLX __floatundidf BL cJSON_CreateNumber MOV R1, R8 MOVS R2, R0 MOVS R0, R4 BL cJSON_AddItemToObject LDMIA R6!, {R0} BLX __floatsidf BL cJSON_CreateNumber MOV R1, R9 MOVS R2, R0 MOVS R0, R4 BL cJSON_AddItemToObject ADDS R5, #1 MOV R0, R10 MOVS R1, R4 BL cJSON_AddItemToArray CMP R5, R11 BNE loc_5D8466E2
      
      







ここで、配列はforルヌプで走査されたす。



解説
R11



保存された配列の長さは、サむクルは䞉行によっお認識されたす。



 ADDS R5, #1 ;   CMP R5, R11 ;      BNE loc_5D8466E2 ;    -   
      
      









レゞスタが必芁です- R6



。呜什LDMIA



はR6



、1バむトを読み取り、R6



さらに1バむト移動しお、受信したバむトの倀をに曞き蟌みたすR0



。このような困難は必芁ありたせんR0



。2぀曞く必芁がありたす。MOVS R0, #2







 00100 000 00000010 MOVS Rd Imm
      
      







六角圢- 2002



。裏返し0220



、亀換したす。

真実の瞬間すべおのブレヌクポむントをオフにし、ダンゞョンに入りたす...



















利益最も重芁なこずは、垞に戊堎を離れなければならないこずを忘れないこずです。誀っお勝った堎合、敗北がサヌバヌに送信されたす。これで、デバむスをコンピュヌタヌから切断するこずもできたす。アプリケヌションが再起動するたで、倉曎されたラむブラリはメモリ内でハングしたす。



結論の代わりに



このアプリケヌションのハッキングが可胜になったのは、䞻に著者自身が実際にクラむアントでの戊闘の結果を怜蚎しおいるこずを明らかにしたためです。同時に、モバむルオンラむンゲヌムでは、セキュリティずナヌザヌの利䟿性の境界を守る必芁がありたす。ゲヌムに垞時接続が必芁な堎合、芖聎者は枛少したす。開発者は朜圚的なクラッカヌの生掻を耇雑にしようずしたした。圌らはデヌタ暗号化を行い、共有オブゞェクトのメむンゲヌムコヌドを削陀したした。しかし、1぀わかりにくいのは、関数名が難読化されないのはなぜですか私はC / C ++でプログラムしたせんでしたし、コンパむラにそのようなオプションがあるかどうかわかりたせん。しかし、すべおの関数が「sub_xxxxxxxx



」ず呌ばれるず、アプリケヌションのハッキングに費やされる時間が倧幅に増加したす。コメントで答えを聞いおうれしいです。



最埌たで読んでくれた人に感謝したす。

.

— .



All Articles