簡単なハック:Javaアプリケーション

時々、ペンテスターはJavaアプリケーションに対処する必要があります。 さまざまなサーバー、クライアント、または単なるデスクトッププログラムです。 また、そのようなアプリケーションを「パッチ」することが必要になる場合があります。 なぜこれが必要なのですか? このようなニーズの各ケースは一意です。 例:





もちろん、いずれの場合も、アプリケーションを変更せずに問題を解決できます。 しかし、多くの場合、これは目的の結果を達成するための最も簡単で最速の方法です。 この記事では、Javaアプリケーションの機能を迅速かつ簡単に変更する方法を説明します。



申込み



ストーリーには、実験的なアプリケーションが必要です。 もちろん、私たちは自分で書きます。 その構造を図1に示します。



画像

図1



ご覧のとおり、非常に簡単です。アプリケーションを実行し、GUIを描画する2つのクラスです。 ここにそのソースがあります。 Main.java:



1 package com.mycompany; 2 3 public class Main 4 { 5 public static void main(String[] args) 6 { 7 javax.swing.SwingUtilities.invokeLater(new Runnable() 8 { 9 public void run() { 10 new Window(); 11 } 12 }); 13 } 14 } 15
      
      





 Window.java 1 package com.mycompany; 2 3 import com.mycompany.Targets.*; 4 import javax.swing.*; 5 6 public class Window extends JFrame 7 { 8 private JPanel panel1; 9 private JLabel Level1Value; 10 private JLabel Level2Value; 11 private JLabel Level3Value; 12 13 public Window() 14 { 15 super("Simple example"); 16 17 Level1Value.setText(new Level1().getText()); 18 Level2Value.setText(new Level2().getText()); 19 Level3Value.setText(new Level3().getText()); 20 21 getContentPane().add(panel1); 22 23 setSize(300,100); 24 setLocationRelativeTo(null); 25 26 setVisible(true); 27 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 28 } 29 } 30
      
      





クラスは非常に単純です。 Main-ウィンドウWindowを作成します。 ウィンドウ-3つのフィールドにテキストを印刷します。 彼はターゲットクラスからテキストを取得します。この例では、変更メソッドを検討します。 実行中のアプリケーションは次のようになります。図2を参照してください。



画像

図2



ツールからは、JDKとJavaDecompilerのみが必要です。 パッチを入手します。



レベル1



私たちのアプリケーションは、jarアーカイブです。 開始するには、単にJavaDecompilerに挿入して、興味のあるクラスのソースを取得します。 Level1.java:



 1 package com.mycompany.Targets; 2 3 public class Level1 4 { 5 public String getText() 6 { 7 return "Data"; 8 } 9 } 10
      
      





さて、このコードを「java」という拡張子を持つテキストファイルにコピーします。 これはあなたが考えることができる最も簡単なクラスです。 必要に応じてこのソースを変更します。 戻り値を「My msg」に置き換えました。 次に、コマンドを実行します。



画像



その結果、完成したLevel1.classを取得します。 次に、jarアーカイブに追加するだけです。 次のコマンドでこれを実行しましょう。



画像



クラスが配置されているパッケージの名前と同じパスを作成し、そこにバイナリを転送したことに注意してください。

結果を図3に示します。



画像

図3



より複雑なケースを考えてみましょう。



レベル2



同じことを行い、ソースを取得します。 Level2.java:



 1 package com.mycompany.Targets; 2 3 public class Level2 4 { 5 public String getText() 6 { 7 return "Super " + (new Level1().getText()); 8 } 9 }
      
      





その中で、「Super」を「New」に変更します。 コンパイルしてみてください:



画像



クラスにはこのパッケージの別のオブジェクトへのリンクがあるため、機能しませんでした。 しかし、javaは非常に使いやすく、コンパイル時にクラスが存在する任意のパスを指定できます。 つまり 次のコマンドを実行するだけです:



画像



その結果、既製のバイナリが再びできました。 同様に、jarアーカイブを更新し、図4の結果を確認します。

画像



画像

図4



さて、最後のケースを考えてみましょう。このケースでは、さらにいくつかの困難が追加されます。



レベル3



クラスを逆コンパイルします。 Level3.java:



 1 package com.mycompany.Targets; 2 3 import jd.core.CoreConstants; 4 5 public class Level3 6 { 7 public String getText() 8 { 9 return CoreConstants.class.getSimpleName() + " " 10 + (new Level2().getText()); 11 } 12 }
      
      





ここで、行「-update-」を追加します。 すぐにわかるように、サードパーティのパッケージが追加されました。 そして、アセンブルしようとすると、エラーが発生します:



画像



繰り返しになりますが、javaはその使いやすさを支援します。 彼女は、依存関係jarアーカイブが存在するパスを指定するだけです。 これは次のように行われます。



画像



(はい、ここではクラスパスは不要です。なぜなら、それはアーカイブに詰め込まれ、同じディレクトリにあるからです。しかし、常にそうであるとは限らないので、私はそれを指摘しました)



そして、すべてが同じです-図5の結果。



画像



画像

図5



まとめ



その結果、Javaアプリケーションを迅速かつ簡単に変更する方法の例を検討しました。 もちろん、jarアーカイブの例を見てきましたが、クラスがパックされていなければ、すべてがはるかに簡単になることを理解していますか?



All Articles