hjsz 发表于 2023-11-28 17:24

某TV逆向初探

本帖最后由 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 et_validate = (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);
                  return;
                } else if (TextUtils.isEmpty(obj2)) {
                  ToastUtils.c("请填写验证码", new Object);
                  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)).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)).params("page", i, new boolean)).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模式的时候一直失败。

```jsx
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。但是又出现使用了代{过}{滤}理,也不能进入,一想还没开代{过}{滤}理啊,哦,原来开始的时候把这个判断也取反了,然后改过来即可。
- 最后可以进入软件,但是一直在加载,估计后台是挂的。

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

正己 发表于 2023-11-28 21:31

代码块包裹有点问题哦,修改一下,然后其实直接hook那个K方法就行,让他置空就好了

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

学习学习
页: [1] 2 3 4
查看完整版本: 某TV逆向初探