吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10843|回复: 11
收起左侧

[Android 原创] Uni-App逆向分析

  [复制链接]
.KK 发表于 2021-6-11 21:05
本帖最后由 .KK 于 2021-6-12 11:37 编辑

Uni-App逆向分析

一般App数据加密分为Java层跟So层,但对于H5App来讲的话,它是界面里嵌入一个WebView,在WebView里显示网页,在网页里面用JS加密,在通过Java和JS交互,用Java提交数据或者直接用网页提交数据两种方式

判断App是否为H5App

可以利用uiautomatorviewer.bat 来查看界面信息
image-20210611180341592.png

JS代码存放位置

大多数H5App的JS文件都存放在assets目录,少部分会存在res目录,存放在这两个地方获取比较方便,放在别的地方比如classes.dex的话获取比较麻烦,并且对classes.dex还要做一个处理

还有一个点就是JS文件是可以加密的,只要在加载到WebView之前进行一个解密就行

WebView相关的几个关键词

setWebContentsDebuggingEnabled        // 是否允许调试
// shouldInterceptRequest、WebResourceResponse
public WebResourceResponse shouldInterceptRequest(WebView p0,String p1)        // 拦截器 jadx会反编译不出来建议用jeb或者gda 里面可以对js文件做一些处理
WebResourceResponse shouldInterceptRequest(WebView webView, WebResourceRequest webResourceRequest)
WebResourceResponse shouldInterceptRequest(WebView webView, String str)

远程调试 WebView

远程调试需要满足三个条件:

  1. Chrome WebView 版本要大于手机端 WebView 版本 (chrome更新到最新版就能解决)
  2. inspect 打开空白 则需要下载离线包
  3. 如果连 WebView 下的一些信息都没显示出来则代表你没有调试权限 setWebContentsDebuggingEnabled 这个的值必须为true才有调试权限,App发布一般都会把这个值设置成假不让你调试,直接Hook掉就行

image-20210611190514115.png

setWebContentsDebuggingEnabled 三个检测点:

image-20210611181930189.png

  1. chrome 浏览器调试 地址 chrome://inspect
  2. Devices下两个选项都勾选上
  3. 浏览器版本 > 手机端 WebView 版本
  4. 点击 WebView 下方的 inspect 开始调试

PS: 由于手机端 WebView 版本不一致,所以第一次运行需要从谷歌站点下载一系列的离线包,否者打开 DevTools 就是空白界面 (科学上网会自动下载)

Android远程调试WebView的方法

Android 设备WebView远程调试

逆向分析

1. Network 能抓到数据(网页发包)

inspect 开始调试 , 切换到 Network 选项卡抓取数据 如果有抓取到数据也为网页发包 否则就是Java层发包 这个app是网页发包的

image-20210611191516246.png

抓到的数据包 函数调用栈 接下来就是Js逆向分析 断点调试一顿分析就完事了

// 提交的数据
appid=quickdogrestful&mobile=139xxxxxxxx&password=a12345678&device_id=863254033385807%2C863254033385815&device_info=MI%206%20Xiaomi&app_version=1.0.3.4&nonce=a×tamp=1623410323.775&sign=573080b9042317ee8b30ab6411c9b56e


image-20210611191903160.png

image-20210611192104068.png

2. Network 无法抓到数据(不是网页发包)

这种大概率就是JS加密 然后Java发包的 就只能找参数静态分析了

// 抓包数据
POST //api/user/login.do HTTP/1.1
user-agent: Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36 uni-app Html5Plus/1.0 (Immersed/24.0)
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 138
Host: app168.zhongjianlepai.com
Connection: Keep-Alive
Accept-Encoding: gzip
Cookie: aliyungf_tc=b05125519e32b58949efe39018fbd902f0c0c052f4429ff19bd0ba4172416ff6; JSESSIONID=A8B840C693E48003233EE93EED504656; eiis-sessionid=3f17f8ce-4735-4670-ad2f-6036da767e52

phoneNum=139xxxxxxxx&pwd=a12345678&isTakecookie=false&appVersion=1.2.2×tamps=1623410775656&signature=21549323b5116195020eee9808de314b

解压App一顿分析 app-services.js  定位关键函数

image-20210611193327565.png

image-20210611193544533.png

修改为下面代码保存Js文件 然后覆盖进apk文件里 功能->APK签名->安装 再抓包

跟之前的URL对比 就可以查看我们提交的参数

r.login = function(t, e, s) {
 t["appVersion"] = a.default.APP_VERSION,
 i.default.request("/api/user/login.do?"+ JSON.stringify(t) + JSON.stringify(e) + JSON.stringify(s) , "POST", t, e, s)}

image-20210611194933472.png
image-20210611195023550.png
image-20210611200404944.png

POST //api/user/login.do?{%22phoneNum%22:%22139xxxxxxxx%22,%22pwd%22:%22a12345678%22,%22isTakecookie%22:false,%22showLoading%22:true,%22loaddingText%22:%22%E7%99%BB%E9%99%86%E4%B8%AD...%22,%22appVersion%22:%221.2.2%22}undefinedundefined HTTP/1.1

t  = {"phoneNum":"139xxxxxxxx","pwd":"a12345678","isTakecookie":false,"showLoading":true,"loaddingText":"登陆中...","appVersion":"1.2.2"}

e,s = undefined

这串数据提交还没有包含 signature  那就继续查找下一个关键点 全局搜索signature 查找关键函数 最后抓包对比

// 传进去的参数
{"phoneNum":"139xxxxxxxx","pwd":"a12345678","isTakecookie":false,"showLoading":true,"loaddingText":"登陆中...","appVersion":"1.2.2"}

// 经过排序加salt 放入n.default(i)处理MD5
appKey=syc0049ec3d91b9028&appVersion=1.2.2&phoneNum=139xxxxxxxx&pwd=a12345678×tamps=1623410775656&key=2e4dea7ba1dc4d1991cbcdd7756e548e

MD5:21549323b5116195020eee9808de314b

// 上面的抓包数据做对比
phoneNum=139xxxxxxxx&pwd=a12345678&isTakecookie=false&appVersion=1.2.2×tamps=1623410775656&signature=21549323b5116195020eee9808de314b

image-20210611201135413.png

image-20210611201835713.png

uni-app 核心请求

关键词 uni.request

image-20210611202633286.png

最后总结一下: Network 能抓包的话可以动态调式  分析起来方便一点 不然的话就只能 静态分析 + 猜测  修改H5代码 签名App抓包来分析

第一次发帖 记录一下自己的学习过程,有不对的地方还请大佬指正

免费评分

参与人数 3威望 +1 吾爱币 +23 热心值 +3 收起 理由
hu_sa + 2 + 1 我很赞同!
qtfreet00 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
chensu686 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

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

wildfire_810 发表于 2021-6-12 10:00
java转http访问为tcp,确实是一个防止采集的简单思路
a976606645 发表于 2021-6-12 10:41
zyy22664488 发表于 2021-6-12 11:04
zhangsf123 发表于 2021-6-16 23:11
加密混淆后的js代码很容易让人吐。下断点位置不是很容易。
IIce_ 发表于 2021-7-11 15:42
请问这个 setWebContentsDebuggingEnabled 怎么去 hook 呢
ts07 发表于 2022-7-24 14:46
像这种uniapp是怎么隐藏请求的?
jonswolf 发表于 2022-7-26 09:45
看不懂,大佬
buzhengchun 发表于 2022-7-26 13:53
感谢分享
shift1110 发表于 2022-9-23 09:13
慢慢学习,方法思路清晰
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-28 04:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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