载入源码后 冲第一个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直播授课