声明:本教程仅用于学习交流,有任何侵权问题请联系本人删除
使用fiddler抓取某app登录接口的时候,没有看到任何相关的数据包,猜测app做了防抓包或者不走http协议,尝试proxyDroid、小黄鸟还是不行,最后使用Packet Capture成功抓到数据。看了下登陆接口提交的参数,不知道sign值是怎么来的,所以目标很明确,就是需要逆向分析sign的生成算法。
将apk文件拖到jadx中进行反编译,ctrl+shift+f 搜索关键词sign出来很多信息但没找到有用的,试试搜索"sign",仔细查看发现图示可疑位置,点进去看看。
看到图示内容,可以确定找对了地方,sign值是getSign方法执行后的结果,getSign方法中调用了SignManager类getSign方法,传入了三个参数,第一个参数不确定其值,第二个参数是token值,前面抓包发现这个值是空的,第三个值是时间戳,右击getSign跳到方法声明的地方。
加载so、通过native关键字定义了需要调用的方法getSign,也就是说,它这里调用的是so层的加密算法,so是什么?简单来说,它是c/c++编译后的产物。既然目标app能调用,那我们也可以。在搞之前,还有个参数不确定。这里就用jeb调试一下看看。
将apk拖到jeb中进行反编译,dex反编译成smali,我们可以调试这个smali代码, ctrl+f 搜索"sign", 找到getSign方法,ctrl+b下断点。
确保手机已root并且可调试,如果没有开启调试,到网上去下载相应的mprop, 使用adb推送到手机里,通过如下方法可以临时设置调试状态,这个方法是修改内存种得值,重启手机后恢复不可调试状态。如果你想要永久设置,到网上找相应的教程。然后可以通过adb连接手机,确保jeb可以识别到就行。
点击附加调试,选择需要调试的进程包名附加进程。
手机上输入账号密码点击登陆触发断点