吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8490|回复: 14
收起左侧

[Android 原创] 基于Frida框架实现轮回X副本秒杀

[复制链接]
dwq308 发表于 2019-11-12 10:37
本帖最后由 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,回编译就是一波互相伤害;改大不行?那就改小吧,愉快的玩耍了一波,结果到第四章之后,后续乏力,没有了三星奖励,弃游了。现在准备学习il2cpp hook,又去找了回来,主要是懒得去找其他游戏的关键方法(我太难了)。
按照修改dll的经验,共用属性函数的时候,一般会在相同的类里有个用来区别的方法或者字段,少数没有。于是我就浏览了get_PhysicsAttack()方法的附近,看看有没有可以方法。最终定位到了public EUnitType get_nUnitType()(单元类型?),点击EUnitType进去看到了非常喜人的代码。
1.png        2.png


EUT_HERO = 1,EUT_NPC = 2,英雄代表1,NPC代表2,妥妥的重点啊。再次返回去get_PhysicsAttack()的类里面,看看有没有感兴趣的方法,找到了攻击和防御的方法,hook防御是做个不被怪物秒杀的保障。 3.png
然后打开PyCharm,参照https://blog.csdn.net/qq_19683651/article/details/84830335,依样画葫芦的捣鼓捣鼓,看似一坨屎的代码。
4.png
5.png
怀着忐忑的心情运行frida-server;
6.png
效果还算喜人:
7.png








免费评分

参与人数 5威望 +1 吾爱币 +12 热心值 +5 收起 理由
wxfhf520 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Lee28 + 1 谢谢@Thanks!
笙若 + 1 + 1 谢谢@Thanks!
hu1314 + 1 + 1 谢谢@Thanks!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

haolang 发表于 2021-1-21 13:05
xc159753 发表于 2019-11-18 12:21
现在确定是app侦测frida,只要一打开frida-server,app就会启动失败或断线,请问有办法躲避侦测吗?

这是最新版京东的检测代码,知道怎么做了吧?
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[0]).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 "";
        }
    }
}
haolang 发表于 2021-1-21 11:00
xc159753 发表于 2019-11-18 12:21
现在确定是app侦测frida,只要一打开frida-server,app就会启动失败或断线,请问有办法躲避侦测吗?

简单点的改frida名和端口号,对于遍历端口号发数据检测的,只能修改frida代码规避了。自己修改的,过了检测的frida一般不会拿出来分享的
青草幽幽在高原 发表于 2019-11-12 11:32
 楼主| dwq308 发表于 2019-11-12 11:51
青草幽幽在高原 发表于 2019-11-12 11:32
厉害厉害,敢问楼主是什么模拟器呢

http://mumu.163.com
wataxi 发表于 2019-11-12 15:27
厉害厉害
灵影 发表于 2019-11-12 15:34
这个东西好用不
涛之雨 发表于 2019-11-12 17:20
华为路过,貌似华为手机hook不了。。。
签名验证也hook不掉
莫莫 发表于 2019-11-13 10:27
大神 求[飞儿精品教程]虫虫联盟内训VIP 查尔斯教学视频 压缩包的密码 或者分享一下视频 谢谢
xc159753 发表于 2019-11-15 00:30
请问楼主有遇过 frida spawn 启动失败的吗?
https://www.52pojie.cn/thread-1055261-1-1.html
 楼主| dwq308 发表于 2019-11-17 12:34
xc159753 发表于 2019-11-15 00:30
请问楼主有遇过 frida spawn 启动失败的吗?
https://www.52pojie.cn/thread-1055261-1-1.html

一般这种情况建议换个模拟器试试,或者用真机试试?
xc159753 发表于 2019-11-18 12:21
dwq308 发表于 2019-11-17 12:34
一般这种情况建议换个模拟器试试,或者用真机试试?

现在确定是app侦测frida,只要一打开frida-server,app就会启动失败或断线,请问有办法躲避侦测吗?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-24 22:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表