载入源码后 冲第一个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]);
}
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!