样本1

样本为远控木马,本文跟踪了其执行逻辑与通讯协议

package=”com.android.tester”

SHA-1 B21A3447DEC6B1DCC57E47454D5257E8431CC0E6

2个简单Android样本 - 图1

申请权限如下

![(media/6a0ac9727dcd90b119ba82819edbf2e3.png)

2个简单Android样本 - 图2

主要逻辑

方法com.android.tester. C11.a,该方法执行一个线程,功能如下

从本地资源或者SharedPreferences取出字段

2个简单Android样本 - 图3

2个简单Android样本 - 图4

从本地SharedPreferences存储取出字段,通过socket连接

string:p “2212” (端口号)

string:h “116.255.181.56” (IP地址)

方法com.android.tester. C11.a

2个简单Android样本 - 图5

设置通讯数据流,执行新线程方法b,该方法将处理指令

com.android.tester.C11.b 可以看到在接收数据

2个简单Android样本 - 图6

将接收的数据字符串经过处理来到执行分发处:

2个简单Android样本 - 图7

随意跟进一个分支,将看到类似如下的方法:

com.android.tester.C11.k

2个简单Android样本 - 图8

可以看到:擦除数据、锁住等功能

通讯流量

追踪tcp流,发现如下流量:

2个简单Android样本 - 图9

查看app发送数据的方法之一:可以发现写入socket输出流的首字节为数据长度,随后用0分隔,末尾写入要发送的数据。

2个简单Android样本 - 图10

该方法被调用的某处,发现要发送的字符串

2个简单Android样本 - 图11

检查其他发送数据的方法:如下某处,读取文件打包发送,要发送的数据依旧为:长度+
分隔符0 + 数据本体

2个简单Android样本 - 图12

所以:发送数据格式为:长度+ 分隔符0 + 数据本体(明文字符串或者处理过的数据)

服务端响应:5.poing,应为服务器正确接收到数据回复客户端。

2个简单Android样本 - 图13

另一个会话:

2个简单Android样本 - 图14

2个简单Android样本 - 图15

48.10261 10249/storage/emulated/0/Download/work10249

48为长度, 10261 1024应为识别用的符号,中间按字符串为需要处理的目录

我们找到10261对应分支:

2个简单Android样本 - 图16

开始处理指令

2个简单Android样本 - 图17

所以:客户端发送数据格式为:长度+ 分隔符0 +
数据本体(明文字符串或者处理过的数据)

客户端接收数据格式为:长度+.+指令+指令参数(明文字符)


样本2

概况

主要分析追踪服务器地址

packagename:com.app

SHA1:44720D7B0B33590FF65984D12147CD1E4517F18B

跟踪代码

接收处理类:com.app.client.RecvService

2个简单Android样本 - 图18

2个简单Android样本 - 图19

SettingsInit配置数据,包括服务器地址,是需要AES解密从设置文件里的数据

2个简单Android样本 - 图20

com.app.client.RecvService.GetTasks处理任务,其中将调用APP_HANDSHAKE和服务器连接:

com.app.client.RecvService.APP_HANDSHAKE

2个简单Android样本 - 图21

目标地址变量:Setting.TASKS_URL,查找交叉引用,可以发现在方法sendHandshake中也有配置服务器地址:

2个简单Android样本 - 图22

2个简单Android样本 - 图23

解密数据,因为要求不运行apk,那么将下面代码抠出来即可

2个简单Android样本 - 图24

2个简单Android样本 - 图25

得到通讯服务器域名:https://semikite.wm01.to/recv_android.php