app:识货v7.20.1

接口:https://sh-api.shihuo.cn/daga/search/goods/v1?minVersion=15670&clientCode=%7Bholder%7D

&v=7.20.1&channel=huawei&device=Pixel%203a&platform=android&timestamp=1684553856312&tok

en=c0df5113c555827f6e0c294b227d2b7b

解析流程

首先打开app,发现需要更新,我们先尝试一下断网进入,先清除缓存,在断网进入,发现可以过更新,但是好像抓不到包

image-20230520105956191

image-20230520110351724

先用jadx打开app进行反编译,看一下源码,先看下能不能过掉强制更新,搜索关键字版本,发现UpdateDialog方法是进行版本更新的主要方法,我们可以直接让这个方法返回为空,就可以过掉更新

image-20230520110601501

image-20230520110803831

使用frida hook UpdateDialog方法,不返回任何数据,可以直接过掉更新,需要注意的是,frida启动需要用spawn注入模式,因为更新是在app刚启动就进行了检测

image-20230520111044874

在操作app的时候,也是发现app有提示检测到在root环境下运行,我们可以尝试删除该app下的libmsaoaidsec.so文件,很多app都是基于jni操作c语言来进行root检测,这也是常见的反调试手段,打开mt管理器,找到该app下的lib目录,删除该文件

image-20230520113141447

抓包后,发现根本抓不到任何有用的包,有可能是未走系统代理

image-20230520113359191

我们用vpn转发的形式进行抓包,先关掉系统代理,打开SocksDroid,设置charles socks代理转发,再添加对应的app

image-20230520113625741

image-20230520113720956

这边就可以正常进行搜索抓包了

image-20230520113914636

我们先看下搜索接口,发现有很多参数,我们可以大胆尝试,去掉某些参数看一下是否能正常请求,结果测试,发现只要更改关键字,就可以获取到对应的返回数据,我用上一个包的请求参数,只更改关键字,即可获得对应的返回数据

image-20230520115344978

当我们点进商品详情页面是,我们会发现请求参数进行加密,返回参数也进行了加密,我们也可以再jadx里面搜索关键字查找该接口做了怎样的处理,也可以用另一种方法

image-20230520123007988

hook拦截器,我们再hook免更新的时候,再hook一下会启动哪些拦截器

image-20230520123447724

这有这几个拦截器,我们直接hook我们需要的接口会经过哪个拦截器

image-20230520123656369

当我们再第八个拦截器选择不进入当前拦截器的时候,该接口竟然明文发送,再看charles抓包,发现返回数据也是明文,有可能该接口存在两种请求方式,一种未加密也能够返回数据的情况,

image-20230520124159782

image-20230520124305891

我们直接把接口请求复制下来,再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
import requests

res = requests.get(
url="https://sh-gateway.shihuo.cn/v4/services/sh-goodsapi/app_swoole_shoe/preload/single",
params={
"devices": "M2007J17C",
"gender": "2",
# "goods_id": "1936942",
# "goods_id": "207340",
"goods_id": "610691",
"sourceLocation": "oneRowOne%3A%5BN%5D",
"tpExtra": "%7B%22sourceTp%22%3A%22home%3Asearch%3A%22%2C%22sourceTpName%22%3A%22gy0300%22%2C%22wsf%22%3A%22normal_search_words%22%2C%22ast%22%3A%22gy0300%22%2C%22is_inspire%22%3A0%2C%22fTp%22%3A%22searchList%3Alist%3A2%22%2C%22fTpName%22%3A%22%22%2C%22dgReqId%22%3A%22SHSS_CG-KRSE3HK0KRIM_SPU_1%3A6%22%2C%22sc%22%3A%22MAIN_SEARCH%22%2C%22si%22%3A%228001%22%2C%22skc%22%3A%2241583331%22%2C%22ffTp%22%3A%22home%3Asearch%3A%22%2C%22ffTpName%22%3A%22gy0300%22%2C%22layer%22%3A%222%22%2C%22fReqId%22%3A%224EFBF304E28B1C31128622D39F8C4CE0%22%7D",
"minVersion": "15670",
"clientCode": "%7Bholder%7D",
"v": "7.20.1",
"channel": "huawei",
"device": "M2007J17C",
"platform": "android",
"timestamp": "1668162743193",
}
)

data_dict = res.json()
for item in data_dict['data']['info']["styles"]['list']:
print(item['name'])
for k, v in item['priceAll'].items():
print("-----", k, v)

发现可以正常获取到鞋子的尺码信息,该app的接口都可以用明文的形式进行发送获取

image-20230520124916954

我们再去看一下源码,看一下加密参数和返回的加密数据是用什么方式做了加密,关于尺码的那个接口返回的参数里面带有dwlength字段,我们直接去源码里面搜一下,反编译未成功,找了半天,这里可能跟base64有关,我们去看一下Base64.decode方法

image-20230520153315992

我们直接hook一下这个方法,发现他的调用栈涉及到native层

image-20230520153847429

image-20230520153829309

我们回到刚刚未编译成功的那里,我们找一下.SwSdk.heracles方法,果然调用了native方法,对应的so文件时dusanwa.so

image-20230520154232072

image-20230520154601358

我们再mt管理器中,找到dusanwa.so,然后带着app用unidbg尝试调用

image-20230520155542929

先将基本信息填写好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ShiHuo() {
// 1.创建设备(32位或64位模拟器), 具体看so文件在哪个目录。 在armeabi-v7a就选择32位
emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.che168.autotradercloud").build();

// 2.获取内存对象(可以操作内存)
memory = emulator.getMemory();

// 3.设置安卓sdk版本(只支持19、23)
memory.setLibraryResolver(new AndroidResolver(23));

// 4.创建虚拟机(运行安卓代码需要虚拟机,就想运行py代码需要python解释器一样)
vm = emulator.createDalvikVM(new File("apks/shihuo/v7.20.1.apk"));
vm.setJni(this); // 后续so文件,如果没用调用java中的代码;调用java代码
//vm.setVerbose(true); // 内部so文件调用过程细节

// 5.加载so文件
DalvikModule dm = vm.loadLibrary(new File("apks/shihuo/libdusanwa.so"), false);
dm.callJNI_OnLoad(emulator);

// 6.dm代表so文件,dm.getModule()得到module对象,基于module对象可以访问so中的成员。
module = dm.getModule();

}

需要注意的是 由于加密的字符串过长,java没法传入这么长的字符串,我们可以可以创建一个StringBuilder,然后对加密的字符串进行切割,在放进去,最后再将对应需要补的环境补进去

image-20230520160339481

image-20230520160419748

运行没有问题,成功返回了结果,我们也可以对这个unidbg项目进行打包,打包出来用python调用

image-20230520160452427

打包文件架构:

image-20230520163254173

运行结果:

image-20230520163213435