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

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3029|回复: 32
收起左侧

[Android 原创] 某TV逆向初探

  [复制链接]
hjsz 发表于 2023-11-28 17:24
本帖最后由 hjsz 于 2023-11-28 17:25 编辑

某TV逆向初探

读了这篇博客https://www.52pojie.cn/thread-1739315-1-1.html,也想找个这种试试,于是就问了位朋友,告诉我哪里好找这种app。于是就随便找了个,后来才发现这个app应该是被启用的了。没事,至少过程中可以学到东西。

探索

  • 首先看了Androidmanifest文件,知道了splashActivity是启动activity,在别的app也经常看到这个activity,但是一般是广告。
  • 然后看一下登录这一类的activity,看看能不能找到api请求的URL,然后在绑定电话的activity中看到了下面这个函数
    ` f (valueOf != null) {
    trim = StringsKt__StringsKt.trim((CharSequence) valueOf);
    String obj = trim.toString();
    ClearAbleEditText etvalidate = (ClearAbleEditText) $_findCachedViewById(R.id.et_validate);
    Intrinsics.checkNotNullExpressionValue(et_validate, "et_validate");
    String valueOf2 = String.valueOf(et_validate.mo46getText());
    if (valueOf2 != null) {
    trim2 = StringsKt__StringsKt.trim((CharSequence) valueOf2);
    String obj2 = trim2.toString();
    if (TextUtils.isEmpty(obj)) { // obj是手机号,obj2是验证码
    ToastUtils.c("请填写手机号码", new Object[0]);
    return;
    } else if (TextUtils.isEmpty(obj2)) {
    ToastUtils.c("请填写验证码", new Object[0]);
    return;
    } else {
    com.niming.weipa.f.c.b().f(obj, obj2, new b().setLoadingListener(this, "绑定中")); // 一个是手机号一个是验证码,f是验证函数
    return;
    }
    }
    throw new NullPointerException("null cannot be cast to non-null type kotlin.CharSequence");
    }
    throw new NullPointerException("null cannot be cast to non-null type kotlin.CharSequence");

    - 然后根据请求的逻辑找到了所有网络请求的定义位置。然后想着先看看网址http://app.dylite.ipx.mx ,但是这个网址挂了。然后就想着试试还能不能进app,估计不能了,这类app经常跑路的。下面只是部分实例,格式不太好,见谅~

`

public void p(String str, a aVar) {
    ((PostRequest) ((PostRequest) e.e.a.b.f(b("/user/data")).tag("relationDo")).params("code", str, new boolean[0])).execute(aVar);
}

public void q(int i, a aVar) {
    ((PostRequest) ((PostRequest) ((PostRequest) e.e.a.b.f(b("/message/index")).tag("msgList")).params("page_size", 20, new boolean[0])).params("page", i, new boolean[0])).execute(aVar);
}

            public String b(String str) {
    String c2 = h.a().c(com.niming.weipa.c.a.n);
    if (!TextUtils.isEmpty(c2)) {
        return c2 + f5050b + str;
    }
    return "http://app.dylite.ipx.mx" + f5050b + str;
}
  • 安装应用后提示已经root,无法打开。然后搜索相关关键词,找到splashactivity中的关键代码。

            private final void K() {
    LogUtils.b("niming", "===AppUtils.isAppRoot():" + com.blankj.utilcode.util.c.r() + " DeviceUtils.isDeviceRooted() " + w.q());
    if (!A() && !m.a(this.activity)) {
        if (a((Context) this)) {
            h("检测到您使用了代{过}{滤}理软件,不允许继续使用");
            return;
        }
        h.a().a(com.niming.weipa.c.a.n, "");
        x();
        return;
    }
    h("检测到您使用的是模拟器或者设备已经root,不允许继续使用"); }

饶过上面的检测

  • 首先想到是修改smali,正如上面代码对应的,smali代码中也有三个if判断,开始想的是直接将三个判断改为相反的,但是改完之后发现还是会走到最后的Dialog代码,就感觉第一个if中的两个条件不一定都要取反才可以。

    .line 3

    invoke-direct {p0}, Lcom/niming/weipa/ui/splash/SplashActivity;->A()Z

    move-result v0

    if-nez v0, :cond_56

    iget-object v0, p0, Lcom/niming/framework/base/BaseActivity;->activity:Landroid/app/Activity;

    invoke-static {v0}, Lcom/niming/weipa/utils/m;->a(Landroid/content/Context;)Z

    move-result v0

    if-eqz v0, :cond_3b

    goto :goto_56

    .line 4
    :cond_3b
    invoke-direct {p0, p0}, Lcom/niming/weipa/ui/splash/SplashActivity;->a(Landroid/content/Context;)Z

    move-result v0

    if-eqz v0, :cond_47

`

  • 然后不想挨个试了,其实就两个条件,挨个试也可以。但是咱不是跟正己老师学了frida嘛,那就试一下。
  • 直接用jadx右键:复制为frida片段。依次将两个函数:A()m.a(**this**.activity) 复制为frida函数,查看其返回值。
    • 先使用frida-ps -U查看要hook的进程名。然后使用frida -U -f 进程名 -l hook.js,进行hook。这里使用Spawn模式的时候一直失败。
function h4(){
    let SplashActivity = Java.use("com.niming.weipa.ui.splash.SplashActivity");
    SplashActivity["A"].implementation = function () {
        console.log('A is called');
        var ret = this.A();
        console.log('A ret value is ' + ret.toString());
        return false;

    };
    let m = Java.use("com.niming.weipa.utils.m");
    m["a"].overload('android.content.Context').implementation = function () {
    let ret = this.a(null);
    console.log('a ret value2 is ' + ret);
    return ret;
};
}

function main() {
    Java.perform(function () {
        h4();
    });
}
setImmediate(main);
  • 根据返回值,果然都不能把if判断取反,然后就直接用frida修改A()函数的返回值为False。但是又出现使用了代{过}{滤}理,也不能进入,一想还没开代{过}{滤}理啊,哦,原来开始的时候把这个判断也取反了,然后改过来即可。
  • 最后可以进入软件,但是一直在加载,估计后台是挂的。

第一次在吾爱上发东西,对编辑器啥的也非常不熟悉,还请各位师傅多多指教!谢谢!

免费评分

参与人数 14吾爱币 +19 热心值 +12 收起 理由
13169382628 + 1 + 1 用心讨论,共获提升!
aabbcc123123 + 1 + 1 谢谢@Thanks!
wdo1106 + 1 我很赞同!
abacteria + 1 + 1 谢谢@Thanks!
tianyu925 + 1 我很赞同!
sht281 + 1 + 1 谢谢@Thanks!
debug_cat + 1 + 1 谢谢@Thanks!
theStyx + 1 + 1 谢谢@Thanks!
安道尔的鱼 + 1 + 1 我很赞同!
yjn866y + 1 + 1 谢谢@Thanks!
junjia215 + 1 + 1 用心讨论,共获提升!
Arcticlyc + 2 我很赞同!
1MajorTom1 + 1 热心回复!
正己 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

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

正己 发表于 2023-11-28 21:31
代码块包裹有点问题哦,修改一下,然后其实直接hook那个K方法就行,让他置空就好了

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
boor100 + 1 + 1 我很赞同!

查看全部评分

yyzzy 发表于 2023-11-28 21:53
eijop252023 发表于 2023-11-28 22:57
zjh889 发表于 2023-11-29 00:14
有直播的,就好了!
不会想象的明天 发表于 2023-11-29 00:28
真的学习到了…这算是初级教学了
lyd2004888 发表于 2023-11-29 06:07

谢谢楼主
feifei1255 发表于 2023-11-29 07:44
看了不会弄
lukbinx 发表于 2023-11-29 07:59
学习学习
wanzm 发表于 2023-11-29 08:38
学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

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

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

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

GMT+8, 2024-4-27 18:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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