好友
阅读权限 10
听众
最后登录 1970-1-1
本帖最后由 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。但是又出现使用了代{过}{滤}理,也不能进入,一想还没开代{过}{滤}理啊,哦,原来开始的时候把这个判断也取反了,然后改过来即可。
最后可以进入软件,但是一直在加载,估计后台是挂的。
第一次在吾爱上发东西,对编辑器啥的也非常不熟悉,还请各位师傅多多指教!谢谢!
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。