本帖最后由 q532373 于 2019-11-18 22:50 编辑
某app的API接口解密笔记
一次解密,给刚开始接触逆向的新人点经验 话不多说,先上封包:
POST https://api.c8521.com/api HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=UTF-8 User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1;redmi 3s Build/LMY47I) Host: api.c8521.com Connection: Keep-Alive Accept-Encoding: gzip Content-Length: 445 payload=CEHDOmG4lcviYZnCskdZzQ%3D%3D.UwcncrX7zZcJVxehkKCij0gHTeQKWLwZ6XfItcalvDFmPcihmnZrkrxpQF%2B43d9U9pa1L6pqeylM%0AgjAvlwH0%2Bwf29Lo5%2BbPX4yv0Cl%2BZx%2BjTHE%2Foo02gFbBqdgYbfIdiYN8F1%2F5x9P42p7bFGnVxilOS%0AiwREH3epLnzJBtOEEBBtKJrHGF8fr%2Bc7E%2BJKILrLujBVVXgJzVMZrmga%2FC9k8u4sevfM4RFUQbDc%0AOoPKpWrV7SPN1hs1FiczQ%2FUv72ANArtvhqN0f7HzAxsaPPwvzVeXA3Chwcv89zQqM1%2BZobBScSQO%0Ai0pKoGtWzbOfK5Yj3iSq6qk8LnGMJ5uohqCR4d5fwMF7OfCZPDDK%2Boi397U%3D%0A& 因为是对称加密,看这个样子,应该是属于AES、DES这类的 看了下dex大小,应该是没加固的,dex拖到dex2jar里面去
再把jar拖进gui
成功得到源码
接下来就是定位加密的地方,通过提交数据的参数,查找关键词
找到关键地方
提交参数是两段base64编码过的数据
第一段: payload=CEHDOmG4lcviYZnCskdZzQ%3D%3D 中间是点分隔开的 第二段 UwcncrX7zZcJVxehkKCij0gHTeQKWLwZ6XfItcalvDFmPcihmnZrkrxpQF%2B43d9U9pa1L6pqeylM%0AgjAvlwH0%2Bwf29Lo5%2BbPX4yv0Cl%2BZx%2BjTHE%2Foo02gFbBqdgYbfIdiYN8F1%2F5x9P42p7bFGnVxilOS%0AiwREH3epLnzJBtOEEBBtKJrHGF8fr%2Bc7E%2BJKILrLujBVVXgJzVMZrmga%2FC9k8u4sevfM4RFUQbDc%0AOoPKpWrV7SPN1hs1FiczQ%2FUv72ANArtvhqN0f7HzAxsaPPwvzVeXA3Chwcv89zQqM1%2BZobBScSQO%0Ai0pKoGtWzbOfK5Yj3iSq6qk8LnGMJ5uohqCR4d5fwMF7OfCZPDDK%2Boi397U%3D%0A& 我们先分析这段源码,看看第一段怎么生成的
点前面的参数是localObject1 byte[] 类型的,是由com.ilulutv.lulu.other.h.a.a()这个方法生成的
点进去,看来是随机生成的一个16字节
然后在看到这里调用的这个方法
点进去是一个base64编码
再来看第二段参数
localObject2是调用这个方法com.ilulutv.lulu.other.h.a.c生成的
点进去
果不其然是一个AES加密,第一个传进来的参数是key,第二个是iv,第三个是原文。
Iv是刚才随机生成的一个16字节
第一个参数调用的方法再去看看密钥的生成方式:
Get再进去
到这里可以看出来,是调用了so层,看来这个APP是把密钥计算方法放在了so层,通过传入参数返回计算好的密钥。
分析so太麻烦(因为不会,小声bb),这里就直接hook AES加密那个函数得到密钥了,
打开AndroidStudio,开始编写hook
填入包名,类名,方法名,传入参数类型就行了
把生成的apk装到模拟器,再激活xp模块,打开app以后,去日志查看
这样子解密就完成了,好像这个app有很多对密钥,用在不同的地方,就不一一分析了,希望对刚开始学习逆向的新人有所帮助,最后说一句:支持开源!
|