微信小程序 Spdier - OfferShow 反编译逆向(一)

2023-11-04

微信小程序 Spdier - OfferShow 反编译逆向(一)



前言

本文需要使用到的工具有:
Charles抓包工具、夜神模拟器、微信开发者工具、wxapkg反编译工具CrackMinApp;
提示:需要安装好Charles和夜神模拟器并配置好App抓包环境,以及安装好微信开发者工具 / 反编译工具CrackMinApp
Charles&夜神模拟器安装教程:https://blog.csdn.net/EXIxiaozhou/article/details/127767808
微信开发者工具 / 反编译工具CrackMinApp 下载安装:https://blog.csdn.net/EXIxiaozhou/article/details/128110468
该文章涉及到App抓包以及微信小程序反编译逆向等相关的Spider技术


提示:以下是本篇文章正文内容,下面案例可供参考

一、任务说明

1.尝试反编译分析出js_code参数的生成方式,用来获取token

在这里插入图片描述

2.将小程序搜索出来的数据保存至本地excel

在这里插入图片描述

二、微信小程序抓包 - 分析

1、打开Charles抓包工具,启动模拟器,进入微信
在这里插入图片描述
2、搜索小程序offershow,打开进入,岗位搜索,输入关键词:“python”
在这里插入图片描述
3、生成token接口分析,接口url:https://www.ioffershow.com/V4/silent_login
提示:第一次打开,需要请求这个接口提交js_code参数才能拿到token,headers添加一个token即可风雨无阻
在这里插入图片描述
4、刷新token接口分析,小程序每隔一段时间会刷新token
接口url:https://www.ioffershow.com/V4/refresh_token
请求该接口时,提交当天服务器返回的任意一个token,即可请求成功获得新的token;
在这里插入图片描述
下图使用postman工具模拟请求刷新token接口,Postman API测试工具 基本使用:https://blog.csdn.net/EXIxiaozhou/article/details/128333884
在这里插入图片描述
5、search_salary、根据关键词进行接口请求,url:https://www.ioffershow.com/V4/search_salary
在这里插入图片描述
可以看到返回的json数据
在这里插入图片描述

三、wxapkg反编译 - 分析

1.在夜神模拟器获取微信程序员的包

1.1 获取wxapkg的地址

方式一、直接全局搜索文件后缀(.wxapkg)
点击右侧的任意处,再点击右上侧的三个点,选择搜索,输入.wxapkg
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
方法二、一般具体的文件目录地址是:/data/data/com.tencent.mm/MicroMsg/{一串16进制字符}/appbrand/pkg/
在这里插入图片描述

1.2 删除wxapkg文件重新生成

区分那些包是属于offershow小程序

  • 1.需要将微信的OfferShow小程序清除掉,再退出微信
  • 2.将原来已经生成的所有wxapkg文件删除
  • 3.重新登录微信,再次打开小程序再生成新的wxapkg文件
  • 4.再次打开模拟器存放wxapkg文件的目录,里面出现的wxapkg文件都属于OfferShow

1.3 复制wxapkg文件至windows目录,用来反编译调试

路径:/data/data/com.tencent.mm/MicroMsg/e8b469b0e57e32dd18d1293036fc556f/appbrand/pkg/
左侧找到windows本地目录,右侧找到模拟器存放wxapkg文件的目录,长按文件选择复制即可,全部复制;
在这里插入图片描述

2.使用CrackMinApp对.wxapkg文件进行反编译

1、将.wxapkg文件复制到CrackMinApp-master\wxapkg目录;
微信开发者工具 / 反编译工具CrackMinApp 下载安装:https://blog.csdn.net/EXIxiaozhou/article/details/128110468在这里插入图片描述
2、
将三个.wxapkg文件依次反编译,区分主包和依赖包,真正的小程序包大小1M左右,而依赖包大小2、3M甚至更多,将依赖包复制放入主包;
在这里插入图片描述
反编译之后的主包
在这里插入图片描述

3.使用微信开发者工具打开反编译好的主包开始调试

在这里插入图片描述

4.分析结果

我调试到最后,发现js_code的加密代码被隐藏了,到此结束,如果有大佬知道加密方式的话,欢迎在评论处指教,非常感谢;
我的做法是手动复制当天服务器返回的token去请求刷新token的接口,拿到最新的token去请求查询薪资的接口,最后将数据保存至xlsx;

四、运行结果

输出xlsx文件
在这里插入图片描述

五、示例代码

import os
import time
import requests
import pandas as pd


class OfferShow(object):
    def __init__(self):
        # 当天的任意token
        self.ord_token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTAwNDI2MSwibmlja25hbWUiOiJcdTcwZWRcdTVmYzNcdTc1MjhcdTYyMzciLCJleHAiOjE2Njk2NDY0OTEsIm9yaWdfaWF0IjoxNjY5NjQ1ODkxfQ.cWukvcTzgtQGyIVjzRT4Lr2Dcm1Y3Nnfov-bEX0QwfY'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Linux; Android 7.1.2; SM-G9810 Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36 MMWEBID/5551 MicroMessenger/8.0.30.2260(0x28001E3A) WeChat/arm32 Weixin NetType/WIFI Language/zh_CN ABI/arm32 MiniProgramEnv/androidUser-Agent	Mozilla/5.0 (Linux; Android 7.1.2; SM-G9810 Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36 MMWEBID/5551 MicroMessenger/8.0.30.2260(0x28001E3A) WeChat/arm32 Weixin NetType/WIFI Language/zh_CN ABI/arm32 MiniProgramEnv/android',
            'content-type':	'application/x-www-form-urlencoded',
            'token': self.ord_token,
            'Accept-Encoding': 'gzip,compress,br,deflate'
        }
        self.xueli = ''
        self.result_file_path = 'OfferShow_salary.csv'

    def get_token(self):
        refresh_token_url = 'https://www.ioffershow.com/V4/refresh_token'
        form_data = {
            'token': self.ord_token
        }
        token_response = requests.post(url=refresh_token_url, headers=self.headers, data=form_data)
        token = token_response.json()['data']['token']
        print("token获取成功:", token)
        return token

    def search_salary(self, keyword):
        salary_url = 'https://www.ioffershow.com/V4/search_salary'
        from_data = {
            'content': keyword,
            'ordertype': 2,
            'search_priority': 3,
            'part_school': '',
            'xueli': self.xueli,
            'year': ''
        }
        salary_response = requests.post(url=salary_url, headers=self.headers, data=from_data)
        json_data = salary_response.json()['data']
        for item in json_data:
            content = f"{keyword},{item['id']},{item['company'].replace(',', ',')},{item['position'].replace(',', ',')}" \
                      f",{item['salary'].replace(',', ',')},{item['city'].replace(',', ',')}," \
                      f"{item['hangye'].replace(',', ',')},{item['xueli']},{item['salarytype']},{item['score']},{item['time']}"
            content = content.replace('\n', '').replace('\n', '') + '\n'
            self.csv_save(content=content)
            print("写入成功:", content, end='')

    def create_csv_file(self):
        if os.path.exists(self.result_file_path) is False:
            with open(file=self.result_file_path, mode='w', encoding='utf-8') as fis:
                fis.write('关键词,薪资ID,公司,岗位,薪资,城市,行业,学历,薪资类型,可信度,发布时间\n')

    def csv_save(self, content):
        with open(file=self.result_file_path, mode='a+', encoding='utf-8') as fis:
            fis.write(content)

    def csv_save_as_xlsx(self):
        """ 读取csv文件将结果写入xlsx """
        filename_prefix = os.path.splitext(self.result_file_path)[0]  # 切割文件路径以及后缀
        df = pd.read_csv(self.result_file_path, encoding='utf-8', dtype='object')
        df.to_excel(f"{filename_prefix}.xlsx", index=False)
        print("csv 转 xlsx 成功!\n", end='')

    def runs(self, keyword_list):
        self.create_csv_file()
        token = self.get_token()
        self.headers['token'] = token
        for keyword in keyword_list:
            self.search_salary(keyword=keyword)
            time.sleep(0.25)
        self.csv_save_as_xlsx()


if __name__ == '__main__':
    keywords_list = [
        'Python', 'Java', 'Php', 'JavaScript', 'Go', 'R语言', 'MATLAB', 'C++', 'C#', '后端', '前端', '算法', '人工智能',
        '软件测试', 'IT运维', '数据库', 'VisualBasic'
    ]  # 需要搜索的关键词
    obj = OfferShow()
    obj.runs(keywords_list)

总结

以上就是今天要讲的内容,本文仅仅简单介绍了微信小程序Spider的基本流程,也留下了一些bug,不过最后是拿到了想要的数据,关于其他的微信小程序Spider案例,请来我的主页查看;

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

微信小程序 Spdier - OfferShow 反编译逆向(一) 的相关文章

  • 如何在 PyCharm 中设置运行配置的默认工作目录

    当我想运行众多 python 脚本之一时 我点击运行 这会创建一个新的运行配置 该配置的工作目录是 python 脚本文件所在的文件夹 相反 它应该从项目范围的固定文件夹运行 我想以某种方式进行设置 但我真的不明白为什么 这有点奇怪 因为我
  • 在 Robot 框架中的测试套件中设置会话 cookie

    我的应用程序是一个 RESTful API 仅当会话 cookie 存在时才有效 不幸的是 我总是需要在一个网页登录获取 cookie 并传递会话cookie到 API 来建立会话 我能够找出解决方案来验证会话 cookie 并将其传递给
  • 删除 python vaex 中的重复行

    我正在使用 python vaex 但我不知道如何删除数据框中的重复行 例如 在 pandas 中存在以下方法drop duplicates vaex中有没有类似的功能 似乎还没有 但我们应该在某个时候期待这个功能 其间 有vaex创始人的
  • 将 SQLite 的 FTS3/4 与 Python 3 结合使用

    我一直在使用 python 的 Flask 框架开发 peewee 的示例博客应用程序 看https github com coleifer peewee https github com coleifer peewee 内部示例 gt 博
  • 在 Chaquopy 中转换数组和张量

    我该怎么做呢 我看到你的帖子说你可以将 java 对象传递给 Python 方法 但这不适用于 numpy 数组和 TensorFlow 张量 以下以及其各种变体是我尝试过的 但没有成功 double anchors new double
  • Windows 中的信号处理

    在Windows中 我试图创建一个等待SIGINT信号的python进程 当它收到SIGINT时 我希望它只打印一条消息并等待SIGINT的另一次出现 所以我使用了信号处理程序 这是我的 signal receiver py 代码 impo
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • CodingBat sum67:为什么这个解决方案是错误的?

    我正在解决以下codingbat问题 返回数组中数字的总和 但忽略以 6 开头并延伸到下一个 7 的数字部分 每个 6 后面至少有一个 7 如果没有数字则返回 0 sum67 1 2 2 5 sum67 1 2 2 6 99 99 7 5
  • 解析器生成

    我正在做一个项目软件抄袭检测 我打算用C语言来做这件事 因为我应该创建一个令牌生成器和一个解析器 但我不知道从哪里开始 任何人都可以帮助我解决这个问题 我创建了一个令牌数据库 并将令牌与我的程序分开 接下来我想做的就是比较两个程序以查明它是
  • 从 python 的单词列表中查找最长的常见单词序列

    我搜索了很多解决方案 确实发现了类似的问题 这个答案 https stackoverflow com questions 21930757 longest repeated substring返回可能不属于输入列表中所有字符串的最长字符序列
  • 为什么 1.__add__(2) 不起作用? [复制]

    这个问题已经存在了 可能的重复 访问 python int 文字方法 https stackoverflow com questions 10955703 accessing a python int literals methods 在P
  • 为 pandas 数据框中的两列创建邻接矩阵

    我有一个以下形式的数据框 index Name A Name B 0 Adam Ben 1 Chris David 2 Adam Chris 3 Ben Chris 我想获得邻接矩阵Name A and Name B ie Adam Ben
  • Google App Engine 开发服务器中的 PyCrypto“ImportError:无法导入名称 blockalgo”

    我有一个使用 PyCrypto 使用 AES 加密字符串的函数 当我在单元测试中调用该函数时 一切正常 在生产环境中 它也运行得很好 但是 在GAE开发服务器上调用该函数时 会抛出错误 ImportError 无法导入名称blockalgo
  • 来自异常导入 PendingDeprecationWarning ModuleNotFoundError:没有名为“异常”的模块

    我正在尝试使用Python 创建一个word 文档 我在终端中 pip install python docx 我的代码如下所示 from docx import Document document Document document sa
  • 解释 scipy.stats.entropy 值

    我正在尝试使用scipy stats 熵来估计库尔巴克 莱布勒 KL 两个分布之间的散度 更具体地说 我想使用 KL 作为衡量标准来确定两个分布的一致性 但是 我无法解释 KL 值 例如 t1 numpy random normal 2 5
  • 在Python中使用Counter()来构建直方图?

    我在另一个问题上看到我可以使用Counter 计算一组字符串中出现的次数 所以如果我有 A B A C A A I get Counter A 3 B 1 C 1 但现在 我如何使用该信息来构建直方图 对于您的数据 最好使用条形图而不是直方
  • 我的 R 平方分数为负,但使用 k 倍交叉验证的准确度分数约为 92%

    对于下面的代码 我的 r 平方分数为负 但使用 k 折交叉验证的准确度分数为 92 这怎么可能 我使用随机森林回归算法来预测一些数据 数据集的链接在下面的链接中给出 https www kaggle com ludobenistant hr
  • 为什么 Python 布尔值占用超过一个字节?

    显然 Python 中整数占用 24 个字节 我可以理解 它这样做是因为代表无限数字的额外花哨 然而 布尔数据类型看起来也花费了高达 24 个字节 尽管它只能表示两个可能值之一 为什么 除了 1 位表示之外 还可能需要存储哪些额外数据Tru
  • numpy 中的分层抽样

    在 numpy 中我有一个这样的数据集 前两列是索引 我可以通过索引将数据集分成多个块 即第一个块是 0 0 第二个块是 0 1 第三个块 0 2 然后是 1 0 1 1 1 2 等等 每个块至少有两个元素 索引列中的数字可能会有所不同 我
  • 仅在满足条件时添加到字典

    我在用urllib urlencode构建 Web POST 参数 但是有一些值我只想在除None为他们而存在 apple green orange orange params urllib urlencode apple apple or

随机推荐

  • 百度搜索中url的参数解析

    转载请注明 藏羚骸的博客 百度搜索中url的参数解析 小伙伴们在写爬虫程序的时候 可能会用到部分参数使用 这里整理了 百度搜索中url的参数解析 免费查询快递物流 wd 查询的关键词 pn 已显示的结果条数 即当前页从pn条记录开始显示 该
  • 轮询调度算法(Round-Robin Scheduling)

    轮询调度算法 Round Robin Scheduling 毫无疑问 随着互联网 移动网络接入成本的降低 互联网正在日益深入地走入我们的生活 越来越成为人们获取信息的高效平台 ICP行业也顺势呈现出强劲的成长趋势 成为互联网迅猛发展形势下最
  • 服务器被ddos攻击了怎么处理

    服务器被DDOS攻击是很常见的事情 但对于网站管理员来说 这可能是一件非常麻烦的事情 那么 当服务器被DDOS攻击时 我们应该怎么处理呢 第一步 尽快确定服务器是否真的被DDOS攻击了 可以使用网站监控工具或者联系服务器提供商确认情况 第二
  • RSA 加密算法原理简述

    概述 本文旨在说明RSA加密算法的原理及实现 而其相关的数学部分的证明则不是本文内容 版权说明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 作者 Q WHai 发表日期 2016年2月29日 本文链接 http bl
  • MySQL5.7版本安装配置教程(超级详细)

    一 下载MySQL Mysql官网下载地址 MySQL Download MySQL Installer Archived Versions 选择要安装的版本 本篇文章选择的是5 7 31版本 点击Download下载 二 安装MySQL
  • 国内电脑行业数据浅析

    大家好 这里是小安说网控 信息时代 电脑成了办公标配 但受经济环境与疫情的双重影响 电脑行业整体情况不算理想 2022年1 8月 我国电脑行业累计产量29267 7万台 同比减少6 1 不仅产量 销量也有所下降 据Canalys发布的调研报
  • 多线程学习之线程生命周期

    线程生命周期中 线程状态切换关系如下图 线程各个状态直接切换说明 new Thread至Runnable状态 调用thread的start方法进入Runnable状态 但是现在线程并没有运行 相当于一个thread对象放到了内存中 等待调度
  • 实现数据导入+导入模式+导入案列

    导入模式 模式 参数 说明 操作角色 full full 导入整个数据库 imp full database schema schmas 导入用户模式中的数据和元数据 imp full database table tables 导入表和表
  • 三线调速风扇原理_风机盘管的工作原理和检修方法

    风机盘管是中央空调中典型的末端产品 主要是利用风扇组件作用 使空气与盘管中的冷水或热水进行热交换 并将降温或升温后的空气输出 风机盘管的封装形式有所不同 可以根据不同的需求选择不同的封装形式进行安装 比较常见的有吊顶暗装风机盘管 吊顶明装风
  • 2022mpsPTE岗位笔试题

    2022年9月完成了PTE岗位的笔试 并通过了 浅浅的还有一点印象 之前有朋友也想来 就放在这里 供需要的朋友看 前两个题是关于C语言的 语言不限 C 也可 一个是输出2到100偶数之和 主要就是调用for循环 一个是输入一个数 输出这个数
  • SpringCloud集成Nacos并使用

    摘要 今天分享下 SpringCloud 集成 Nacos 并使用 的一些基本知识 欢迎关注 欢迎阅读 总结系列 SpringCloudAlibaba 实战搭建 项目父模块 pom xml 配置
  • lgb(lightgbm)处理类别特征遇到的问题(泰坦尼克):

    1 lgb lightgbm 处理类别特征遇到的问题 ValueError DataFrame dtypes for data must be int float or bool Did not expect the data types
  • windows下使用vscode远程连接Linux服务器进行开发

    windows下使用vscode远程连接Linux服务器进行开发 一 安装远程开发插件Remote Development 1 在商店中搜索 Remote Development 并安装 2 选择SSH Targets 3 新建远程连接 4
  • mysql 数据类型

    1 整数类型 TINYINT SMALLINT MEDIUMINT INT BIGINT 分别使用 8 16 24 32 64位存储空间 存储范围是 2的 n 1 次方到2的 n 1 次方 1 其中n是存储空间位数 unsigned属性不允
  • 如何在uni-app正确使用web-view

    可以定义一个内部页面 就只放一个web view 然后在列表点击的时候 跳转到该内部页面 并且把需要打开的链接传递到该页面
  • vector::erase() vector中如何删除元素?

    vector erase 从指定容器删除指定位置的元素或某段范围内的元素 vector erase 方法有两种重载形式 如下 1 iterator erase iterator Where v1 erase v1 begin 删除v1中的第
  • MongDB解决Authentication Failed导致的不能连接问题

    MongoDB的安装 Step1 打开MongoDB产品下载页面https www mongodb com download center jmp nav community 选择Windows Server 2008 R2 64 bit
  • linux标准库unistd.h

    unistd h是unix std的意思 是POSIX标准定义的unix类系统定义符号常量的头文件 包含了许多UNIX系统服务的函数原型 unistd h在unix中类似于window中的windows h ifdef WIN32 incl
  • 微信小程序秀才成语接龙趣味答题小游戏带流量主无授权源码

    介绍 流量主带 横屏广告 视频广告 插屏广告 激励广告 趣味性很强 会推广运营肯定能赚一笔 这套源码也是淘宝买的 网盘下载地址 http kekewangLuo cc j27EjMGhsPL0 图片
  • 微信小程序 Spdier - OfferShow 反编译逆向(一)

    微信小程序 Spdier OfferShow 反编译逆向 一 文章目录 微信小程序 Spdier OfferShow 反编译逆向 一 前言 一 任务说明 1 尝试反编译分析出js code参数的生成方式 用来获取token 2 将小程序搜索