首页
社区
课程
招聘
[原创] NP签名校验分析
发表于: 2025-2-9 14:50 46468

[原创] NP签名校验分析

2025-2-9 14:50
46468

载入源码后 冲第一个activity开始分析

这段代码 会插入 到 你自己的activity上 这样就会运行 签名校验逻辑

我们跟进查看 c方法到底在干嘛

通过c方法 的返回值 来判断是否关闭app

在c方法啊内部 ,观察到 第一个方法 c是getPackageCodePath(); 获取apk在系统文件中路径

将路径传入 g方法中

这g方法内部最终调用这个方法:

通过反射获取 android.content.pm.PackageParser 类

DisplayMetrics displayMetrics0 = new DisplayMetrics();

b.k(displayMetrics0);

这个代码我感觉没太大作用

紧接着就是 e方法

public static boolean c() {
for(int v = 0; true; ++v) {
if(v >= 2) {
for(int v1 = 0; v1 < 1; v1 = -(-1 - v1)) {
if(e.d(new String[]{"com.bug.fuck.fuck"}[v1])) {
return new int[2][6] == 0 ? true : true;
}
}

感觉是对 环境进行检测 之类的 继续分析

com.bug.fuck.fuck 对这个类进行反射 获取class 成功说明 存在这个框架

然后将 arm.SignerPro 这个值 传入 d方法 应该是检测 存在 arm去签名特征 也是通过反射 是否存在 这个框架的class

SandHook nativehook.NativeHook com.swift.sandhook 去检测这些框架是否存在 也是获取 class

接下来 回到第二个方法

俩 来看 b方法

public static boolean b(String s) {
File file0 = new File(c.v(new File(s)), "lib");
ArrayList arrayList0 = new ArrayList();
arrayList0.add("libsandhook");
arrayList0.add("libarm");
arrayList0.add("libmthook");
arrayList0.add("libSub");
if(!b.g(file0)) {
return false;
}

传入的是 apk的路径

这里的意思就很明确了 检查 lib路径目录中是否包含hook框架so

arrayList0.add("libsandhook");
arrayList0.add("libarm");
arrayList0.add("libmthook");
arrayList0.add("libSub");

环境 检测完毕 开始提取 apk的签名文件 转为 字符串 返回 计算 hash 值之类的 验证了3次

在 后面 还有最后一个验证

c.aa(context0).sourceDir; 在这个代码上 就返回 apk的位置

e.j(context0); 返回包名

盲猜这里就是验证apk的路径 是否被替换

这里的检测 也就

对 文件路劲 末尾是否是 base.pak

对文件路径 上一级 文件名 是否以包名开头

对文件路径 上一级 文件名 不等于 包名长度

检测路径是否以 /data/app/ 开头

检测路径 "/" 数量 是否超过4个

对抗方法:

1.io重定向
2. appinfo proxy 代理
3.把hook框架隐藏即可

if(!c.c(this)) {
    System.exit(0);
    this.finish();
    return;
}
if(!c.c(this)) {
    System.exit(0);
    this.finish();
    return;
}
public static boolean c(Context context0) {
    String s = i.g(i.c(context0));
    boolean z = g.b("245016634") == (0x28D876 ^ c.s(s));
    boolean z1 = g.b("1121103333") == c.s(j.f(s, 5));
    boolean z2 = g.b("404866137") == c.s(f.b(f.b(s)));
    boolean z3 = c.q(context0);
    if(z && z1) {
        return z2 ? z3 : false;
    }
 
    return false;
}
public static boolean c(Context context0) {
    String s = i.g(i.c(context0));
    boolean z = g.b("245016634") == (0x28D876 ^ c.s(s));
    boolean z1 = g.b("1121103333") == c.s(j.f(s, 5));
    boolean z2 = g.b("404866137") == c.s(f.b(f.b(s)));
    boolean z3 = c.q(context0);
    if(z && z1) {
        return z2 ? z3 : false;
    }
 
    return false;
}
public static String b(String s) {
    try {
        Class class0 = a.o("android.content.pm.PackageParser");
        DisplayMetrics displayMetrics0 = new DisplayMetrics();
        b.k(displayMetrics0);
        if(!a.e() && !a.b(s)) {
            if(Build.VERSION.SDK_INT <= 20) {
                Object object0 = c.m(c.x(class0, new Class[]{String.class}), new Object[]{s});
                Object object1 = a.g(b.d(class0, "parsePackage", new Class[]{File.class, String.class, DisplayMetrics.class, Integer.TYPE}), object0, new Object[]{new File(s), s, displayMetrics0, c.ae(0x40)});
                a.g(b.d(class0, "collectCertificates", new Class[]{a.k(object1), Integer.TYPE}), object0, new Object[]{object1, c.ae(0x40)});
                return b.h(((Signature[])a.m(b.m(a.k(object1), "mSignatures"), object1))[0]);
            }
 
            Object object2 = c.m(c.x(class0, new Class[0]), new Object[0]);
            Object object3 = a.g(b.d(class0, "parsePackage", new Class[]{File.class, Integer.TYPE}), object2, new Object[]{new File(s), c.ae(0x40)});
            if(Build.VERSION.SDK_INT < 28) {
                a.g(b.d(class0, "collectCertificates", new Class[]{a.k(object3), Integer.TYPE}), object2, new Object[]{object3, c.ae(0x40)});
                return b.h(((Signature[])a.m(b.m(a.k(object3), "mSignatures"), object3))[0]);
            }
 
            Method method0 = b.d(class0, "collectCertificates", new Class[]{a.k(object3), Boolean.TYPE});
            boolean z = Build.VERSION.SDK_INT > 28;
            a.g(method0, object2, new Object[]{object3, c.k(z)});
            Field field0 = b.m(a.k(object3), "mSigningDetails");
            b.l(field0, true);
            Object object4 = a.m(field0, object3);
            Field field1 = b.m(a.k(object4), "signatures");
            b.l(field1, true);
            return b.h(((Signature[])a.m(field1, object4))[0]);
        }
    }
    catch(Exception exception0) {
        e.f("getAPKSignatures", b.p(exception0));
        e.n(exception0);
    }
 
    return null;
}
public static String b(String s) {
    try {
        Class class0 = a.o("android.content.pm.PackageParser");
        DisplayMetrics displayMetrics0 = new DisplayMetrics();
        b.k(displayMetrics0);
        if(!a.e() && !a.b(s)) {
            if(Build.VERSION.SDK_INT <= 20) {
                Object object0 = c.m(c.x(class0, new Class[]{String.class}), new Object[]{s});
                Object object1 = a.g(b.d(class0, "parsePackage", new Class[]{File.class, String.class, DisplayMetrics.class, Integer.TYPE}), object0, new Object[]{new File(s), s, displayMetrics0, c.ae(0x40)});
                a.g(b.d(class0, "collectCertificates", new Class[]{a.k(object1), Integer.TYPE}), object0, new Object[]{object1, c.ae(0x40)});
                return b.h(((Signature[])a.m(b.m(a.k(object1), "mSignatures"), object1))[0]);
            }
 
            Object object2 = c.m(c.x(class0, new Class[0]), new Object[0]);
            Object object3 = a.g(b.d(class0, "parsePackage", new Class[]{File.class, Integer.TYPE}), object2, new Object[]{new File(s), c.ae(0x40)});
            if(Build.VERSION.SDK_INT < 28) {
                a.g(b.d(class0, "collectCertificates", new Class[]{a.k(object3), Integer.TYPE}), object2, new Object[]{object3, c.ae(0x40)});
                return b.h(((Signature[])a.m(b.m(a.k(object3), "mSignatures"), object3))[0]);
            }
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 1449
活跃值: (2716)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
问题来了~如何把hook框架隐藏
2025-2-10 15:27
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
hacker521 问题来了~如何把hook框架隐藏
不是已经给出来案例了吗?
2025-2-10 15:32
0
雪    币: 3203
活跃值: (3937)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
hacker521 问题来了~如何把hook框架隐藏
你自己魔改一下 编译框架 名字 就行了
2025-2-10 16:25
0
雪    币: 2252
活跃值: (2684)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可以直接分析一下NP的本体签效
2025-2-12 13:32
0
游客
登录 | 注册 方可回帖
返回