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

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



前言


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

一、任务说明

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

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

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

三、wxapkg反编译 - 分析

1.1 获取wxapkg的地址

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

1.2 删除wxapkg文件重新生成

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

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

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

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

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(
, ).replace(
, ) + 

            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,公司,岗位,薪资,城市,行业,学历,薪资类型,可信度,发布时间
)

    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 成功!
", 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)

总结

经验分享 程序员 微信小程序 职场和发展