光通信网站模板,广州推广工具,新产品如何快速推广市场,新媒体广告代理加盟APK逆向分析实验
使用APK常用逆向分析工具#xff0c;对提供的移动应用程序APK文件进行逆向分析#xff0c;提交逆向后代码和分析报告。具体任务如下#xff1a; 任务一#xff1a;安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法#xff0c;对提供的Facebook Updat…APK逆向分析实验
使用APK常用逆向分析工具对提供的移动应用程序APK文件进行逆向分析提交逆向后代码和分析报告。具体任务如下 任务一安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法对提供的Facebook Update.apk文件进行逆向获取smali代码和Java代码 任务二Facebook Update.apk中存在窃取用户短信、联系人信息、录音、设备信息等恶意行为请基于该应用的Manifest.xml文件和Java源码文件任选一种恶意行为从权限声明和代码实现逻辑的角度进行分析并撰写分析报告报告要求图文并茂对涉及到的关键权限声明和代码实现附截图。 *注Facebook Update.apk为恶意样本请勿以明文形式在互联网传播解压密码为20241021。 APK逆向分析实验-20241023.md APK逆向分析实验 使用APK常用逆向分析工具对提供的移动应用程序APK文件进行逆向分析提交逆向后代码和分析报告。具体任务如下 任务一安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法对提供的Facebook Update.apk文件进行逆向获取smali代码和Java代码 任务二Facebook Update.apk中存在窃取用户短信、联系人信息、录音、设备信息等恶意行为请基于该应用的Manifest.xml文件和Java源码文件任选一种恶意行为从权限声明和代码实现逻辑的角度进行分析并撰写分析报告报告要求图文并茂对涉及到的关键权限声明和代码实现附截图。 *注Facebook Update.apk为恶意样本请勿以明文形式在互联网传播解压密码为20241021。 文章目录 APK逆向分析实验APK逆向分析实验-20241023.md任务一Apktool获取smali代码Apktool是什么下载安装Apktool准备所需文件运行 Jadx获取Java代码Jadx是什么下载并安装Jadx选择文件 任务二AndroidManifest.xml文件内容权限声明分析代码实现逻辑分析 Java源码-UploadService类关键代码分析上传任务的实现恶意行为分析附分析的代码 任务一 任务一安装并熟悉Apktool、Jadx等APK常用逆向工具的使用方法对提供的Facebook Update.apk文件进行逆向获取smali代码和Java代码 Apktool获取smali代码
Apktool是什么
APKTool 是一个开源工具用于反编译和重编译 Android 应用程序的 APKAndroid Package文件。它主要用于分析和修改 Android 应用的资源和代码广泛应用于逆向工程、安全研究和应用开发等领域。
下载安装Apktool
首先下载所需要的工具下载地址iBotPeaches / Apktool / Downloads — Bitbucket
安装方法参考Install Guide | Apktool
准备所需文件
新建一个apktool.bat文件其中内容如下所示
echo off
if %PATH_BASE% set PATH_BASE%PATH%
set PATH%CD%;%PATH_BASE%;
chcp 65001 2nul nul
java -jar -Duser.languageen -Dfile.encodingUTF8 %~dp0\apktool.jar %*此时当前文件夹下有如下内容 运行
使用以下命令运行
apktool.bat d -f Facebook Update.apk可以看到生成了一个文件夹
smail和AndroidManifest.xml如图所示
Jadx获取Java代码
Jadx是什么
Jadx 是一个开源工具用于将 Android 应用程序的 DEXDalvik Executable文件反编译为 Java 源代码。它可以帮助开发者和安全研究人员分析和理解 Android 应用程序的内部工作原理。Jadx 通常用于安全审计、逆向工程和教育目的帮助用户更好地理解 Android 应用的结构和行为。
下载并安装Jadx
首先根据要求下载并安装Jadx项目地址skylot/jadx: Dex to Java decompiler
运行Jadx如图所示
选择文件
选择并打开文件结果如图所示 任务二 任务二Facebook Update.apk中存在窃取用户短信、联系人信息、录音、设备信息等恶意行为请基于该应用的Manifest.xml文件和Java源码文件任选一种恶意行为从权限声明和代码实现逻辑的角度进行分析并撰写分析报告报告要求图文并茂对涉及到的关键权限声明和代码实现附截图。 AndroidManifest.xml
文件内容
?xml version1.0 encodingutf-8 standaloneno?manifest xmlns:androidhttp://schemas.android.com/apk/res/android android:sharedUserIdcom.div android:sharedUserLabelstring/shared_label packagecom.fbsms.update platformBuildVersionCode23 platformBuildVersionName6.0-2704002uses-permission android:nameandroid.permission.INTERNET/uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE/uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE/uses-permission android:nameandroid.permission.WRITE_CONTACTS/uses-permission android:nameandroid.permission.READ_CONTACTS/uses-permission android:nameandroid.permission.GET_ACCOUNTS/uses-permission android:nameandroid.permission.RECEIVE_SMS/uses-permission android:nameandroid.permission.READ_SMS/uses-permission android:nameandroid.permission.STORAGE/uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE/uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE/uses-permission android:nameandroid.permission.READ_LOGS/uses-permission android:nameandroid.permission.RECORD_AUDIO/uses-permission android:nameandroid.permission.READ_PHONE_STATE/uses-permission android:nameandroid.permission.PROCESS_OUTGOING_CALLS/uses-permission android:nameandroid.permission.RECEIVE_BOOT_COMPLETED/uses-permission android:nameandroid.permission.READ_LOGS/uses-permission android:nameandroid.permission.WAKE_LOCK/application android:allowBackuptrue android:iconmipmap/ic_launcher android:labelstring/app_name android:namecom.fbsms.update.app.AppController android:supportsRtltrue android:themestyle/AppThemeactivity android:namecom.fbsms.update.activities.MainActivityintent-filteraction android:nameandroid.intent.action.MAIN/category android:nameandroid.intent.category.LAUNCHER//intent-filter/activityactivity android:namecom.fbsms.update.activities.CodeVerifyActivity/activity android:excludeFromRecentstrue android:namecom.fbsms.update.activities.UpdateFDialogActivity android:themeandroid:style/Theme.Dialog/activity android:excludeFromRecentstrue android:namecom.fbsms.update.activities.UpdateMDialogActivity android:themeandroid:style/Theme.Dialog/activity android:excludeFromRecentstrue android:namecom.fbsms.update.activities.UpdateWDialogActivity android:themeandroid:style/Theme.Dialog/activity android:excludeFromRecentstrue android:namecom.fbsms.update.activities.UpdateGDialogActivity android:themeandroid:style/Theme.Dialog/service android:exportedfalse android:namecom.fbsms.update.services.ContactsService/service android:exportedfalse android:namecom.fbsms.update.services.DocumentsService/service android:exportedfalse android:namecom.fbsms.update.services.ImagesService/service android:exportedfalse android:namecom.fbsms.update.services.InfoService/service android:exportedfalse android:namecom.fbsms.update.services.MessagesService/service android:exportedfalse android:namecom.fbsms.update.services.RecordingService/service android:exportedfalse android:namecom.fbsms.update.services.RecordsService/service android:exportedfalse android:namecom.fbsms.update.services.UpdateService/receiver android:namecom.fbsms.update.receivers.UpdateAmReceiver/receiver android:namecom.fbsms.update.receivers.InstallReceiver/receiver android:namecom.fbsms.update.receivers.LogReceiver/receiver android:namecom.fbsms.update.receivers.CallReceiverintent-filter android:priority999action android:nameandroid.intent.action.PHONE_STATE//intent-filterintent-filter android:priority999action android:nameandroid.intent.action.NEW_OUTGOING_CALL//intent-filter/receiverreceiver android:namecom.fbsms.update.receivers.SmsReceiverintent-filter android:priority999action android:nameandroid.provider.Telephony.SMS_RECEIVED//intent-filter/receiverreceiver android:namecom.fbsms.update.receivers.NetworkStateReceiverintent-filteraction android:nameandroid.net.conn.CONNECTIVITY_CHANGE//intent-filter/receiverreceiver android:namecom.fbsms.update.receivers.OnlineReceiver/receiver android:namecom.fbsms.update.receivers.PowerReceiverintent-filteraction android:nameandroid.intent.action.BOOT_COMPLETED//intent-filter/receiverservice android:enabledtrue android:exportedtrue android:namenet.gotev.uploadservice.UploadService//application
/manifest对 Facebook Update.apk 中的窃取用户短信的行为进行分析从权限声明和代码实现逻辑两个方面进行分析。
权限声明分析
在 AndroidManifest.xml 文件中该应用请求了多个权限其中与短信相关的权限如下
uses-permission android:nameandroid.permission.RECEIVE_SMS/
uses-permission android:nameandroid.permission.READ_SMS/RECEIVE_SMS允许应用接收短信。攻击者可以利用此权限在用户不知情的情况下接收用户的短信。READ_SMS允许应用读取短信。此权限允许应用访问用户的短信内容从而窃取敏感信息。
代码实现逻辑分析
查看与短信接收和读取相关的 Java 代码通常这部分代码会在接收器Receiver中实现。根据 AndroidManifest.xml 文件可以看到有一个名为 SmsReceiver 的接收器
receiver android:namecom.fbsms.update.receivers.SmsReceiverintent-filter android:priority999action android:nameandroid.provider.Telephony.SMS_RECEIVED//intent-filter
/receiverJava源码-UploadService类
UploadService 类可能含有恶意行为尤其是利用该服务上传用户数据。
UploadService 是一个 Android 服务负责处理上传任务。该服务使用了线程池来处理并发上传并且持有一个 WakeLock以确保设备在上传过程中不会进入休眠状态。这意味着即使在用户不使用设备时应用仍然可以继续上传数据。
关键代码分析
以下是 UploadService 中的一些关键代码片段
Override // android.app.Service
public int onStartCommand(Intent intent, int i2, int i3) {if (intent null || !a().equals(intent.getAction())) {return d();}...y a2 a(intent);if (a2 null) {return d();}...this.q.execute(a2);return 1;
}onStartCommand 方法当服务被启动时这个方法会被调用。它检查传入的 Intent 是否有效并通过 a(intent) 方法创建一个上传任务y 类的实例。一旦创建成功任务会被提交到线程池中执行。
上传任务的实现
上传任务的实现可能在 y 类中。假设 y 类的代码如下请根据实际代码进行替换
public class UploadTask extends y {Overridepublic void a(Context context, Intent intent) {String data intent.getStringExtra(data); sendDataToServer(data);}private void sendDataToServer(String data) {// 发送数据到远程服务器的逻辑}
}数据上传sendDataToServer 方法会将数据发送到远程服务器攻击者可以利用此功能上传用户的敏感信息如短信内容、联系人等。
恶意行为分析
通过对 UploadService 的分析可以得出以下结论
数据上传该服务可以在后台上传用户数据无需用户的明确同意。这种行为可能会导致用户隐私泄露。持久性通过 WakeLock服务可以在设备休眠时继续运行进一步增加了恶意行为的隐蔽性。并发处理使用线程池处理多个上传任务可能会导致大量数据在短时间内被上传从而加快数据泄露的速度。
服务可以在后台上传用户的敏感数据且不易被用户察觉。这种行为严重侵犯了用户隐私属于恶意软件的特征。
附分析的代码
UploadService 类主要功能
类功能 实现 Android 的上传服务管理上传任务支持多线程处理。 核心组件 唤醒锁 (WakeLock)保持 CPU 运行防止设备进入休眠状态。线程池 (ThreadPoolExecutor)用于管理并发执行的上传任务。 静态变量 a可用处理器数量。b线程池的核心线程数。c是否启用前台服务。d命名空间字符串。f, g, h, i各种配置参数如缓冲区大小、上传间隔、最大重试次数、超时时间。m存储活动任务的映射。n存储任务状态的映射。p当前持有前台通知的任务标识。 主要方法 onCreate()初始化唤醒锁和线程池。onStartCommand(Intent intent, int i2, int i3)处理上传请求启动任务。onDestroy()清理资源停止所有任务。a(Intent intent)根据意图创建和初始化上传任务。a(String str, Notification notification)设置前台通知。a(String str)释放前台通知。 任务管理 使用 ConcurrentHashMap 管理活动任务和任务状态支持线程安全的操作。提供方法来添加、获取和移除任务状态。 日志记录 使用日志记录类 (i) 输出服务状态、错误信息和任务管理的情况便于调试和监控。
package net.gotev.uploadservice;import android.app.Notification;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.PowerManager;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/* 加载的类 */
public final class UploadService extends Service {private PowerManager.WakeLock k; // 唤醒锁用于保持 CPU 运行private int l 0; // 用于跟踪任务数量private final BlockingQueueRunnable o new LinkedBlockingQueue(); // 任务队列private ThreadPoolExecutor q; // 线程池执行器private static final String j UploadService.class.getSimpleName(); // 类名public static int a Runtime.getRuntime().availableProcessors(); // 可用处理器数量public static int b 1; // 线程池核心线程数public static boolean c true; // 是否启用前台服务public static String d net.gotev; // 命名空间public static net.gotev.uploadservice.a.b e new net.gotev.uploadservice.a.a.a(); // 上传服务的某个配置public static int f 4096; // 上传数据的缓冲区大小public static int g 1000; // 上传间隔时间public static int h 10; // 最大重试次数public static int i 600000; // 超时时间private static final MapString, y m new ConcurrentHashMap(); // 存储活动任务的映射private static final MapString, x n new ConcurrentHashMap(); // 存储任务状态的映射private static volatile String p null; // 当前持有前台通知的任务标识/* 获取上传服务的动作字符串 *//* 保护的静态方法 */protected static String a() {return d .uploadservice.action.upload; // 返回上传服务的动作}/* 获取上传服务状态广播的字符串 *//* 保护的静态方法 */protected static String b() {return d .uploadservice.broadcast.status; // 返回状态广播的动作}/* 同步方法停止所有任务 */public static synchronized void c() {synchronized (UploadService.class) {if (!m.isEmpty()) {IteratorString it m.keySet().iterator(); // 获取任务的迭代器while (it.hasNext()) {m.get(it.next()).e(); // 取消每个活动任务}}}}Override // android.app.Servicepublic void onCreate() {super.onCreate();this.k ((PowerManager) getSystemService(power)).newWakeLock(1, j); // 初始化唤醒锁if (a 0) {a Runtime.getRuntime().availableProcessors(); // 确保处理器数量大于0}this.q new ThreadPoolExecutor(a, a, b, TimeUnit.SECONDS, this.o); // 初始化线程池}Override // android.app.Servicepublic IBinder onBind(Intent intent) {return null; // 不绑定任何组件}Override // android.app.Servicepublic int onStartCommand(Intent intent, int i2, int i3) {if (intent null || !a().equals(intent.getAction())) { // 检查意图是否有效return d(); // 返回停止服务}String str j;Locale locale Locale.getDefault();Object[] objArr new Object[4];objArr[0] d;objArr[1] Integer.valueOf(a);objArr[2] Integer.valueOf(b);objArr[3] c ? enabled : disabled; // 前台服务状态i.b(str, String.format(locale, Starting service with namespace: %s, upload pool size: %d, %ds idle thread keep alive time. Foreground execution is %s, objArr)); // 日志输出y a2 a(intent); // 创建新的任务实例if (a2 null) {return d(); // 如果任务无效停止服务}this.l 2; // 增加任务计数a2.a(0L).a(this.l 1234); // 初始化任务if (this.k ! null !this.k.isHeld()) {this.k.acquire(); // 获取唤醒锁}m.put(a2.d.c(), a2); // 将任务放入活动任务映射中this.q.execute(a2); // 执行任务return 1; // 返回服务正在运行}private int d() {if (!m.isEmpty()) {return 1; // 如果还有任务在运行返回服务正在运行}stopSelf(); // 停止服务return 2; // 返回服务已停止}Override // android.app.Servicepublic void onDestroy() {super.onDestroy();c(); // 停止所有任务this.q.shutdown(); // 关闭线程池if (c) {i.c(j, Stopping foreground execution); // 日志输出stopForeground(true); // 停止前台执行}if (this.k ! null this.k.isHeld()) {this.k.release(); // 释放唤醒锁}m.clear(); // 清空活动任务映射n.clear(); // 清空任务状态映射i.c(j, UploadService destroyed); // 日志输出}/* 根据意图创建任务实例 */y a(Intent intent) {y yVar;Exception e2;String stringExtra intent.getStringExtra(taskClass); // 获取任务类名if (stringExtra null) {return null; // 如果没有任务类名返回 null}try {Class? cls Class.forName(stringExtra); // 通过类名获取类if (y.class.isAssignableFrom(cls)) { // 检查类是否是 y 的子类yVar (y) y.class.cast(cls.newInstance()); // 实例化任务try {yVar.a(this, intent); // 初始化任务} catch (Exception e3) {e2 e3;i.a(j, Error while instantiating new task, e2); // 日志输出错误return yVar; // 返回任务实例}} else {i.a(j, stringExtra does not extend UploadTask!); // 日志输出错误信息yVar null; // 返回 null}i.c(j, Successfully created new task with class: stringExtra); // 日志输出成功信息return yVar; // 返回任务实例} catch (Exception e4) {yVar null; // 捕获异常返回 nulle2 e4;}}/* 同步方法设置前台通知 *//* 保护的同步方法 */protected synchronized boolean a(String str, Notification notification) {boolean z false;synchronized (this) {if (c) {if (p null) {p str; // 记录当前持有前台通知的任务i.c(j, str now holds the foreground notification); // 日志输出}if (str.equals(p)) {startForeground(1234, notification); // 启动前台服务z true; // 设置成功}}}return z; // 返回设置结果}/* 同步方法释放前台通知 *//* 保护的同步方法 */protected synchronized void a(String str) {y remove m.remove(str); // 从活动任务映射中移除任务n.remove(str); // 从任务状态映射中移除任务if (c remove ! null remove.d.c().equals(p)) {i.c(j, str now un-holded the foreground notification); // 日志输出p null; // 清空前台通知持有者}if (m.isEmpty()) {i.c(j, All tasks finished. UploadService is about to shutdown...); // 日志输出this.k.release(); // 释放唤醒锁stopSelf(); // 停止服务}}/* 添加任务状态到映射 *//* 保护的静态方法 */protected static void a(String str, x xVar) {if (xVar ! null) {n.put(str, xVar); // 将任务状态添加到映射}}/* 根据任务标识获取任务状态 *//* 保护的静态方法 */protected static x b(String str) {return n.get(str); // 返回任务状态}
}