基于Frida框架实现轮回X副本秒杀
本帖最后由 dwq308 于 2019-11-12 10:53 编辑最近在学习il2cpp hook,看到网上的FRIDA比较火,也去跟风尝试,经过一番摸索,也捣鼓出了一个看起来像个样子的东西。
样本是很久之前坛友发的https://www.52pojie.cn/thread-733757-1-1.html,顺着在九游下了一个最新版的来玩耍,按照帖子的指示,定位到关键函数,然后就是FF 05 A0 E3 1E FF 2F E1,回编译就是一波互相伤害{:1_896:};改大不行?那就改小吧,愉快的玩耍了一波,结果到第四章之后,后续乏力,没有了三星奖励,弃游了。现在准备学习il2cpp hook,又去找了回来,主要是懒得去找其他游戏的关键方法(我太难了)。
按照修改dll的经验,共用属性函数的时候,一般会在相同的类里有个用来区别的方法或者字段,少数没有。于是我就浏览了get_PhysicsAttack()方法的附近,看看有没有可以方法。最终定位到了public EUnitType get_nUnitType()(单元类型?),点击EUnitType进去看到了非常喜人的代码。
EUT_HERO = 1,EUT_NPC = 2,英雄代表1,NPC代表2,妥妥的重点啊。再次返回去get_PhysicsAttack()的类里面,看看有没有感兴趣的方法,找到了攻击和防御的方法,hook防御是做个不被怪物秒杀的保障。
然后打开PyCharm,参照https://blog.csdn.net/qq_19683651/article/details/84830335,依样画葫芦的捣鼓捣鼓,看似一坨屎的代码。
怀着忐忑的心情运行frida-server;
效果还算喜人:
xc159753 发表于 2019-11-18 12:21
现在确定是app侦测frida,只要一打开frida-server,app就会启动失败或断线,请问有办法躲避侦测吗?
这是最新版京东的检测代码,知道怎么做了吧?;www
package com.jdjr.risk.device.util;
import android.app.ActivityManager;
import android.content.Context;
import android.text.TextUtils;
import java.lang.reflect.Modifier;
import java.util.List;
public class l {
public static String a() {
String str = "";
try {
ClassLoader.getSystemClassLoader().loadClass("de.robv.android.xposed.XposedHelpers").newInstance();
} catch (IllegalAccessException | InstantiationException unused) {
str = "XposedBridge-hook";
} catch (ClassNotFoundException | Exception unused2) {
}
if (!str.equals("")) {
return str;
}
try {
ClassLoader.getSystemClassLoader().loadClass("de.robv.android.xposed.XposedBridge").newInstance();
return str;
} catch (IllegalAccessException | InstantiationException unused3) {
return "XposedBridge-hook";
} catch (ClassNotFoundException | Exception unused4) {
return str;
}
}
public static String a(Context context) {
if (!TextUtils.isEmpty((CharSequence) null)) {
return null;
}
String b = b();
if (!TextUtils.isEmpty(b)) {
return b;
}
String c = c();
if (!TextUtils.isEmpty(c)) {
return c;
}
String b2 = b(context);
if (!TextUtils.isEmpty(b2)) {
return b2;
}
String a = a();
if (!TextUtils.isEmpty(a)) {
return a;
}
String e = e();
if (!TextUtils.isEmpty(e)) {
return e;
}
String f = f();
if (!TextUtils.isEmpty(f)) {
return f;
}
String d = d();
return TextUtils.isEmpty(d) ? g() : d;
}
private static String b() {
String str = "";
try {
throw new Exception("Deteck hook");
} catch (Exception e) {
int i = 0;
for (StackTraceElement stackTraceElement : e.getStackTrace()) {
if ("com.android.internal.os.ZygoteInit".equals(stackTraceElement.getClassName()) && (i = i + 1) == 2) {
str = "saurik-hook";
}
if ("com.saurik.substrate.MS$2".equals(stackTraceElement.getClassName()) && "invoke".equals(stackTraceElement.getMethodName())) {
str = "saurik-hook";
}
if ("de.robv.android.xposed.XposedBridge".equals(stackTraceElement.getClassName()) && "main".equals(stackTraceElement.getMethodName())) {
str = "XposedBridge-hook";
}
if ("de.robv.android.xposed.XposedBridge".equals(stackTraceElement.getClassName()) && "handleHookedMethod".equals(stackTraceElement.getMethodName())) {
str = "XposedBridge-hook";
}
}
return str;
}
}
private static String b(Context context) {
String str = "";
try {
List<ActivityManager.RunningServiceInfo> runningServices = ((ActivityManager) context.getSystemService("activity")).getRunningServices(300);
if (runningServices != null) {
for (int i = 0; i < runningServices.size(); i++) {
if (runningServices.get(i).process.contains("fridaserver")) {
str = "frida-hook";
}
}
}
} catch (Exception unused) {
}
return str;
}
/* JADX WARNING: Code restructure failed: missing block: B:43:?, code lost:
r3.close();
*/
/* Code decompiled incorrectly, please refer to instructions dump. */
private static java.lang.String c() {
/*
java.lang.String r0 = ""
java.util.HashSet r1 = new java.util.HashSet // Catch:{ Exception -> 0x0088 }
r1.<init>() // Catch:{ Exception -> 0x0088 }
java.lang.StringBuilder r2 = new java.lang.StringBuilder // Catch:{ Exception -> 0x0088 }
r2.<init>() // Catch:{ Exception -> 0x0088 }
java.lang.String r3 = "/proc/"
r2.append(r3) // Catch:{ Exception -> 0x0088 }
int r3 = android.os.Process.myPid() // Catch:{ Exception -> 0x0088 }
r2.append(r3) // Catch:{ Exception -> 0x0088 }
java.lang.String r3 = "/maps"
r2.append(r3) // Catch:{ Exception -> 0x0088 }
java.lang.String r2 = r2.toString() // Catch:{ Exception -> 0x0088 }
java.io.BufferedReader r3 = new java.io.BufferedReader // Catch:{ Exception -> 0x0088 }
java.io.FileReader r4 = new java.io.FileReader // Catch:{ Exception -> 0x0088 }
r4.<init>(r2) // Catch:{ Exception -> 0x0088 }
r3.<init>(r4) // Catch:{ Exception -> 0x0088 }
L_0x002b:
java.lang.String r2 = r3.readLine() // Catch:{ Exception -> 0x0088 }
if (r2 == 0) goto L_0x0060
java.lang.String r4 = r2.toLowerCase() // Catch:{ Exception -> 0x0088 }
java.lang.String r5 = "frida"
boolean r4 = r4.contains(r5) // Catch:{ Exception -> 0x0088 }
if (r4 == 0) goto L_0x0040
java.lang.String r0 = "frida-hook"
goto L_0x0060
L_0x0040:
java.lang.String r4 = ".so"
boolean r4 = r2.endsWith(r4) // Catch:{ Exception -> 0x0088 }
if (r4 != 0) goto L_0x0050
java.lang.String r4 = ".jar"
boolean r4 = r2.endsWith(r4) // Catch:{ Exception -> 0x0088 }
if (r4 == 0) goto L_0x002b
L_0x0050:
java.lang.String r4 = " "
int r4 = r2.lastIndexOf(r4) // Catch:{ Exception -> 0x0088 }
int r4 = r4 + 1
java.lang.String r2 = r2.substring(r4) // Catch:{ Exception -> 0x0088 }
r1.add(r2) // Catch:{ Exception -> 0x0088 }
goto L_0x002b
L_0x0060:
java.util.Iterator r1 = r1.iterator() // Catch:{ Exception -> 0x0088 }
L_0x0064:
boolean r2 = r1.hasNext() // Catch:{ Exception -> 0x0088 }
if (r2 == 0) goto L_0x0085
java.lang.Object r2 = r1.next() // Catch:{ Exception -> 0x0088 }
java.lang.String r2 = (java.lang.String) r2 // Catch:{ Exception -> 0x0088 }
java.lang.String r4 = "com.saurik.substrate"
boolean r4 = r2.contains(r4) // Catch:{ Exception -> 0x0088 }
if (r4 == 0) goto L_0x007b
java.lang.String r0 = "saurik-hook"
goto L_0x0085
L_0x007b:
java.lang.String r4 = "XposedBridge.jar"
boolean r2 = r2.contains(r4) // Catch:{ Exception -> 0x0088 }
if (r2 == 0) goto L_0x0064
java.lang.String r0 = "XposedBridge-hook"
L_0x0085:
r3.close() // Catch:{ Exception -> 0x0088 }
L_0x0088:
return r0
*/
throw new UnsupportedOperationException("Method not decompiled: com.jdjr.risk.device.util.l.c():java.lang.String");
}
private static String d() {
try {
String b = i.b("ls /system/lib");
return !TextUtils.isEmpty(b) ? b.contains("xposed") ? "XposedBridge-hook" : "" : "";
} catch (Exception unused) {
return "";
}
}
private static String e() {
try {
return Modifier.isNative(Throwable.class.getDeclaredMethod("getStackTrace", new Class).getModifiers()) ? "XposedBridge-hook" : "";
} catch (NoSuchMethodException unused) {
return "";
}
}
private static String f() {
try {
return System.getProperty("vxp") != null ? "XposedBridge-hook" : "";
} catch (Exception unused) {
return "";
}
}
private static String g() {
try {
String str = System.getenv("CLASSPATH");
return !TextUtils.isEmpty(str) ? str.contains("XposedBridge") ? "XposedBridge-hook" : "" : "";
} catch (Exception unused) {
return "";
}
}
} xc159753 发表于 2019-11-18 12:21
现在确定是app侦测frida,只要一打开frida-server,app就会启动失败或断线,请问有办法躲避侦测吗?
简单点的改frida名和端口号,对于遍历端口号发数据检测的,只能修改frida代码规避了。自己修改的,过了检测的frida一般不会拿出来分享的 厉害厉害,敢问楼主是什么模拟器呢 青草幽幽在高原 发表于 2019-11-12 11:32
厉害厉害,敢问楼主是什么模拟器呢
http://mumu.163.com 厉害厉害 {:1_937:} 这个东西好用不 华为路过,貌似华为手机hook不了。。。
签名验证也hook不掉 大神 求[飞儿精品教程]虫虫联盟内训VIP 查尔斯教学视频 压缩包的密码 或者分享一下视频 谢谢 请问楼主有遇过 frida spawn 启动失败的吗?
https://www.52pojie.cn/thread-1055261-1-1.html xc159753 发表于 2019-11-15 00:30
请问楼主有遇过 frida spawn 启动失败的吗?
https://www.52pojie.cn/thread-1055261-1-1.html
一般这种情况建议换个模拟器试试,或者用真机试试? dwq308 发表于 2019-11-17 12:34
一般这种情况建议换个模拟器试试,或者用真机试试?
现在确定是app侦测frida,只要一打开frida-server,app就会启动失败或断线,请问有办法躲避侦测吗?
页:
[1]
2