准备工具

脱壳工具:Fdex2
查壳工具:apk messager
抓包工具:Fiddler
分析工具:jadx
hook框架:Frida
手机:root 的真机Android 7.0(模拟器一堆问题,不建议使用)

如需上述逆向工具的请在我的个人公众号回复:逆向工具

​欢迎关注"python网络爬虫大数据与逆向工程"公众号

抓包

天眼查详情页得到的响应如下图所示

GET https://api4.tianyancha.com/services/v3/t/common/baseinfoV5/9519792 HTTP/1.1
Authorization: 2sb8TGp44KO22dH60bgiK64QVLNyygBo8/+aGPtujQptyvGZILIVPlvbTaCScwgdPNRKC056JTNseqKqemePKJrR4XoYci+ZOqqHUNBOui8yOUk84zkG77DEbEm0yWIqeuHq+Yl/G5SGkt2QpdRAaQ==
version: Android 11.4.0
X-Auth-Token:
Content-Type: application/json
channelID: YingYongBao
deviceID: df2eb2a465f9b18f
tyc-hi: 53a72300283f00f2dd1793db4907f825
duid: DuIVtTRdrlWQX5iED6Bn92TCPnUguxuRyC8aCu3i5UBdyFcdEPZZES3Mz3h/NBZ7uzisTb/TgZ1472JtgX09Ahzw
Connection: close
User-Agent: com.tianyancha.skyeye/Dalvik/2.1.0 (Linux; U; Android 7.1.1; Nexus 6P Build/NOF27B; appDevice/google_QAQ_Nexus 6P)
Host: api4.tianyancha.com
Accept-Encoding: gzip

很明显
Authorization、tyc-hi是需要动态生成的,这个deviceId和我们常看到的一堆数字的也不一样这里留意一下

jadx分析

ok应用加壳了,那我们就把壳解开

脱壳

天眼查app有壳,我们用apk messager查看以下如图所示,用的是爱加密加固

掏出我们的Fdex2将脱壳后得到的dex文件放在电脑上

后续看代码我们先从文件较大的dex开始看

分析dex文件

搜索大法好,我们先全局搜索Authorization、tyc-hi这两个参数
前面两个dex文件没啥线索,我们在第3个里面搜到了一个,进去看一下

一堆abcd没人看得懂,但是看到值就很清晰,这是在构造请求头
代码如下

package com.tianyancha.skyeye.network;import com.tianyancha.skyeye.network.AppUrlHolder;
import com.tianyancha.skyeye.utils.bp;
import com.tianyancha.skyeye.utils.cf;
import com.tianyancha.skyeye.utils.dn;
import com.tianyancha.skyeye.utils.dp;
import com.tianyancha.skyeye.utils.dz;
import com.umeng.message.proguard.l;
import com.umeng.message.util.HttpRequest;
import java.io.IOException;
import okhttp3.ab;
import okhttp3.ac;
import okhttp3.ad;
import okhttp3.u;
import okhttp3.v;
import okhttp3.w;public class AppGlobalInterceptor implements w {@Override // okhttp3.wpublic ad intercept(w.a aVar) throws IOException {String str;v g;ab d;ab a = aVar.a();u c = a.c();v a2 = a.a();String b = a.b();ac d2 = a.d();String I = dp.I();String d3 = dz.d();String N = cf.a().N();if (dn.c(cf.a().X())) {str = dp.H();} else {str = dp.H() + "_QwQ_" + cf.a().X();}String i = dp.i();String a3 = dp.a(a2.a().toString(), I, d3, N, i, "slat-20190819");String g2 = dp.g();String baseUrlByHost = AppUrlHolder.getInstance().getBaseUrlByHost(c.a(AppUrlHolder.ServerHost.HOST_KEY));if (bp.c(baseUrlByHost)) {g = a2;} else {g = v.g(baseUrlByHost);}ab.a f = a.f();f.b(AppUrlHolder.ServerHost.HOST_KEY);f.b(HttpRequest.HEADER_AUTHORIZATION, I);f.b("version", d3);f.b("X-Auth-Token", N);f.b(HttpRequest.HEADER_CONTENT_TYPE, HttpRequest.CONTENT_TYPE_JSON);f.b("channelID", str);f.b("deviceID", i);f.b("tyc-hi", a3);if (!dn.d(g2)) {f.b("duid", g2);}f.b("Connection", "close");String B = dp.B();if (!dn.c(B) && B.contains(l.t)) {f.b(HttpRequest.HEADER_USER_AGENT, String.format("%s/%s%s", dp.C(), B.substring(0, B.lastIndexOf(l.t)), String.format("; appDevice/%s_QAQ_%s)", dp.e(), dp.d())));}if ("post".equalsIgnoreCase(b)) {d = f.a(a2.v().a(g.c()).f(g.i()).a(g.j()).c()).a(d2).d();} else {d = "get".equalsIgnoreCase(b) ? f.a(a2.v().a(g.c()).f(g.i()).a(g.j()).c().toString()).a().d() : a;}return aVar.a(d);}
}


这里的dp在第二个dex文件里面

可以去hook以下这个AppGlobalInterceptor类里面的方法,即使没有学过Java看表面意思也知道这个是app全局过滤器,既然是全局的那就不客气了

这里省略hook该过程,而是采用分析的方式看透它传的是啥参数

我们找到dp.a函数,a函数有多个重载,我们找那个最屌的,发现有如下图所示的代码,很明显str就是你传入的url,然后该函数的功能就是把请求参数一个个append起来

一步步源码追进去我们会知道

String a3 = dp.a(a2.a().toString(), I, d3, N, i, "slat-20190819");
//a3就是tyc-hi,
//函数a第一个参数是url,
//第2个参数是authorization
//第3个是app version
//第4个是空字符串
//第5个是deviceID
//第6个是固定的salt

FridaRpc

那我们直接上rpc代码去合成这几个参数

def on_message(message, data):if message['type'] == 'send':print("[*] {0}".format(message['payload']))else:print(message)js_code = """
rpc.exports = {getsign: function (url, version) {var sig="aa";Java.perform(function () {send('getsign');var dp = Java.use('com.tianyancha.skyeye.utils.dp');var dz = Java.use('com.tianyancha.skyeye.utils.dz');var Authorization = dp.I();send("Authorization:"+Authorization);var version = dz.d();send("version:"+version)var deviceID = dp.i();send("deviceID:"+deviceID);var duid = dp.g();send("duid:"+duid);var tyc = dp.a(url,Authorization,version,"",deviceID,"slat-20190819");send("tyc:"+tyc);sig={"tyc":tyc, "Authorization":Authorization, "duid":duid, "deviceID":deviceID}})return sig;}
}function getBytes(s) {var bytes = [];for (var i = 0; i < s.length; i++) {bytes.push(s.charCodeAt(i));}return bytes;
}"""
adb_forward()process = frida.get_remote_device().attach('com.tianyancha.skyeye')
script = process.create_script(js_code)
script.on('message', on_message)
script.load()url, version = "https://api4.tianyancha.com/services/v3/search/sNorV4/%E8%85%BE%E8%AE%AF?allowModifyQuery=1&sortType=0&pageSize=10&pageNum=1", "Android 11.4.0"
aa = script.exports.getsign(url, version)
print(aa)

结果出来了

​欢迎关注"python网络爬虫大数据与逆向工程"公众号,一起学习更多关于网络爬虫和逆向工程方面的知识

天眼查app协议逆向分析相关推荐

  1. 某app登录协议逆向分析

    某app登录协议逆向分析 设备 iphone 5s Mac Os app:神奇的字符串57qm5Y2V 本文主要通过frida-trace.fridaHook.lldb动态调试完成破解相应的登录算法, ...

  2. 对吃鸡APP的逆向分析

    吃鸡的APP逆向分析涉及到动态调试分析,涉及到对arm汇编指令的掌握,涉及到一些反调试方案的绕过. 下面通过对吃鸡APP的逆向分析做了一次详解解析. 请点击文字进行阅读对android逆向吃鸡APP的 ...

  3. 管家病毒查杀模块逆向分析

    本文研究的是*管家2.8-3.6版本的杀毒模块功能实现.众所周知,杀毒软件查杀病毒分为主动查杀和被动查杀两种方式.*管家的主动查杀包括快速查收和全盘查杀,而快速查杀和全盘查杀都使用了本地查杀技术和云查 ...

  4. 某影视APP算法逆向分析

    一.抓取数据包 1.请求头有%加十六进制,说以是url编码,先解密一下 GET http://m.mapps.m1905.cn/User/sendVer?request=jYgPer7AuEqdM+D ...

  5. 病毒木马查杀实战第005篇:熊猫烧香之逆向分析(上)

    前言 对病毒进行逆向分析,可以彻底弄清楚病毒的行为,从而采取更有效的针对手段.为了节省篇幅,在这里我不打算将"熊猫烧香"进行彻底的分析,只会讲解一些比较重要的部分,大家只要掌握了这 ...

  6. 学习系列之天眼查爬虫

    天眼查APP爬虫 爬虫不用逆向app爬取天眼查 爬虫不用逆向app爬取天眼查 遇到个好人破解了天眼查app的参数加密,链接如下 https://blog.csdn.net/ggl1438/articl ...

  7. 安卓 sharedpreferences可以被其它activity读取_【安卓逆向】“一份礼物”之我要o泡逆向分析...

    最近安卓手机有个恶搞程序"一份礼物"登上热搜. 该app的效果是打开之后手机便会以最大音量循环播放"我要o泡"音乐,并且无法调小音量,无法退出程序,甚至无法关机 ...

  8. 跟我一起从零学习安卓逆向分析

    随着国家对信息安全的重视,兴起了各大CTF的赛事,其中逆向板块的安卓平台题目不断涌现.在这个互联网+的时代,移动互联网的APP犹如滚雪球一般的增长,随之而来的则是移动业务安全如风险控制.反外挂.安全合 ...

  9. 网络协议逆向工具Netzob1.0.2的安装与试用

    最近项目任务有需求,想探究一下对未知未加密网络协议的解析. 之前只了解过基本的计算机网络知识,对于具体的网络协议,更多是学术上的认识,而没有工程上的认知与实践.因此对于网络协议解析的工作,可谓是一筹莫 ...

最新文章

  1. ajax的loading方法,Ajax加载中显示loading的方法
  2. 东田纳西州立大学计算机排名,2019东田纳西州立大学世界排名
  3. 【Prince2科普】Prince2七大流程概论
  4. 使用GZIP和压缩数据
  5. consul删除无效服务
  6. wamp环境搭建到mysql就不成功_Wamp环境搭建常见错误问题解决
  7. Flutter延时任务、Flutter通过Future与Timer实现延时任务
  8. 这是小小本周的第六篇,本篇小小将会介绍一个很古老很古老很古老的为什么系列之不能重写service方法。...
  9. 面试容易问的 JavaScript 知识点,你知道几个?
  10. 距离向量路由算法及举例
  11. Javascript屏蔽IE和Firefox浏览器默认按键响应(快捷键功能)
  12. python concurrent.futures包使用,捕获异常
  13. 构建一个pool来管理无刷新页面的xmlhttp对象
  14. 普中51单片机数码管实例
  15. html的实习报告,HTML实习报告
  16. 敏捷互联网项目测试质量报告的大纲
  17. android内存扩展格式,一文看懂:如何为你的安卓手机选择合适的存储卡
  18. 基于规则的中文分词 - NLP中文篇
  19. excel自动计算体育成绩
  20. 淘宝宝贝标题优化2个字:日增10000个IP访问

热门文章

  1. SyncToy同步工具安装使用详解
  2. 阿里 java 面试题 p6_「独家」五面阿里P6:Java开发面试题及答案
  3. esp8266 wifi信号强度示意表
  4. Adobe Xd快捷键(Win 10)-UI设计更便捷
  5. Win10截图和草图无法使用怎么办
  6. vue项目整合ckplayer
  7. window.print()+layer.open()——实现打印A4纸张内容的功能——功能实现
  8. 硅谷的政治泡沫:反对特朗普,与美国大部分地区观念出现割裂
  9. html设置长宽高代码_CSS实现长宽比的几种方案
  10. 【搬家】写一个技术博客