目 录CONTENT

文章目录

JS逆向案例002:解数字文本混淆

克林空间
2024-02-05 / 0 评论 / 0 点赞 / 82 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-02-05,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

📌免责声明:本文章涉及到的代码仅供学习交流使用,不得用于任何商业用途,数据来源于互联网公开内容,没有获取任何私有和非公开权限的信息(个人信息等)。由此引发的任何法律纠纷与本人无关。禁止将本文技术或者本文所关联的Github项目源码用于任何除学习外的目的。

以查询页面https://www.guazi.com/buy为例,说明获取数据方法。

分析

通过开发者工具发现该页面有数字字体加密,使得数字在响应里无法查看真实结果:

查看响应数据预览,可以发现文本数据可正常解析,但是价格数据被加密,需要进行还原。
6qpcw
在开发者工具的字体过滤器中,可以发现该页面下载了2组字体文件,如图:
b3f47
查看Fetch/XHR可知,第一个字体是通过接口返回,字体接口如图:
7qphk

恢复

由以上分析可得出解决思路:

  1. 下载特殊字体文件;
  2. 找到真实字形与字符码之间的映射关系;
  3. 替换响应数据里的数字字符。

首先我们直接下载https://oss.guazi.com/gzim/3800eb83-6f43-4a68-9395-2b80040dab4e.woff2字体文件,保存到本地。
由于这次字符加密的范围比较小,只有数字0-9共10个字符,并且经观察页面并不存在动态字体的机制,所以只需要做静态分析映射即可。
通过字体编程器如在线的font.qqe2.com(还有其它的,如果无法加载就换一个,比如https://kekee000.github.io/fonteditor/)或本地字体工具fontcreator打开字体文件。可以得到如下图所示结果:
s8a3e
从图中可以分析得出编码与字形之间的映射关系。比如:57808对象数字8,58148对应数字2,按照此规则,按前面中返回的加密字符前后缀,更换编号格式,即可以建立映射字典。


# 根据woff字体文件分析出的编码与数字间的静态映射  
code_number_map = {  
    '': '0',  
    '': '1',  
    '': '2',  
    '': '3',  
    '': '4',  
    '': '5',  
    '': '6',  
    '': '7',  
    '': '8',  
    '': '9'  
}

然后用以上映射逐个替换返回值中的加密字段即可。


# item中包含加密数字的属性列表  
encrypt_code_list = ['road_haul', 'first_pay', 'price']  
  
# 逐个替换加密数字  
for item_key in encrypt_code_list:  
    temp_attribute = item[item_key]  
    for key, number in code_number_map.items():  
        temp_attribute = temp_attribute.replace(key, number)  
    print(temp_attribute)
    

另外,如果网站使用了更复杂的文本加密措施,就需要使用font tools库,直接用字体文件中的信息进行动态映射。

0

评论区