闲鱼App逆向1:模拟器和抓包环境搭建

模拟器安装 模拟器选择安装夜神模拟器,其他模拟器可能会有frida兼容问题,这里尽量减少变量。 注意模拟器安卓系统有32位和64位区别,这里要和后面frida的版本对应,这里选择32位的版本,后面部分脚本在32位才有作用。 修改模拟器代理,将模拟器的wifi代理设置为宿主机ip,端口设置为8888,后面charles抓包需要8888端口,修改代理参考 https://zhuanlan.zhihu.com/p/611867924 Charles安装 软件百度自行安装,这部分主要是安装证书,到宿主机和模拟器,否则https的包抓出来都是加密的 安装证书到本机 frida框架 需要安装python环境,自行百度。 frida 安装 pip install frida-tools pip install frida frida-ps -U ## 验证安装 frida-ps -U 能列出进程就没问题 Charles抓包 使用frida+python不走spdy协议,淘宝系软件都会走spdy协议,导致charles会抓不到包,所以需要让app走http协议 运行下面python脚本,记得先启动app,否则会hook不到,该脚本让软件强制走http协议 该脚本只对32位的闲鱼有效,64位需要hook的方法可能变了,可以解包找到对应方法,替换该方法路径 Java.use("mtopsdk.mtop.global.SwitchConfig"); import frida, sys def on_message(message, data): print("[%s] => %s" % (message, data)) pid = 0 device = frida.get_usb_device(1000) process = device.enumerate_processes() for data in process: print(data) if data.name == "闲鱼": pid = data.pid break session = device.attach(pid) uuid = ''' Java.perform( function(){ console.log("############################ Frida 开启 ############################"); var session = Java.use("mtopsdk.mtop.global.SwitchConfig"); if (session != undefined) { console.log(`------>定位到类名: ${session}`); session.A.implementation = function(){ console.log(`------>定位到函数: is_enableSpdy`); return false; } }; } ) ''' script = session.create_script(uuid) script.on('message', on_message) script.load() sys.stdin.read() 打开charles,随便点app就可以看到抓到的http请求。 ...

July 13, 2024 · 1 min · Faithlv

闲鱼App逆向2:接口参数分析

接口分析 以搜索闲鱼接口为例 https://g-acs.m.goofish.com/gw/mtop.taobao.idlemtopsearch.search/1.0/ 模拟器内用闲鱼多次请求一个接口,在Charles中比较请求头不同,发现x-sgext、x-mini-wua、x-c-traceid、x-t、x-umt、x-sign变化 只要找到找到构造这些参数的方法,就可以模拟闲鱼app发起请求 其中x-t是时间戳,x-c-traceid不带也能正常请求,所以只需要知道x-sgext、x-mini-wua、x-umt、x-sign即可。 App逆向 在知道需要那些参数后,再就是从app源码中找到构造这些参数的方法 首先需要拿到app的源码,使用jadx逆向app,这步就是拿到app代码,jadex github地址https://github.com/skylot/jadx/releases ,下载后把app扔进去就行。 加密方法定位 从app代码中找到上面x-sgext、x-mini-wua、x-umt、x-sign的构造方法 定位到 mtopsdk.security.InnerSignImpl类下面的getUnifiedSign方法,该方法就是构造上面加密参数。 定位加密方法可以通过全局搜索,以x-sign为例,全局搜索字符串x-sign,找到那些看起来像是加密的方法,然后用frida hook方法,验证入参和出参,基本就能判断是不是加密方法。 firda hook代码 import frida, sys jscode = ''' Java.perform( function(){ function javaMapToJsObject(map){ //遍历保存为js对象 var res = {}; var keySet = map.keySet(); var it = keySet.iterator(); while(it.hasNext()){ var key = it.next().toString(); var value = map.get(key); if(value == null){ res[key] = null; }else{ res[key] = value.toString(); } } return res; } console.log("############################ Frida 开启 ############################"); var InnerSignImpl = Java.use("mtopsdk.security.InnerSignImpl"); if(InnerSignImpl != undefined){ console.log("############################ 定位到类 InnerSignImpl ############################"); InnerSignImpl.getUnifiedSign.implementation = function(map1, map2, string1, string2,bool,string3){ console.log("############################ my打印入参 ############################"); console.log("map1: " + JSON.stringify(javaMapToJsObject(map1))); console.log("map2: " + JSON.stringify(javaMapToJsObject(map2))); console.log("string1: " + string1); console.log("string2: " + string2); console.log("bool: " + bool); console.log("string3: " + string3); var ret = this.getUnifiedSign(map1,map2,string1,string2,bool,string3); console.log("############################ my打印返参 ############################"); console.log("ret " + ret); return ret; } } } ) ''' def on_message(message, data): print("[%s] => %s" % (message, data)) device = frida.get_usb_device(1000) process = device.attach("闲鱼") script = process.create_script(jscode) script.on('message', on_message) script.load() sys.stdin.read()

July 13, 2024 · 1 min · Faithlv