样本:aHR0cHM6Ly93d3cuYWxpeXVuZHJpdmUuY29tL3MvTmgxazNqbjU1WXM=
观前提示:
本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除
0x1 加密位置分析
打开app 发现无法连接服务器 一般认为是证书验证了 随便网上找个hook脚本就行了 或者用justtrustme也行
先抓包找到log-in.html
看post data有password和sign是被加密的
打开java-gui找
全局搜索一下log-in.html
只有一个结果 双击跳转过去
双击进来
能看到password的加密是调用native方法
往下滑可以看到
可以看到是加载了NativeHelper 也就是libNativeHelper.so
这就是password的加密位置了
还有一个sign参数
回到上层界面 找到buildRequestParams
进入super.buildRequestParams方法
进来之后 再次进入super.buildRequestParams
从这里就能看到sign的加密位置了
进入AppNativeHelper.getServerApi方法
0x2 加密逻辑分析
ida打开libNativeHelper.so 先去导出表看看导出方法有没有含有JAVA开头的
没有就需要考虑动态注册了
找到JNI_OnLoad
进入off_1C044
这里就可以看到动态注册的函数名了 本篇文章 我就只以getServerApi作为示例
双击下面的sub_12794进入getServerApi 如果是loc开头的 则需要Edit->Functions->Create function 或者直接按P 创建
进入到sub_12794后就可以开始分析了 同时也可以通过rename和convert to struct
进到sub_125B0
这里我名字已经改好了 可以看到salt是通过取dword_16954来计算写进内存的 最后传入sub_4DF0
进入sub_4DF0 同样我已经改好变量名和有分析注释了
整体流程还是可以直观看出来的 这里的大概意思就是 开内存 写数据
接着就看这俩个方法了
进入sub_4538
熟悉的码表 不懂也可以百度搜一下这几个数值 是md5没错了
进入sub_4564 可以看到全是计算操作
再进入其中的一个sub_45F4
得了 不用继续看了 md5坐实 静态分析就先到此结束 上frida
0x3 hook
上面分析可知 这个so是一个简单的动态注册
需要hook的是sub_4DF0这个方法 写法就是
var libNativeHelper=Module.findBaseAddress("libNativeHelper.so"); var sub_4DF0=libNativeHelper.add(0x4DF0+1);
hook代码网上很多 基本可以照抄学习
从代码可以知
sub_4DF0(env, str, salt);
str是从java传入的 salt是so里面计算的
所以直接console的话是乱码的 需要转换一下
var String=Java.use('java.lang.String') console.log('str->',Java.cast(args[1],String)) console.log('key->',args[2].readCString())
写好hook代码就该测试一下啦
输出结果
str-> 1643530355352531084076641lXIjMLZ7qXY=123 salt-> ef2vx#sf*^FlklSD*9sdf(m$&qw%d7po
分割一下就是
1643530355 dateline 35253108407664 deviceIdentifier 1 info lXIjMLZ7qXY= password 123 username
手动拼接 md5加密一下
可以看到 结果一模一样 md5无魔改
完美撒花 感谢各位大佬观看
如有错误 还请海涵
共同进步
[完]