某眼查的逆向

2023-11-10

​一: 准备
APP: 某眼查

版本: 11.4.0

工具: xposed, FDex2, JustTrustMe, Fiddler, jadx

二. 抓包

  1. 打开Fiddler,打开天眼查抓包(开启JustTrustMe能抓到包)

我们抓取工商信息这块,查看Fiddler上面的body这块,因为传输数据,所以包肯定是比较大的,点开看右边的json格式能看到和工商信息里面的相符的内容,说明这就是我们需要抓取的数据包了.

  1. 查看抓到包的请求头,找出我们需要自动生成的参数: tyc-hi, Authorization,duid

(某音的逆向文章有说怎么找)

三.脱壳

  1. 用jadx打开该app,文件夹特别少,说明该app加壳了,需要我们脱壳.

  2. 手机打开Xposed里的FDex2模块

再打开要脱壳的软件,在FDex2的目录下面就能看到脱壳文件了.

 3. 然后用adb pull data/user/0/com.tianyancha.skyeye/xxxx.dex 电脑路径 把这几个dex文件全都放到电脑上,再用jadx打开. 文件内容可以排除前三个小文件

逐个打开后面三个文件,然后搜请求头的关键字(如tyc-hi),找到定义该参数的地方,定位到该函数,这里有请求头的所有的参数名,所以可以确定该文件是获取请求参数的壳文件了.在这里把’tyc-hi’赋值给了w ,

  1. 所以要定位到该参数的位置应该定位变量w,而w的重复概率很大,所以要变个模式搜.因为要调用该变量可以尝试搜索: (.w),(.w=),(m.w),(.w,)(m.w,) 然后看定位代码,找相似的,这里用的m.w, 找出只有一个,所以点进去看了一下.能找到定位到的其他参数,所以可以确定这里是请求头的参数操作位置了

  2. 找到需要逆向的参数所对应的变量: tyc-hi—(m.w, a2)

Authorization—(‘Authorization’,I)

duid—(m.v, g)

  1. tyc-hi的逆向分析:

tyc-hi — (m.w, a2) — a2 = dp.a(str, I, d2, N, i, “slat”)

把a2里面的参数替代成请求头:

a2 = (url, authorization, app_version, ‘’, device_id, “slat”)

  1. Authorization的逆向分析

Authorization—(‘Authorization’, I)—I = dp.I()

  1. duid的逆向分析

duid—(m.v, g) — g = dp.g()

  1. 三个参数的生成方法都涉及到了dp方法,我们直接hook dp.a方法(记得手机启动frida-server)
import frida, sys
​
jscode_signatue = """
Java.perform(
    function() {
        var dp = Java.use('com.tianyancha.skyeye.utils.dp');
        dp.a.overload('java.lang.String', 'java.lang.String').implementation = function(str1, str2) {
            send('here');
            send(str1);
            send(str2);
            var return_str = this.a(str1, str2);
            send(return_str);
            return return_str;
        },
        dp.f.implementation = function() {
            var f_str = this.f();
            send('f_str:'+f_str);
            return f_str;
        },
        dp.a.overload('java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function(arg1, arg2, arg3, arg4, arg5, arg6) {
            send('a func6');
            send(arg1);
            send(arg2);
            send(arg3);
            send(arg4);
            send(arg5);
            send(arg6);
            var return_str = this.a(arg1, arg2, arg3, arg4, arg5, arg6);
            send('re:'+return_str);
            return return_str;
        }
    }
)
​
​
"""def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)
​
​
process = frida.get_usb_device(1000).attach('com.tianyancha.skyeye')
script = process.create_script(jscode_signatue)
script.on('message', on_message)
script.load()
sys.stdin.read()

打印出传的六个参数,

可以推出a2 = dp.a(str, I, d2, N, i, “slat”)

a2 = dp.a(str, dp.I(), dz.d(), ’Android 11.4.0’, ‘’, ‘slat’)

  1. 然后再写一个hook程序,打印tyc-hi, Authorization, duid, deviceID这四个参数的值
import frida,sys
​
#Android 11.4.0
hook_code = '''
rpc.exports = {
    getsig: function(url, app_version){
        var sig = {"tyc-hi":"", "Authorization":"", "duid":"", "deviceID":""};
        Java.perform(
            function(){
                var dp = Java.use('com.tianyancha.skyeye.utils.dp');
                var duid = dp.g();
                var authorization = dp.I();
                var device_id = dp.i()
                var tyc = dp.a(url, authorization, app_version, '', device_id, "slat")
​
                sig["tyc-hi"] = tyc;
                sig["Authorization"] = authorization;
                sig["duid"] = duid;
                sig["deviceID"] = device_id;
            }
        )
        return sig;
    }
}
'''
​
​
def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)def hook_prepare():
    process = frida.get_usb_device(1000).attach('com.tianyancha.skyeye')
    script = process.create_script(hook_code)
    script.on('message', on_message)
    script.load()
    return script
​
​
process = frida.get_usb_device().attach('com.tianyancha.skyeye')
script = process.create_script(hook_code)
script.on('message', on_message)
script.load()
sig = script.exports.getsig("https://api4.tianyancha.com/services/v3/t/details/appComIcV4/150041670?pageSize=1000","Android 11.4.0")
print(sig)
sys.stdin.read()
    urls = set()
    # 该文件下放着每个公司对应的天眼查id
    with open('D:/tanyancha/urls.txt', 'r') as f:
        for line in f:
            urls.add(line.strip())
    return urls
​
def to_file(ids, text):
    # 下载的文件存储的目录以及名字
    with open('D:/tanyancha/'+ids, 'w') as f:
        f.write(text)def start():
    base_url = 'https://api4.tianyancha.com/services/v3/t/details/appComIcV4/{}?pageSize=1000'
    script = hook_sky.hook_prepare()
    urls = load()
    for ids in urls:
       params = script.exports.getsig(base_url.format(ids), "Android 11.4.0")
       text = req(base_url.format(ids), params)
       to_file(ids, text)
​
start()
​```
11. 需要的参数生成方法都获取到了,接下来写个爬虫程序模拟手机的请求头就可以抓取app上的数据了.

```python

import requests
import hook_sky
​
def req(url, params):
    header = {
      'Accept-Encoding': 'gzip',
      'User-Agent': 'com.tianyancha.skyeye/Dalvik/2.1.0 (Linux; U; Android 6.0.1; Nexus 5 Build/M4B30Z; appDevice/google_QAQ_Nexus 5)',
      'Content-Type': 'application/json',
      'channelID': 'YingYongBao',
      'deviceID': '{}'.format(params['deviceID']),
      'duid': '{}'.format(params['duid']),
      'tyc-hi': '{}'.format(params['tyc-hi']),
      'version': 'Android 11.4.0',
      'X-Auth-Token': '',
      'Authorization': '{}'.format(params['Authorization']),
      'Connection': 'close',
      'Host': 'api4.tianyancha.com'
    }
    r = requests.get(url, headers=header, verify=False, timeout=1.5)
    print(r.status_code)
    return r.text
​
​
def load():
    urls = set()
    # 该文件下放着每个公司对应的天眼查id
    with open('D:/tanyancha/urls.txt', 'r') as f:
        for line in f:
            urls.add(line.strip())
    return urls
​
def to_file(ids, text):
    # 下载的文件存储的目录以及名字
    with open('D:/tanyancha/'+ids, 'w') as f:
        f.write(text)def start():
    base_url = 'https://api4.tianyancha.com/services/v3/t/details/appComIcV4/{}?pageSize=1000'
    script = hook_sky.hook_prepare()
    urls = load()
    for ids in urls:
       params = script.exports.getsig(base_url.format(ids), "Android 11.4.0")
       text = req(base_url.format(ids), params)
       to_file(ids, text)
​
start()

urls.txt下载链接:

链接:https://pan.baidu.com/s/1daVEzvmwJV8XvUTpWlShlw

提取码:5047

爬下来的数据还要进行筛选才能得到有用的数据,这就不过多的说了,毕竟…我现在只做逆向.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

某眼查的逆向 的相关文章

  • 如何使用文本相似性删除 pandas 数据框中相似(不重复)的行?

    我有数千个数据 这些数据可能相似也可能不相似 使用 python 的默认函数 drop duplicates 并没有真正的帮助 因为它们只检测相似的数据 例如 如果我的数据包含类似以下内容怎么办 嗨 早上好 嗨 早上好 Python 不会将
  • Spotify 登录错误 INVALID_CLIENT:无效的重定向 URI android

    我正在制作一个包含 Spotify 集成的应用程序 我点击了此链接https developer spotify com technologies spotify android sdk tutorial https developer s
  • Django 的 request.FILES 出现 UnicodeDecodeError

    我在视图调用中有以下代码 def view request body u for filename f in request FILES items body body Filename filename n f read n 在某些情况下
  • 在 Windows 上使用 apache mod_wsgi 运行 Flask 应用程序时导入冲突

    我允许您询问我在 Windows 上使用您的 mod wsgi portage 托管 Flask 应用程序时遇到的问题 我有两个烧瓶应用程序 由于导入冲突 只有一个可以同时存在 IE 如果请求申请 1 我有回复 然后 如果我请求应用程序 2
  • 有没有办法在多个嵌套的 RecyclerView 之间共享同一个 LayoutManager

    我正在开发一个显示游戏列表的应用程序 在每个游戏的 itemView 内 我还有一个要显示的视频列表 预览和结构如下 我部署了一个RecyclerView作为窗口根视图 然后对于视频 我使用网格样式的RecyclerView来显示 所以这里
  • .pyx 文件出现未知文件类型错误

    我正在尝试构建一个包含 pyx 文件的 Python 包 pyregion 但在构建过程中出现错误 检查以下输出 python setup py build running build running build py creating b
  • Geodjango距离查询未检索到正确的结果

    我正在尝试根据地理位置的接近程度来检索一些帖子 正如您在代码中看到的 我正在使用 GeoDjango 并且代码在视图中执行 问题是距离过滤器似乎被完全忽略了 当我检查查询集上的距离时 我得到了预期距离 1m 和 18km 但 18km 的帖
  • 用 python 编写的数学语法检查器

    我需要的只是使用 python 检查字符串是否是有效的数学表达式 为了简单起见 假设我只需要 运算符 也作为一元 带有数字和嵌套括号 为了完整性 我还添加了简单的变量名称 所以我可以这样测试 test 3 2 1 valid test 3
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • 在系统托盘中隐藏 tkinter 窗口 [重复]

    这个问题在这里已经有答案了 我正在制作一个程序来提醒我朋友的生日 这样我就不会忘记祝福他们 为此 我制作了两个 tkinter 窗口 1 First one is for entering name and birth date 2 Sec
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 制作弹跳动画

    我想做图层的弹跳动画 我已经完成了该图层从右到中心的操作 现在我想将其向后移动一点 然后回到中心 这会产生反弹效果 我想我可以用这样的翻译来做到这一点
  • 当数据库不是 Django 模型时,是否可以使用数据库中的表?

    是否可以从应用程序数据库中的表获取查询集 该表不是应用程序中的模型 如果我有一个不是名为 cartable 的模型的表 从概念上讲 我想这样做 myqueryset cartable objects all 有没有相对简单的方法来做到这一点
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • TKinter 中的禁用/启用按钮

    我正在尝试制作一个像开关一样的按钮 所以如果我单击禁用按钮 它将禁用 按钮 有效 如果我再次按下它 它将再次启用它 我尝试了 if else 之类的东西 但没有成功 这是一个例子 from tkinter import fenster Tk
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐

  • Windows 下 VSCode 使用 SSH 连接报 Bad owner or permissions on C:\\Users\\Administrator/.ssh/config 错误问题解决

    Windows 下 VSCode 使用 SSH 连接报 Bad owner or permissions on C Users Administrator ssh config 错误问题解决 vscode ssh 链接报错情况 解决方法 v
  • JAVA环境变量配置方法(Windows)

    编写一个JAVA程序后 如果想让自己编写的代码可以正常运行 我们便需要对它进行编译和运行 而Java环境变量的配置就显得尤为重要 本篇文章 我们来谈一谈关于Java环境变量配置的一些方法 目录 方法一 方法二 方法三 方法一 1 右击 我的
  • ARP协议

    什么是ARP 地址解析协议 即ARP Address Resolution Protocol 是根据IP地址获取物理地址的一个TCP IP协议 主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机 并接收返回消息 以此确定
  • vue 字符串、数组之间的相互转换

    1 字符串转数组 str split 以分号拆分字符串 2 数组转字符串 arr join 把数组项拼接成字符串 并以分号隔开 默认情况下是以逗号隔开
  • Linux系统迁移(同一台电脑),重建UEFI启动文件

    电脑型号 hp 暗影精灵5 Air 显卡 RTX 2060 CPU i7 9750H 硬盘 500G固态 1T固态 启动方式 UEFI 操作系统 Ubuntu16 04 之前安装Ubuntu的时候给Ubuntu系统分配的空间太小了 安装新硬
  • 函数调用时的堆栈变化(实例)

    函数调用时的堆栈变化 关于函数调用是的堆栈变化 在网上找到的资料大都是一些配图文字等 理解起来尚有些困难 不过建议大家还是先了解一下基本的原理 下面我主要通过一个调用函数的实例来讲解一下函数调用时的堆栈变化 Ps 图片有点糊 大家最好自己跟
  • 一、时间序列分析---滞后算子(lag operator)

    1 基本概念 时间序列是以观测值发生的时期作为标记的数据集合 一般情况下 我们是从某个特定的时间开始采集数据 直到另一个固定的时间为止 我们可以将获得的数据表示为 y 1 y
  • 【hadoop——HDFS操作常用的Shell命令】

    1 Hadoop分布式文件系统 Hadoop Distributed File System HDFS 是Hadoop核心组件之一 我们已经安装好了Hadoop 2 7 1 其中已经包含了HDFS组件 不需要另外安装 最基本的shell命令
  • 最新阿里云ECS服务器挂载数据盘亲测好用挂载成功分享一下

    最近网站打不开了 发现服务器系统盘不够用了 查看磁盘占用情况 系统盘已经快满了 不能考虑到后期的需求 不能每次都去清理 不得不增加数据盘 这里记录下数据盘的挂载过程 也是找了好多参考方法亲测成功分享出来希望可以帮助有需要朋友 总结方法如下
  • 【无标题】BTY-DNS推广机制及首次空投规则

    BTY DNS 致力于创建Web3领域中的去中心化身份 DID BTY DNS的 yuan域名自开放上线以来 获得广大用户的喜爱与勇跃注册 目前 yuan的域名注册量已近千个 BTY DNS具有推广奖励机制 同时对于持有DNS的用户将进行第
  • 软件人员kpi制定模板_软件项目团队绩效考核设计与薪酬激励设计

    关注 本头条号 更多关于制度 流程 体系 岗位 模板 方案 工具 案例 故事 图书 文案 报告 技能 职场等内容 弗布克15年积累免费与您分享 阅读导航 01 软件项目团队绩效考核设计 02 软件项目团队薪酬激励设计 研发部 软件项目团队绩
  • 图像通用操作Python的实现

    平时经常会对一个目录下的图像做统一处理 如缩放 旋转等等 之前使用C 处理 有时不是很方便 发现使用Python比较简单 代码量又很少 在Anacanda下执行起来也比较方便 因此 打算在后面遇到图像的常规处理时都将其实现放入到同一个py文
  • Java:数据集合List与Map的性能比较案例

    假设有这样的一个场景 一组学生数据 一组老师的数据 属性分别如下 public class Student private String courseId private String sduName public Student Stri
  • 一文讲清楚梯度下降算法

    一 随机梯度下降与经典梯度下降 1 经典梯度下降 经典的梯度下降法采用所有训练数据的平均损失来近似目标函数 可以看到每更新一次梯度 就需要计算所有训练数据 当M很大的时候 这需要很大的计算量 耗费很长的计算时间 2 随机梯度下降 随机梯度下
  • [从零开始学习FPGA编程-32]:进阶篇 - 基本时序电路-D触发器(Verilog语言)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第1章 什么是时序电路 1 1 时序电路 1 2 什么是触发器
  • 点云 K-Means聚类算法 (附c++代码)

    一 K Means算法 在诸多的聚类方法中 K Means聚类方法是属于 基于原型的聚类 也称为原型聚类 的方法 此类方法均是假设聚类结构能通过一组原型刻画 在现实聚类中极为常用 通常情况下 该类算法会先对原型进行初始化 然后再对原型进行迭
  • Python正则表达式(一看就懂)

    目录 哈喽O O 什么是正则表达式 简单说 正则表达式是 正则表达式怎么用 sreach的用法 匹配连续的多个数值 字符 重复前面一个匹配字符一次或者多次 字符 重复前面一个匹配字符零次或者多次 字符 重复前面一个匹配字符零次或者一次 特殊
  • 【HDLBits 刷题 5】Circuits(1)Combinational Logic

    目录 写在前面 Combinational Logic Basic Gates Wire GND NOR Another gate Two gates More logic gates 7420 chips Truth table Two
  • render的使用

    在很多前端框架中 render 函数通常接受三个参数 val rec和idx 但具体的参数取决于你的应用框架和用法 通常情况下 val 表示当前要渲染的数据值 通常是当前单元格的值 rec 表示当前行的记录或数据对象 包含了这一行的各个字段
  • 某眼查的逆向

    一 准备 APP 某眼查 版本 11 4 0 工具 xposed FDex2 JustTrustMe Fiddler jadx 二 抓包 打开Fiddler 打开天眼查抓包 开启JustTrustMe能抓到包 我们抓取工商信息这块 查看Fi