这个国庆开始学安卓逆行APP,学了几天好像什么都没学,折腾了差不多两天的抓包,终于搞好了,贼难受,还有别的看视频的APP,很多都升级了,试着逆向都失败了,直到今天才成功第一个,那酸爽,不写下来记录,好像这个国庆什么都没干,那太亏了。所以直接莽!!!

1. 下载APP打开

需要搞的APP是 LV 的 APP,百度下载就可以了。
因为需要逆向出 x-wsse 参数的生成,所以需要配置好抓包,这里就不多说了。

一打开 APP,直接给我弹这个页面,瞬间懵逼。
破解或仿制设备不具备安全性

破解或仿制设备不具备安全性 ,因为我的手机是root过了,可能被检测到了,又或许我开了抓包什么的,检测到了 SSL 的,但是我关了抓包,还是不行,于是,我换了一台没有root过的手机,一打开直接就是正常的页面,于是,我懂了,应该是检测到我root了,二话不说,直接逆向,找出检测的代码。

2. 逆向找出检测的代码

我这里直接使用 JEB 和 android killer 逆向这个软件,这两个软件可以直接到 52破解 下载,这里就不多说了。

JEB 可以很方便地还原出JAVA代码,和原来的有点相似,方便查看,但是不能更改源码,所以使用 android killer 来改 smali 源码和回编译,或者直接用 android killer 来查看也行的,总之方便就行。

这里安卓逆向一般找出代码的地方都是搜索他给出的提示,所以这里直接搜破解或仿制设备不具备安全性即可。
破解或仿制设备不具备安全性

再根据这个 name 的值找出资源id,所以还是直接搜这个 name 的值 alert_rooted_device_text
0x7f120033

找到了这个 id 值,接下来就是找源码了,还是老办法直接搜这个id值,不过现在是在 JEB 上面搜,直接按 ctrl+F即可
JEB

可以看到,找到了,现在再按 tab 键,即可反编译回 java 源码

这里可以看到判断 arg7 的值再来决定是否获取我们上面这个资源的值,所以我们需要找这个方法被谁调用了,在JEB上很容易查看你,直接点击这个方法名,然后右击鼠标->点击交叉引用

这里可以看到只有一个地方引用,那直接点击这个函数即可,肯定是这个了。

这里看到是个onActivityResumed方法,这个是用于监控后台的,有点不太懂,不过也不需要太懂,直到会运行就可以了,这里我们再看看v0.a(v1)的这个方法,双击即可看到。

可以看到这里根据两个方法再来返回 false 或者 true,所以我们直接点击RRa.m(arg2)这个方法看看。

可以看到这里果然检测了我是否 root,这个/system/app/Superuser.apk/system/xbin/su 就是检测 root 的,test-keys 这个就不太懂了,知道的话可以留言告诉下哈。

所以这里这个方法我们直接给返回 0 即可,回到 android killer 直接搜上面的值就行修改

这里看到有两个地方了,都可以看看,或者再去 JEB 搜下看看

可以看到,这里也是检测有没有 root,所以二话不说,还是直接改就行了,直接把前面的值都给删除了,然后返回最后的值即可。

最后回编译,如果哦回编译失败,估计是遇到这个问题了,可以点击这个看看brut.common.BrutException: could not exec (exit code = 1

回编译成功之后,打开软件就可以看到了正常的页面了,逆向的第一步算是完成了,这个改的方法还有很多,比如可以直接在调用他们的方法那里直接改一个固定值即可,这里就自行测试了,接下来抓包看值。

3. 找出 x-wsse 的生成方法

x-wsse

现在要找这个值的生成地方,还是老办法,直接搜

这里可以看到这个值,还能看到我们抓包找到的 url,所以这个应该走不掉了,直接反编译会 java 源码看看

这里可以看到是一个接口,里面的 @ 是 java 的一个注解,如果不懂注解的可以看看这个教程:秒懂,Java 注解 (Annotation)你可以这样学

将上面的语句再改改,更加清晰

1
2
3
4
5
6
7
@ylb(value="api/v5.3/website-cache-catalog") 
pXa a(
@Blb(value="x-wsse")
String arg1,
@Llb(value="locale")
String arg2
);

这里有了三个注解,调用的方法是 pXa a() 、,所以再点交叉引用,就可以看到调用的地方,点击即可以看到

这个方法就是生成 x-wsse 的,再点击Maa.b.c() 这个方法,可以看到

抓包看到的,这里都能看到,更加断定是从这里生成了,再点击这个 Maa.a即可看到生成方法

再点击这里的两个方法,可以看到

第一个就是 digest 的nonce的生成方法,第二个就是生成的时间格式,再看看主要方法

这个就是主方法,参数是上面的nonce和时间,可以看到用了sha-512的加密方式,还有个盐:ks4Cphts57UMNx3H7NBQ3hZj,最后还用了 base64。

到此,就搞完了,现在就可以用自己常用的语言搞出来即可,我这里使用了 python 语言,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import hashlib
import base64
import random
import requests
from datetime import datetime
"""
LV 安卓 app 的请求头的 x-wsse 的生成方法
"""
arg1 = ''
for i in range(10):
ch = hex(random.randint(0, 0x100))
arg1 += ch[2:]

print(arg1)
arg2 = datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + 'Z'
print(arg2)
arg = arg1 + arg2 + "ks4Cphts57UMNx3H7NBQ3hZj"
data = hashlib.sha512(arg.encode('utf-8')).digest()
data_b64 = base64.b64encode(data).decode()
print(data_b64)

wsse = 'Token created=2019-10-06T15:15:50.995Z,digest={},nonce={}'.format(data_b64, arg1)
print(wsse)
headers = {
'x-wsse': wsse,
'User-Agent': 'LVapp/android/5.5 LVApp PRD',
'Host': 'pass.louisvuitton.com',

}

params = (
('locale', 'zh_CN'),
)

response = requests.get('https://pass.louisvuitton.com/api/v5.3/website-cache-catalog', headers=headers, params=params)
print(response.text)

最后,完毕,明天继续加油!