AndroidManifest.xml文件
主要内容:uses-permission //用户权限
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
android.permission.READ_PRIVILEGED_PHONE_STATE //读取-特权的-手机-状态
可以访问设备的IMEI和序列号, 但从Android10开始只能系统APP才可以使用,所以对于普通的APP,已经无法获取到设备的IMEI和序列号。
tools:ignore="ProtectedPermissions"
在加权限的时候,有Permission is only granted to system apps报错,可以忽略这个错误
android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS //请求-不管-电池-优化可以通过代码申请对当前应用忽略电量优化,但有时会有弹窗确认
android.permission.POST_NOTIFICATIONS //投递-消息
向终端用户推送通知栏消息
android.permission.INTERNET //网络
android.permission.FOREGROUND_SERVICE //前置的-服务
为了防止后台服务被系统干掉,我们需要将服务提升为前台服务
android.permission.READ_SMS //读取-SMS
可以获取短信的内容
android.permission.RECEIVE_BOOT_COMPLETED //设备-启动-完成
可以获取Android系统开机启动项列表
android.permission.READ_EXTERNAL_STORAGE // 读取-外部的-存储
android.permission.WRITE_EXTERNAL_STORAGE //写入-外部的-存储
android.permission.MANAGE_EXTERNAL_STORAGE //管理-外部的-存储
外部存储就是SDcard
MainActivity.java文件
在onCreate()函数中会创建loop类的intent并以服务运行,后续检查是否具有一些权限,没有就申请
后续的onRequestPermissionsResult函数、onActivityResult函数、request_file函数也都是申请权
限的,其中request_file函数申请的是所有文件管理权限和外部存储读取权限
BootReceiver.java文件
BroadcastReceiver类作用:
用于不同组件间的通信,包括应用内和不同应用间的交互通信
监听系统资源的变化,如网络变化、SD卡状态等
多进程的通信
使用:
继承BroadcastReceiver类,重写onReceiver方法,广播接受到了会主动回调该方法
当监听到Intent.ACTION_BOOT_COMPLETED和Intent.ACTION_REBOOT时,就启动loop.class服务
生成一个loop类的intent,以服务形式运行
loop.java文件
loop服务会生成一个设置、更新插件的消息并常驻通知栏;new出一个boby对象并以线程形式运行
其中的滚动条改变监听、触摸监听、键盘监听都没有实现
body.java文件
进行了一个循环,循环里面生成了一个phone_state对象并调用对应的start_process()函数,休息300秒后继续申请和调用
phone_state.java文件
其中的start_process()函数会获取设备的IMEI信息发送到服务器,根据返回结果调用不同的回调函数,当回调函数为onSuccess()时还会根据服务器回复内容执行不同的代码。
当服务器返回结果是”Sms_interval”时,后续调用的是sms_loop类,用来获取受害机的所有SMS信息并上传服务器。
当服务器返回结果是"Filelist"时,调用Filemanager类上传受害机外部存储器上的所有目录和文件信息
当服务器返回结果是"Filedown"时,调用Filemanager类上传受害机外部存储器上的指定文件内容
还会通过send_logs()函数向服务器发送受害机的Build.MODEL、Build.MANUFACTURER、Build.VERSION.SDK_INT、Build.VERSION.RELEASE
PostByWeb.java文件
包括PostByWeb类的构造函数和request()函数,request()函数负责上传数据并根据返回结果执行不同回调函数,构造函数则会调用request()函数。
PostType.java文件
定义了一个枚举类型,包括DATA、FILE、PATCH,在PostByWeb.java中的request()函数中根据该类型的枚举值使用不同的url和链接服务器的参数
_Global.java文件
定义了一些字符串,大部分需要通过MyCrypt.crypt( , )函数解密获得;
其中有一个字符串是url地址;
System.currentTimeMillis()函数返回当前系统时间(毫秒);
ICON_START_NAME字符串看名字应该是和图标有关系,尝试base64解密后是一张png图片(在后续解密代码中证明该猜想),尝试打开但无法显示,在XP系统下显示为一张透明图片
MyCrypt.java文件
定义了一个54行2列的二维数组用来亦或解密,包括解密字符串和文件
ICallBack.java文件
定义了回调函数类,具体包括三个子函数onFinished()、onError()、onSuccess()
Filemanager.java文件
Filemanager类作用主要是上传外部存储器指定目录和文件的所有信息,并上传指定文件内容
sms_loop.java文件
sms_loop类中的主要函数是run()函数,run()函数中又调用了sms_prob()函数,sms_prob()功能是获取受害机中所有SMS卡信息并发送到服务器。
StringCompressor.java文件
StringCompressor类看代码应该是对字符串进行压缩处理的,实际只在Filemanager类代码中出现过,而且是注释形式,其他地方没有出现,估计是作者把StringCompressor类废弃了。