美拍sig逆向
声明:该文章仅为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖!
一、目标:
解决美拍发现页数据采集
二、抓包:
抓包方式:VPN+中间人抓包
没有遇到检测,直接可以获取请求体
三、参数分析:
在发现页下拉,同时进行抓包,对比两次请求,发现需要解决的参数为:sig,sigTime。
四、参数还原:
在jadx中打开apk,开始搜索sig的位置
经过分析,发现sig的生成是在sigEntity这个类中,那么接下来对这个类中的方法进行hook
Java.perform(function () {let SigEntity = Java.use("com.meitu.secret.SigEntity");SigEntity["generatorSigWithFinal"].implementation = function (str, strArr, str2, obj) {console.log(`SigEntity.generatorSigWithFinal is called: str=${str}, strArr=${strArr}, str2=${str2}, obj=${obj}`);let result = this["generatorSigWithFinal"](str, strArr, str2, obj);console.log(`SigEntity.generatorSigWithFinal result=${result}`);return result;};
});
分析hook的结果:
hot/feed_timelin.json就是我们请求连接中的path,strArr也是请求params中的参数值,result的结果是一个指针,指向com.meitu.secret.SigEntity@a12435d这个地址,我们可以修改一下,输出result.sig,结果为:21d41abbe45bbd01b3c57471ab3c663b,和请求中的sig很相似,所以继续往下分析。
在sigEntity中可以看到,nativeGeneratorSigFinal方法是在release_sig中实现的
private static final String SO_NAME = "release_sig";
public static native SigEntity nativeGeneratorSigFinal(String str, byte[][] bArr, String str2, Object obj);
使用ida打开librelease_sig.so文件进行分析,首先还是先搜索一下sig,接下来尝试对so中的方法进行hook。
其实这里,我对这几个方法都进行了hook,只有GeneratorSIG这个方法在我进行操作时有结果,故而认定sig是在这个方法中生成的(其实看名字也能知道…)。
接下来对GeneratorSIG中的代码进行分析,中间涉及到加密key,由GetSecretKey(v11, v12);方法生成,再对该方法进行hook,拿到key值。
hook代码如下:
Java.perform(function () {let secretkeyss = Module.getExportByName("librelease_sig.so", "_Z12GetSecretKeySs");Interceptor.attach(secretkeyss, {onEnter: function (args) {console.log("[*] 获取美拍密钥...");},onLeave: function (retval) {let str_ptr = retval;let length = Memory.readU32(str_ptr.add(4));let data_ptr = Memory.readPointer(str_ptr);if (length < 16) {data_ptr = str_ptr.add(8);}let secret = Memory.readUtf8String(data_ptr, length);console.log("[*] 密钥: " + secret);console.log("[*] 密钥长度: " + length);}})}
)
接下来,就是将GeneratorSIG中的代码,还原为python代码,即可生成sig。
其实就是一个简单的md5,然后再进行换位操作。