美文网首页
APP被修改检测探索

APP被修改检测探索

作者: NIIIICO | 来源:发表于2022-11-17 15:29 被阅读0次

一、背景介绍

现在市面上,诸如:MT管理器、APK Editor等软件,可以对APK文件进行修改,提取AndroidManifest文件,修改包名、版本号、图标、应用名称等。

通过修改版本号,可以跳过应用升级检测,从而出现新版本修复的漏洞无法修复的情况;还会造成新功能无法使用,新推广的业务无法正常展开。

二、修改检测

通过研究,发现要达到上述修改目的,势必要对APK文件进行修改,再重新打包签名安装。

我们知道,Android在安装apk时,会在目录 /data/app/包名/ 路径拷贝一份APK文件:base.apk。因此,可以通过获取到base.apk文件,计算base.apk的MD5,检测文件是否被修改。

同时可以获取以下信息:app的 包名、版本号、名称、签名信息、md5,上报服务接口进行校验,从而阻止被修改的app继续使用。

交互流程

三、客户端获取信息

1、AppInfoUtils
public class AppInfoUtils {

    // 获取appid
    public static String getAppId(Context context) {
        return context == null ? "" : context.getPackageName();
    }

    // 获取app名称
    public static String getAppName(Context context) {
        return context == null ? "" : context.getString(context.getApplicationInfo().labelRes);
    }

    // 获取base.apk的路径
    public static String getBaseApkPath(Context context) {
        return context == null ? "" : context.getApplicationInfo().sourceDir;
    }

    // 获取appVersionName
    public static String getAppVersionName(Context context) {
        try {
            return context == null ? "" : context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    // 获取appVersionCode
    public static long getAppVersionCode(Context context) {
        if (context == null) return 0;
        try {
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return AndroidSysUtils.isOverP9() ? packageInfo.getLongVersionCode() : packageInfo.versionCode;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    // 获取签名文件的md5
    public static String getSignMD5(Context context) {
        if (context == null) return "";
        try {
            Signature[] signatures;
            if (AndroidSysUtils.isOverP9()) {
                PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNING_CERTIFICATES);
                SigningInfo signingInfo = packageInfo.signingInfo;
                signatures = signingInfo.getApkContentsSigners();
            } else {
                PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
                signatures = packageInfo.signatures;
            }
            StringBuilder stringBuilder = new StringBuilder();
            for (Signature signature : signatures) {
                stringBuilder.append(MD5Utils.getMd5ByByteArray(signature.toByteArray())).append(",");
            }
            return stringBuilder.substring(0, stringBuilder.length() - 1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    // 获取base.apk的md5
    public static String getBaseApkMD5(Context context) {
        try {
            return context == null ? "" : MD5Utils.getMd5ByFile(getBaseApkPath(context));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}
2、MD5Utils
public class MD5Utils {
    public static String getMd5ByFile(String fileName) {
        FileInputStream in = null;
        try {
            in = new FileInputStream(fileName);
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] buffer = new byte[1024];
            int readCound;
            while ((readCound = in.read(buffer)) > 0) {
                md5.update(buffer, 0, readCound);
            }
            BigInteger bi = new BigInteger(1, md5.digest());
            return bi.toString(16);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return "";
    }

    public static String getMd5ByByteArray(byte[] byteArray) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(byteArray);
            BigInteger bi = new BigInteger(1, md5.digest());
            return bi.toString(16);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}

相关文章

  • APP被修改检测探索

    一、背景介绍 现在市面上,诸如:MT管理器、APK Editor等软件,可以对APK文件进行修改,提取Androi...

  • 检测分身App

    利用命令检测已安装第三方分身App App被分身软件复制安装后,就可以随意拦截修改Api层东西,比如位置信息等,容...

  • iOS判断手机是否安装其他App

    前提:被检测的app在开发时设置了URLScheme检测的app项目开发时在Plist白名单中添加被检测app的U...

  • Python 豌豆荚 APP版本检测脚本

    Python 豌豆荚 APP版本检测脚本 获取指定APP最新版本号 读取配置文件记录版本号 修改配置文件 检测版本...

  • 检测iOS定位被修改

    无论是爱思助手或者牛蛙助手,亲测此方法有效。虽然第三方app可以修改位置,只是修改了经纬度,但是其他数据并没有修改...

  • Webview组件跨域访问风险

    检测iOS App程序中是否可利用Webview组件跨域访问读取或修改文件的风险 WebView组件是iOS用于显...

  • iOS逆向1024-防护进阶

    001--反调试sysctl(代码防护) // sysctl:检测app进程是否被附加 (防护进程被调试) 《程...

  • flutter资源文件相关

    修改app名字-iOS:打开Xcode项目,修改即可 修改app名字-android:image.png app ...

  • 前端技术月报201812期

    Android App签名流程分析 App签名机制是Android系统的安全保障,可防止App被恶意修改,有效阻止...

  • ssl劫持问题

    今天webview中被检测出有ssl劫持的危险。检测的方法是: app连上vpn(流量被引流到某服务器上);在该服...

网友评论

      本文标题:APP被修改检测探索

      本文链接:https://www.haomeiwen.com/subject/fmspxdtx.html