声明
以下只是搬运下我公众号的东西。很早就发过了。原帖地址:
前言
废话不多说,继续浇油app系列分析,也是某短视频app上的
图片发不出来
分析
下面这个是注册包,这注册登录界面咋看着像上一篇的app呀
登录包:
注册完了进入主页面,界面确实感觉跟系列1很像
返回没有加密,请求看着感觉挺简单的,就url里的几个加密参数了
1.开始分析url的加密参数
分析发现,请求头里我去掉任何一个参数,都会提示是签名验证失败
这种搞多了你就知道,就是用的整个请求头的hashmap作为原始字符加密,然后带上加密参数一起请求的,某宝就是这样的,你懂的,不展开说了
ok,开始代码分析
发现有数字壳,一顿操作后,一搜索其中一个关键词,我擦,这么简单?
准备用frida 跟下:
有对抗,刺激,终于不是那种很简单的了,突然有点兴趣,顺便说一句,我这个frida已经是魔改过的版本了,还能检测到,还是有点东西
(有关这个反调试对抗的,可以私信我,给你推荐一个大佬,是这方面的专家)
现在去做反调试分析已经来不及了,换用xposed,这里我选用lsposed
1.搭建xsposed环境
怎么配置lsposed到手机上我就不说了,网上资源太多了,之前也有大概的提过
打开as后,新建一个项目,选择empty activity之后,开始如下配置:
1.1. 配置xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.geek.myhook">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Myhook">
<activity android:name=".MainActivity" android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposedminversion"
android:value="88+" />
<meta-data
android:name="xposeddescription"
android:value="hook工具组--:geekbyte" />
</application>
</manifest>
1.2. 在gradle依赖里添加如下
compileOnly 'de.robv.android.xposed:api:82'
compile 'com.alibaba:fastjson:2.0.15.android'
添加完,点右上角的sync now,等待一会儿
1.3. 邮件app项目,创建一个assets
1.4. assets文件夹,添加文件xposed_init
这个文件名固定为【xposed_init】,表示是xposed的入口文件,内容写上你的自己的类名(这个类名就是自己编写的hook类,必须保证类名一致)
也可以编写完hook类后再执行此步,我习惯先执行这一步,免得后面开发完忘记这一步
2.编写hook逻辑
在java文件夹,右键,创建 【Java class】,名字随意,但要跟xposed_init的一致,不然无法进入hook逻辑
创建完就如上,后面写上implements IX tab键补充选如下
然后放到标红的地方,alt+enter键,选择补齐方法:
然后就会自动出现如下
再写个if逻辑,只对目标app执行hook操作:
里面的就是你的逻辑代码了
因为这个app是有壳的,所以要先用下面的代码,找到实际的classloader
Class<?> ActivityThread = XposedHelpers.findClass("android.app.ActivityThread", lpparam.classLoader);
XposedBridge.hookAllMethods(ActivityThread, "performLaunchActivity", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Object mInitialApplication = (Application) XposedHelpers.getObjectField(param.thisObject, "mInitialApplication");
ClassLoader realClassloader = (ClassLoader) XposedHelpers.callMethod(mInitialApplication, "getClassLoader");
// 实际的逻辑
}
});
才能进行hook逻辑
好的,环境整好了
3.在搭建环境的同时
unpack完看就是这些,卧槽,这个混淆有点东西啊
4.开始分析
还是刚才搜到的这里 ,
根据调试,发现并没有走这个逻辑。有点某宝的意思啊,直接能搜到,静态看代码逻辑感觉也很像,一hook发现并没有走到这里
还是看下抓包工具的结果
翻了几页,发现那几个加密参数就没变过,但也不敢托大,我又搜了下url的,因为这几个参数是跟url拼接的,搜【user_search】
最后跟逻辑跟到这里:
5.写hook代码
先找到这个两个类:
hook那两个类:
安装到手机上,打开lsposed,点下这个
然后杀死目标app,再启动目标app,
as里的日志,选到你安装的手机,然后我习惯这么配置:
app往下拉,翻个页,日志就打印出来了,下面这个url就是我们的目标url
但是他还没拼接好,说明那几个加密参数还在后面的逻辑,继续看:
跳了好几层get,然后到这里
再借助lsposed,发现,实际的拼接在这里,
hook的日志显示,就是这个checkrequest方法做了url拼接,所以逻辑就是这里了
刺激
再看这个方法的参数:
我感觉这个caller的对象嫌疑很大,光标放上去,看到他就调用了两次自己的方法,直接对这两个方法hook下:
对比下,这个不太好看
放到文本编辑器里,对比,
其他都有了,就最后4个没有,那这加密还在后面的逻辑
打下调用栈看看:
Log.e(TAG, "Stack:", new Throwable("Stack dump"));
也没发现啥有用的
这就尴尬了,继续看逻辑,光标点中【url】,看跟url有关的操作,发现了如下这个:
感觉有点可疑,追进去:
卧槽,进到了native,hook验证下,果然是了:
把它拿出来看看,果然是,传的第二个参数是没有加密的url,返回就是有加密的url了
终于遇到个加密在native层的浇油app了,
6.native层分析
ok,进入native层分析了,根据app展示的
打开ida小姐姐,拖进libutil.so,很快就找到这个方法,静态注册的,挺好
这个是ts:
这个是ckey,dno
这里是h:
先按下键盘的反斜杠【\】,看着好点了:
再把参数改下,光标选中a1,按键盘【y】,改为【JNIEnv*】
选择ok之后,直接就看到ts的生成了,虽然猜到了是时间戳,但是有这个就100%确定了:
ckey也基本肉眼可见:
后面的几个也差不多,就省略了。
刺激!!!
我觉得挺简单的,为什么这么说,因为每次我打开,生成的加密参数都是固定的,也就是我如果为了拿数据的话,完全可以写死。
具体的算法还原细节,这里就不展开了,感兴趣的可以去看看白龙,龙哥的文章的算法还原部分。
验证
这都不用怀疑,肯定是可以的
结语
好啦,今天的系列完成,我截图的相册里还有好几张,换句话,后面还有好几个浇油app案例
geekbyte