吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8213|回复: 35
收起左侧

[Android 原创] 使用Xposed绕过某加固的Xposed堆栈检测

  [复制链接]
XhyEax 发表于 2021-10-7 18:24

概述

更新某营业厅app(版本号7.4.0)后,发现加载Xposed模块会导致app crash。

通过分析Tombstone日志找到检测点,编写Xposed模块绕过堆栈检测。

日志分析

过滤Error级别的日志,得到以下信息:

A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x78c in tid 20120 (c10086.activity), pid 20120 (c10086.activity)
A/DEBUG: pid: 20120, tid: 20120, name: c10086.activity  >>> com.greenpoint.android.mc10086.activity <<<
A/DEBUG: uid: 10480
A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x78c
A/DEBUG: Cause: null pointer dereference
A/DEBUG:     r0  00000000  r1  ffb273e6  r2  0000078c  r3  b6a287de
A/DEBUG:     r4  c6049d88  r5  00000000  r6  00000000  r7  c6049d88
A/DEBUG:     r8  b6a287de  r9  0000078c  r10 f72255a0  r11 ffb284d0
A/DEBUG:     ip  f4c7d0a4  sp  00000000  lr  00000000  pc  0000078c
A/DEBUG: backtrace:
A/DEBUG:       #00 pc 0000078c  <unknown>
A/DEBUG:       #01 pc 00000000  <unknown>
E/tombstoned: Tombstone written to: /data/tombstones/tombstone_18

导出/data/tombstones/tombstone_18到电脑,查看内存(方法栈):

memory near r1 ([stack]):
    ffb273c4 00000305 00000017 000002f1 00000581  ................
    ffb273d4 f4c8125c 00000000 00000000 736f7078  \...........xpos
    ffb273e4 1d006465 00000000 43746567 7373616c  ed......getClass
    ffb273f4 656d614e 0000e400 72727563 54746e65  Name....currentT
    ffb27404 61657268 00f00064 53746567 6b636174  hread...getStack
    ffb27414 63617254 00000065 6176616a 6e616c2f  Trace...java/lan
    ffb27424 68542f67 64616572 0000f200 6a4c2928  g/Thread....()Lj
    ffb27434 2f617661 676e616c 7268542f 3b646165  ava/lang/Thread;
    ffb27444 00009d00 6a4c2928 2f617661 676e616c  ....()Ljava/lang
    ffb27454 7274532f 3b676e69 00004100 6176616a  /String;.A..java
    ffb27464 6e616c2f 74532f67 546b6361 65636172  /lang/StackTrace
    ffb27474 6d656c45 00746e65 000000ef 4c5b2928  Element.....()[L
    ffb27484 6176616a 6e616c2f 74532f67 546b6361  java/lang/StackT
    ffb27494 65636172 6d656c45 3b746e65 00005100  raceElement;.Q..
    ffb274a4 14765802 00000000 c6049d88 f4c8125c  .Xv.........\...
    ffb274b4 00000000 f72255a0 c6001aa5 31362f64  .....U".....d/61

首先通过java.lang.Thread.currentThread获得当前线程对象,然后调用getStackTrace获得StackTraceElement数组,遍历该数组,调用getClassName,判断是否包含xposed

定位

XposedHookThread.getStackTrace,打印调用栈(函数返回值):

findAndHookMethod(Thread.class, "getStackTrace", new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        StackTraceElement[] st = (StackTraceElement[]) param.getResult();
        String sts = "";
        for (StackTraceElement ste : st) {
            sts += ste.toString() + "\n";
        }
        Log.e("StackTrace", sts);
        super.afterHookedMethod(param);
    }
});

(如果要HookStackTraceElement.getClassName,打印返回值即可)

日志如下:

dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:1736)
java.lang.reflect.Method.invoke(Native Method)
de.robv.android.xposed.LspHooker.handleHookedMethod(Unknown Source:107)
LspHooker_.getStackTrace(Unknown Source:8)
java.lang.Runtime.nativeLoad(Native Method)
java.lang.Runtime.nativeLoad(Runtime.java:1131)
java.lang.Runtime.loadLibrary0(Runtime.java:1085)
java.lang.Runtime.loadLibrary0(Runtime.java:1008)
java.lang.System.loadLibrary(System.java:1664)
com.secneo.apkwrapper.AW.attachBaseContext(Unknown Source:17)

可以看到调用者是java.lang.Runtime.nativeLoad,即so加载时调用(在Native层通过JNI调用getStackTrace

分析

使用JEB反编译classes.dex,定位到com.secneo.apkwrapper.AW.attachBaseContext

@Override  // android.content.ContextWrapper
protected void attachBaseContext(Context context) {
    // ...
    AW.mC = context;
    System.loadLibrary("DexHelper");
    H.i();
    AW.ᵢ = this;
    super.attachBaseContext(context);
    // ...
}

可以看到加载的是libDexHelper.so(旧版本是在<clinit>加载,现在改到attachBaseContext了)

由so的加载流程可知,检测函数的调用要么是在JNI_OnLoad,要么是在.init.init_array

使用IDA动态调试,发现该加固是在JNI_OnLoad中调用检测函数(并非本文重点,就不详细介绍了)

由于最终还是要调用Java层的getClassName方法,考虑到通用性,决定编写Xposed模块,绕过堆栈检测

绕过

XposedHookStackTraceElement.getClassName方法,判断是否包含xposed,如果包含则替换返回值为android.os.Handler

注意:需要在DexHelper加载前Hook

findAndHookMethod(StackTraceElement.class, "getClassName", new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        String className = (String) param.getResult();
        if (className != null && className.contains("xposed")) {
            param.setResult("android.os.Handler");
        }
        super.afterHookedMethod(param);
    }
});

免费评分

参与人数 12吾爱币 +22 热心值 +8 收起 理由
KKBon + 1 我很赞同!
junjia215 + 1 + 1 用心讨论,共获提升!
浩哥呐 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
qtfreet00 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
5omggx + 1 用心讨论,共获提升!
笙若 + 1 + 1 谢谢@Thanks!
luiyi61 + 1 发一个我看不懂的绝对是原创
正己 + 4 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
独行风云 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
依旧_浅笑 + 1 + 1 热心回复!
天罗山堂 + 1 我很赞同!
vipiu + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

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

正己 发表于 2021-10-8 13:00
无闻无问 发表于 2021-10-8 07:04
dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java ...

这个是堆栈打印,as的logcat能输出,另外xposed、frida都可以打印堆栈
MT的注入能打印指定类指定方法的输出,但是没办法输出堆栈调用
我记得酷安有个logcat的软件,你可以试试

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
涛之雨 + 1 + 1 前排膜拜大佬

查看全部评分

无闻无问 发表于 2021-10-8 07:04
dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:1736)
java.lang.reflect.Method.invoke(Native Method)
de.robv.android.xposed.LspHooker.handleHookedMethod(Unknown Source:107)
LspHooker_.getStackTrace(Unknown Source:8)
java.lang.Runtime.nativeLoad(Native Method)
java.lang.Runtime.nativeLoad(Runtime.java:1131)
java.lang.Runtime.loadLibrary0(Runtime.java:1085)
java.lang.Runtime.loadLibrary0(Runtime.java:1008)
java.lang.System.loadLibrary(System.java:1664)
com.secneo.apkwrapper.AW.attachBaseContext(Unknown Source:17)


大神,这些日志是怎么打印的,工具还是什么?求指教,求分享!

我用mt注入,没这种函数执行流程…

点评

本文使用的是Xposed,通过编写Xposed模块,打印堆栈。 也可以使用Frida实现。 如果只关注app函数的话,可以考虑基于smali注入实现堆栈打印。 对于系统函数则需要使用Hook框架或自定义ROM(太重了,不推荐)。  发表于 2021-10-8 13:21
这个是堆栈打印,as的logcat能输出,另外xposed、frida都可以打印堆栈 MT的注入能打印指定类指定方法的输出,但是没办法输出堆栈调用 我记得酷安有个logcat的软件,你可以试试  详情 回复 发表于 2021-10-8 13:00
vipiu 发表于 2021-10-7 18:29
delta314 发表于 2021-10-7 18:54
电信营业厅也打不开,xp冲突,不知道是不是手机问题
delta314 发表于 2021-10-7 18:59
确实是好帖子,不过对于小白来说还有点难啊,目前所知,好些个银行类的装了xp也是进不去
木子小每文 发表于 2021-10-7 20:16
大老牛逼了~~~~~~
咔c君 发表于 2021-10-7 22:01
不错学习了
asdfliuchen 发表于 2021-10-7 22:29
大神,嘀嗒出行也检测了,能不能帮忙出个防嘀嗒检测的工具。
goda 发表于 2021-10-7 23:32
谢谢分享,学习了
凛冬已至 发表于 2021-10-8 00:41
大佬能给成品吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 13:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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