吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4209|回复: 65
上一主题 下一主题
收起左侧

[Android 原创] 某Dong读书专业版校园ip身份认证Hook

  [复制链接]
跳转到指定楼层
楼主
wzvideni 发表于 2024-10-26 22:31 回帖奖励
本帖最后由 wzvideni 于 2024-10-26 23:12 编辑

前言:
不知道怎么回事,用了几年的看书软件突然要验证了,要正常的过验证得在相应校园的ip才行,我是几年前用测试码注册了一个绑定了手机号一直用到现在,自然是没法正常验证了,不知道有没有其他人遇到这种情况。

说实话这个软件的确很良心,突然不能用了有点难受,我在搜索了一番也没有找到解决方案,目前唯一的解决办法就是用HttpCanary重写相应验证的网络请求响应,但是得每次启动都把HttpCanary打开才行,麻烦但是能行。

看着剩余时间从15天到了现在的3天,每次打开都能看见这个验证,怎么彻底解决这个问题一直困扰着我,今天闲着的时候顿悟,我学了安卓开发,又学了安卓逆向,解决这个问题不是手到擒来,只可惜学逆向看的教程用的Hook方法和我想用的不一样就没上手练过,这次算是有机会给我练练了,就这么有了这篇记录。

验证提示截图:


分析:

由于之前用HttpCanary抓包分析了相应验证,就打算Hook相应验证的网络请求的方法,在验证前改写网络请求回调传入的参数。

首先身份验证请求的链接是:https://tob-api.jd.com/tob/api/college/user/verify/info……

返回的参数是json数据:{"data":{"need_verify":true,"verify_state":0,"start_prompt_time":1728884471000,"remain_verify_days":3},"result_code":0,"message":"SUCCESS"}

没有加密,意思也很明确了,改写need_verify和verify_state就可以了

现在就是怎么Hook相应的网络请求验证方法了

首先要先找到验证的方法,我通过搜索相应的数据类属性来查找的调用处,由于开发的时候通常都是这么写的,我想这个App应该也是这样,那么就用Jadx打开apk文件反编译代码,尽量搜索唯一的关键字,我选择的是start_prompt_time,直接搜start_prompt_time或者startPromptTime,直接搜start_prompt_time没有找到,搜startPromptTime就有了,如下图所示:


跳转过去后就看到数据类实体了,和网络请求返回的一样,如下图所示:


然后右键VerifyInfoEntity点击查找用例,找到这个实体类在哪被使用了,跳转后的截图如下:


很明显UserVerifySelectAction类中的内部类a的j方法就是身份验证的的网络请求回调,里面还有计算时间的代码,100%确定了。

代码位置找到了,现在就是编写lsposed模块来持久化Hook了,由于我学的Hook是跟着论坛里的教程学了,用的是java,但是我不想写java,又因为很久没写java不会写了,只会kotlin。

正好有大佬编写了一套Kotlin的Hook:YukiHookAPI,首先用YukiHookAPI构建工具创建了一个lsposed项目模板,再用Android Studio打开,边看文档和示例代码就开始写了,期间不会的就问chatgpt了,想不到chatgpt连安卓逆向也会,Ai真的太强大了

顺带用同样的方法把启动页给关掉了,每次启动都要等3秒,虽然显示的不是广告,但是和广告达到了同样的效果,让用户点跳过或者等3秒……,不过现在清爽了

最终核心代码20行不到,我之前还一直以为Hook会比开发要难,结果出乎我的意料,不过仔细想想,也是因为有各个大佬开发的框架,才可以这么便利的Hook,感谢大佬!

论坛的代码插入居然没有Kotlin,那就选java吧,实际上是Kotlin,核心代码如下:
[Java] 纯文本查看 复制代码
@InjectYukiHookWithXposed
class HookEntry : IYukiHookXposedInit {

    override fun onInit() = configs {
        configs {
            debugLog {
                tag = "JingDongReaderCampus"
                isEnable = true
                isRecord = false
                elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
            }
            isDebug = true
            isEnableModuleAppResourcesCache = true
            isEnableHookSharedPreferences = false
            isEnableDataChannel = true
        }
    }

    override fun onHook() = encase {

        loadApp(name = "com.jingdong.app.reader.campus") {

            // 注册模块 Activity 代{过}{滤}理
            onAppLifecycle {
                onCreate { registerModuleAppActivities() }
            }

            val headersClass by lazyClass("okhttp3.Headers")
            
            // Hook验证
            "com.jingdong.app.reader.main.action.UserVerifySelectAction\$a".toClass().apply {
                method {
                    name = "j"
                    param(IntType, headersClass, StringClass)
                }.hook {
                    before {
                        // 修改传入的参数 `str`
                        args[2] =
                            "{\"data\":{\"need_verify\":false,\"verify_state\":1,\"start_prompt_time\":1728884471000,\"remain_verify_days\":365},\"result_code\":0,\"message\":\"SUCCESS\"}"
                    }
                }
            }

            // Hook启动页
            "com.jingdong.app.reader.logo.action.GetSplashImageAction\$a".toClass().apply {
                method {
                    name = "j"
                    param(IntType, headersClass, StringClass)
                }.hook {
                    before {
                        // 修改传入的参数 `str`
                        args[2] =
                            "{\"data\":{\"has_adv\":false,\"name\":\"浙江大学的启动图\",\"pic_address\":\"https://img10.360buyimg.com/ebookadmin/jfs/t1/194181/34/42246/108158/655abb8cF1a52e14c/e9fe15f9f3072098.png.dpg\",\"jump_type\":0},\"result_code\":0,\"message\":\"SUCCESS\"}"
                    }
                }
            }
        }
    }
}


下载地址:

蓝奏云:https://wwur.lanzout.com/b0pm3gdza
密码:jdds

免费评分

参与人数 10吾爱币 +7 热心值 +10 收起 理由
52pojielogo + 1 + 1 我很赞同!
0qxqy0 + 1 + 1 我很赞同!
qianxungigi + 1 + 1 谢谢@Thanks!
jaffa + 1 谢谢@Thanks!
xys3 + 1 + 1 刚看,要求15天完成身份认证
夫子点灯 + 1 + 1 我很赞同!
helian147 + 1 + 1 热心回复!
laozhang4201 + 1 + 1 热心回复!
shengruqing + 1 我很赞同!
Issacclark1 + 1 谢谢@Thanks!

查看全部评分

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

推荐
Carinx 发表于 2024-10-28 09:15
wzvideni 发表于 2024-10-27 14:56
Kotlin真的很强大,用上了就不想用Java了,可以少写很多模板代码,还有很多语法糖,可以使代码更简洁明了 ...

Java最大的优势是发展这么多年的整体生态(当然这也容易导致太卷了),我记得kotlin最开始jetbrain是在java的基础上弄出来的,可以互相兼容,你要是说语法糖这些的话其实一般大家不会太在意这些,除非是这门语言有有一些本质上的优势,例如大家一说到性能就会第一时间考虑到C++,Rust,Go这些
推荐
不负韶华 发表于 2024-10-29 16:11
java, kotlin, Scala 这类语言有很多,是跑在jvm虚拟机上的,平常用的hotspot虚拟机是jvm的一个具体实现,编译器将.java或者.kt  编译成class字节码文件, 交由jvm运行。 甚至你都可以写一个语言,写一个编译器进行词法解析语法解析,处理文件头,常量池等,编译成jvm认识的字节码文件
沙发
mymon 发表于 2024-10-26 23:05
3#
 楼主| wzvideni 发表于 2024-10-26 23:09 |楼主
mymon 发表于 2024-10-26 23:05
大神牛,还需要登录吗?

没有Hook登录的身份认证,只Hook了登录后的需要校园IP的身份认证,还是需要登录的
4#
289051401 发表于 2024-10-26 23:09
确实免去验证过程方便多了
5#
kaka0000 发表于 2024-10-26 23:31
感谢大神分享,解决了我得大问题
6#
666888tzq 发表于 2024-10-26 23:34
大佬厉害。
7#
星落黎明 发表于 2024-10-27 00:13
这样没啥用吧,这只是把这个提示去掉了,不验证,后台应该会把账号的权限关了,后面可能会直接登录不上。
8#
RyesLai 发表于 2024-10-27 00:17
暂时还没遇到,先收藏备用
9#
Kzs 发表于 2024-10-27 00:39
大佬厉害
10#
guangyingcuojue 发表于 2024-10-27 00:50
厉害了这个
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-10-30 03:55

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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