在某特上关注了一点乱七八糟的东西,然后就看到了这么一款app。无聊业余时间的时候爬取了一些福利app的数据,于是就想顺便看下这个东西的数据是否也可以爬取。
习惯性的打开HttpCanary抓包,目前一切正常。 数据都能获取到,既然要爬数据,肯定是要能够看到图片,这个是最起码的。 图片链接如下: https://ssimg.bdxxo.cn/tv_adult/avid5c33013611e90.jpg?k=0bf5566b1e365d4f0cf78f566269e769&t=1593571053 看到后面的k和t,忽然觉得这个东西可能没这么简单,应该是服务器进行访问校验了,先不管这个,直接访问下看看。 这个,尼玛,厉害了。带着key和token访问直接返回了个黑窗口(如果时间超过了链接中的t参数表示的时间,那么直接就403了)。 把图片下载下来,拉入010,果然是加密处理了。 没有找到图片文件的文件头,所以浏览器或者图片查看器也就没有办法解析这个图片。 如何解析图片,那就要从apk入手进行分析了。最终在package net.idik.lib.cipher.so;下面找到了可疑的key和iv:
通过交叉引用,可以定位到图片解密代码位于com.ilulutv.fulao2.other.g.b:
配置jeb调试器,如果不修改ro.debuggable 直接附加进程,会出现下面的错误信息: 确定之后就直接失败了: 修改安卓的ro.debuggable属性可以通过magisk 或者mprop([https://bbs.pediy.com/thread-215311.htm]),当然也有其他的办法,修改boot.img等等。不幸的是,我在夜神模拟器上安装magisk之后,卡在了检查更新上,没有办法继续安装。知道原因的还望不吝赐教。 另外一个办法,就是通过mprop修改,下载之后,直接运行对应的bat文件即可。 需要注意的是,运行完脚本之后需要重新打开apk,否则依旧无法进行附加。 附加之后,向下滚动页面加载内容。此时断点就断下来了。 单步执行到00000014 invoke-direct SecretKeySpec-><init>([B, String)V, v1, p0, v2 这一行就可以看到具体的key和iv的值了。 默认的jeb的局部变量类型全部为int,可以根据代码来修改变量类型,这里两个参数的类型都是B[,修改之后就可以看到具体的数值了, 如下: 比较蛋疼的一点是,jeb直接复制的变量的值是下面的格式:
鉴于net.idik.lib.cipher.so的目录下的key比较多,并且key包含不可打印字符,直接复制数值也比较蛋疼。 此时frida hook就派上用场了:
由于该函数的key和为是一个byte数据,所以直接通过send函数发送。接收到的数据是个Image_iv:[object Object] 无法正常显示,所以上面的代码对数据进行了base64编码之后发送。 实际接收到的数据为:
有了这两个数据就可以去解密图片内容了:
解密之后的图片内容: 鉴于图片内容比较暴力,这里就不展示了,感兴趣的自己去解析即可。到这里图片的内容算是处理完成了。
图片可以查看之后,主要的目标是要爬取数据,那么数据来源就很关键。通过接口格式猜测,请求视频列表的接口应该是https://api-al.vipmxmx.cn/v1/videos/menu/0?payload=D%2FPrh8wy4ODFaRYJGqhokg%3D%3D.9VP71aDIZgmZFc6X3l%2BfPoETfpXd4Jt%2BTN49ks4edK8vgtl1XHAvEPzA9EC7mTBjU59pMvWwASxSl9nUQA%2BpzTqjNk0hzAO%2FTMZ6fBkTwtJ4S11%2F4RABwCQVs%2Flk5VuDxcF6DUYuV7XnKO%2FI25woZXbONYp47i%2F1h5OGcW3I91LfJ4G8c0HZI7kli5RLbgn2Rvqt6Jk897dHkmnj4n2tbhoS3nC%2Bp3hxauGMGH2%2Byl1kah6ZGKL%2FarjRwBKR8%2Bbv7XCApO%2BWMrjwxMdJBZjxnV6obnCF5KqYGtauUC5ZN31AjG%2F7ilKr7PGYqu2b%2FrSqpvPXWBizmuw9JF1e%2BnC41vj6bOBXx4swAHsBFFK64C46byIxosDNHN4i5dofoaQH 请求接口比较简洁,应该是把所有的参数都放到了payload下面 返回的数据比较复杂,头部包含了大量的信息: 并且返回的数据进行了加密: 要想通过接口访问数据,那么就要解析请求数据,解密返回的数据。 通过参数的payload最终可以定位到以下代码:
通过frida hook 对b.c函数进行hook:
所以如果要进行接口加密,那么只需要知道加密的key即可,以为通过上面的代码分析可以知道,iv是一个随机函数生成的长度为16的数组。如果要想模拟的真实一点可以自己写一个随机函数,当然也可以直接使用jeb解析出来的数组去请求也是ok的。 捕获到的数据如下;
将euZN1Gg3JIwWOEWhmE7C4l5dSSRU34fyuPMXjtuoqVs= base64 decode之后即可获得加密用的key。 有了这些数据,那么就可以发送请求了, 测试代码如下:
此时虽然已经能够发送请求了,但是返回的数据是加密的,如果要想获取直接可用的数据,那么就需要对返回的数据进行解密。 通过层层分析,可以定位到响应数据的解密函数为:
同样对对该函数进行hook:
获取数据:
多次请求就会发现,key是固定的。但是iv却是变的。跟踪iv的数据来源,最终可以定位到
为了简便期间,把上面的函数全部hook掉:
最终捕获到的数据如下:
通过关联可以找到,iv的数据来源为X-VTag字段。所以请求之后从response header中取出X-VTag就可以解密数据了。 解密代码:
到这里接口的解密基本就完成了,可以获取app的视频基础信息了。
虽然现在视频列表数据已经有了,但是在视频信息中并没有播放地址。所以最后的工作就是获取视频的播放地址。继续抓包可以看到视频地址信息为:https://api.bdxxo.cn/v1/video/info/67432?payload=hAnCu1kQHy0hCrdZo4swYQ%3D%3D.BrHBQxJsA%2BevWaHMbZYNjOj6B7kDZk98IbSJ94j2EhhuMqcY9Rkv37MRgcYIzprPpxX0VJKcAc4sGAIG%2FtgQ3ZW%2FsnDAC%2FdUtA7Y2AfafmRsjxAhzazlbpOo6AXlh0WD91CaE7D%2FymW129p%2Fx5xMJc8NWvaRBGmQSQLIsle0hdipXQKeOKXN3RBbVLv143p7wOLcabVOhYK22AMBucZl0dCYo7Nz1%2Bv2UH8AlaiMIkwwa6JPnZW8CQayhJrrEXU91phsb%2Bam8zNr9CIvSfTxgUaI%2BOXryyt%2BEsmyBMm2CMBUUD52Q95HBrw0rSgRQSxFurjKQtgckxQqVyshwDnK%2F884URbCKU9WouvTjpEnHdc%3D 使用上面分析的数据,对于请求进行解密, 并且模拟请求:
返回数据信息:
到这里全部的数据接本就都有了,不过还有最后一点需要处理那就是返回的m3u8文件也是加密的,需要进行解密。解密方式与其他请求的解密方式一致。 不仅如此,返回的播放列表的地址也是带有效期参数。 对于播放地址,请求之后进行解密就可以看到m3u8文件的全部内容了:
解密后的m3u8文件就可以扔给ffmpeg下载了:
apk文件下载地址: ZnUyLmxpdmUv
public static final String dbImgKey() {
return CipherCore.get("29993fb387b37c932b56fd54b130e0c6");
}
public static final String decodeImgIv() {
return CipherCore.get("f3d9434408e52778164db2214e3a0a22");
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2020-7-1 13:53
被obaby编辑
,原因: