Arcanoidの例のゲームの変更

良い一日!



はじめに



しばらくの間、さまざまなkeygen'ovおよび「リバースエンジニアリング」の分析に関する優れた記事がそこに掲載され始めたという事実のため、ハブでアセンブラーのブログを見てきました。 私は長い間、似たようなことをして、J2MEで何らかのゲームを変更したいと思っていました。 良いものを探して長い間インターネットをサーフィンしていましたが、同時に(分析の観点から)理解しやすいゲームを探しました。 かつて、友人のプログラマーのサイトを掘り下げました(ちなみに、彼はJ2MEのプログラムも書いています。ProPaintMobileを使った人は私が話していることを知っています。 、または単に「楽しみのために」書かれたのですが、それでもこのゲームはまさにあなたが必要とするものであることが判明しました。





何が必要ですか



変更を行うには、次のコンポーネントが必要です。

  1. バイトコードを変更するプロセスでナビゲートしやすくするためのソースコードを提供する逆コンパイラ。 個人的に、私はこれらの目的のためにJava Decompilerを使用しています。
  2. このまさにバイトコードが提供する仮想マシンのバイトコードの逆アセンブラはJavaByteであり、 ここからダウンロードできます
  3. 被験者自身- アルカノイド ;
  4. まあ、仕様をよく理解しておくといいでしょう。仕様では、仮想マシンの手順を説明しています。 こちらで読むことができます


おそらくすべて。 実際、ソフトウェアの選択は個々の問題であり、私は親密だと思います。 したがって、たとえば、 Java Decompilerの代わりにJasminを簡単に使用できます。



今何をしますか



最初のステップ


まず、このゲームで敵のマシンを開き、そこで変更できるものを確認する必要があります。 ソースjarファイルはありませんが、検証済みのクラスとMANIFEST.MFがあるので、ゲームをパックしましょう。 すぐに言ってやった。





アーカイブの構造は、上記のとおりになります。 拡張子をやり直すだけです-zipからjarへ 、そして...



第二段階


そして、ゲームを実行します。 少し遊びましょう。





私たちは遊び続けます...





おっと さて、あと2つの命が残りました。 さらにプレイします。





すべてが終わった。 それについてやるべきことがあります。



第三段階


私たちはそれを使って何か、つまり逆コンパイルをしています。 問題ありません。 ソースを調べてみると、最も興味深いものはGCanvas.javaファイルに保存されていることがわかります。 内容を詳しく見てみましょう。







ここで、コンストラクター、変数、およびメソッドを確認します。



私たちの人生がどこで減っているのか、あなたと一緒に見ていることを思い出してください。 ライブまたはライブの言及を探しましょう。 ここで幸運です。 ゲームは難読化されていないので、多かれ少なかれ本名の変数とメソッドが表示されます。 そして、ソースファイルの最初の部分でこの行にすぐに移動します。



int m_m_LivesII;
      
      







コメントは冗長です。 これは私たちの生活のカウンターです。 この変数が減少する場所を見つけることだけが残っています。 そして、逆コンパイラが指摘するように、これは行170です。



 this.m_m_LivesII -= 1;
      
      







このコードを調べてみましょう。



 while (this.m_m_goGameZZ) { if (!this.m_m_playGameZZ) { if (this.m_m_boomZZ) { this.m_m_ballcBallcBall.setVisible(false); _AnimateBoomcGraphicsV(g); this.platform.setVisible(false); this.m_m_LivesII -= 1;
      
      







ここでは、完全な指示が与えられていると言えます。ブール値である変数m_m_goGameZZtrueに設定されている場合 、ゲームはオンです。 衝突では、 m_m_playGameZZという名前の同じブール変数がfalseになり、プラットフォームの爆発がアニメーション化され( _AnimateBoomGraphics )、プラットフォームが非表示になり( platform.setVisible(false) )、コードからわかるように生命が奪われます高いです。 もちろん、最初に思い浮かぶのは、変数m_m_LivesIIから1を引く代わりに、コードを変更して追加する必要があるということです。 しかし、これはどういうわけか風水ではありません。 次に、変数を1に等しくします。 そして再コンパイルしますか? これを再コンパイルし、クラスを検証してから、すべてをアーカイブに再構築する必要があります。 いいえ、私は怠け者です。 ただし、クラスのバイトコードを単純に修正する方法があり、最初の2つのステップを実行する必要はありません。 次に進む...



そこでのステ​​ップは何ですか? そうそう4


バイトコードを編集するために、 JavaBiteがあります。 それを使ってみましょう。

クラスを開きましょう( クラス -> Javaクラス追加して 、この図を見ます:







興味のあるコードがどこにあるか覚えているといいのですが? まさに、これはrunメソッドです。 それを見てみましょう:







最初から指示を実行してみましょう。 やめて! 何にも似ていませんか?







はい、これはまさに私たちが必要とするものです。 下の指示を通して、あなたはisub指示に気付くでしょう-これはそれです!

一般に、ロシア語では、この命令は変数m_m_LivesIIから何かを減算することを意味します。 この変数は常に1である必要があります。 これは非常に簡単に実現できます。 isubステートメントnopに変更しましょう。 右クリックして[ 手順編集 ]を選択します。 ここでは、スクリーンショットでさえ必要ありません。 その結果、指示は次のようになります。







すでにオリジナルではないクラスを古いクラスに置き換えてスローし、ゲームを開こうとしますが、プレイする代わりに次のエラーメッセージが表示されます。







デブリーフィング


このメッセージから、クラスにエラーが含まれていることがわかります。 はい、キャップ!

しかし、どれですか? 問題は、この場合のnopがスタックの胃に不均衡を引き起こすことであり、問​​題を解決するために命令iconst_1nopする必要もあります。 なんで? これを宿題としてお任せします。 この命令は、 nopの直後に独立した 長さになります。 ところで、ここで彼女は:







実際、 昨日彼女とすべきだったことをやっている。 出来上がり!







それでは、ゲームを再構築しましょう。 そして最後に、プレイしましょう。









プラットフォームの外でボールを見逃した場合、常に次のように表示されます。







私たちは灰色オオカミを恐れていません。 これで、脈を失う前に安全にゲームをプレイできます(ただし、レベルが2つしかないため、1分後に退屈します)。死を恐れることはありません!



おわりに



実際、私はこの実験を長い間行ってきました。私は初心者で、これらすべての指示を習得しただけでした。 かつて私にとって、彼らとアセンブラー自身は悪夢でした。 しかし、時間が経ちます-ビューは変わり、私たちは変わります。 このチュートリアルがお役に立てば幸いです。



じゃあね!



PSこの実験中、アルカノイドは負傷しませんでした!



All Articles