破解加密

一.CSS加密

CSS加密:比较简单
CSS —> 层叠样式表,操作样式
CSS都是对字体进行加密处理的,在网页源代码中显示[&#x+16进制数;]
分析:

  1. 找到css加密文件即可
    @font-face是CSS中的一个模块,
    作用:可以将自定义的字体嵌入到网页中,让网页的字体不仅仅限定在WEB安全字体
  2. 从css文件中找到包含字体的woff文件
    有时候会出现多个woff,多个里面肯定会有一个或者几个woff文件是对网页的字体进行加密的。
    为什么会有多个?
    原因:
  3. 为了混淆分析者思路。
  4. 为了方便可以随时更换woff文件,更改woff文件后,页面中的16进制数同样发生变化

解决方法:替换,需要我们生成一个字典{‘16进制数’:‘对应的值’}

步骤:

  1. 找到存放woff文件的css链接,并请求
  2. 找到woff文件的url,并请求(下载woff文件)
  3. 通过TTFont模块读取woff文件,得到16进制数
  4. 手动生成一个字典(作用:汉字和16进制数的对照表)
  5. 将页面中的16进制数替换成真实值
  6. 以上完成,css解密即可完成

import requests,re
from fontTools.ttLib import TTFont

# 定义生成字典函数
def get_dict(url):
    # 对css链接发起请求
    response = requests.get(url=url,headers=headers)
    # 制定获取分类名规则
    type_name_patten = re.compile(r'"PingFangSC-Regular-(.*?)";')
    # 获取分类
    type_name_list = type_name_patten.findall(response.text)

    # 定义提取woff文件的规则
    woff_url_pattern = re.compile(r',url\("(.*?)"\)')
    # 获取woff链接
    woff_url_list = woff_url_pattern.findall(response.text)
    # 请求每一个woff文件
    for type_name,woff_url in zip(type_name_list,woff_url_list):
        # 拼接成完整的woff链接
        woff_url_full = 'http:'+woff_url
        # 获取文件名
        woff_name = woff_url_full.split('/')[-1]
        # 发起请求
        woff_response = requests.get(url=woff_url_full,headers=headers)
        # 保存文件
        # 注意:woff文件不是文本类型,是二进制的数据
        with open(type_name+'-'+woff_name,'wb') as fp:
            fp.write(woff_response.content)

        # 读取文件
        woff_font = TTFont(type_name+'-'+woff_name)

        # 保存xml格式数据
        # woff_font.saveXML('woff.xml')

        # 获取16进制数
        woff_font_content = woff_font.getGlyphOrder()
        # 去除前面两个内容
        keys = woff_font_content[2::]
        data = {}
        for k,v in zip(keys,woff_list):
            data[k] = v
        type_dic[type_name] = data
        # for k,v in zip(keys,woff_list):
        #     data[k] = v
            # print(woff_font_content)
        # print(woff_url)
    ...

# 定义函数
def get_content():
    # 发起请求,接收响应
    response = requests.get(url=base_url,headers=headers)
    # 获取页面内容
    content = response.text
    # 提取css链接
    # 指定提取css链接规则
    css_href_pattern = re.compile(r'href="(//s3plus.*?)"')
    css_href = css_href_pattern.findall(content)[0]
    # 拼接完整链接
    css_full_href = 'http:' + css_href
    get_dict(css_full_href)
    # 开始替换
    # for k,v in data.items():
    #     # 替换
    #     content = content.replace('&#x'+k[-4::]+';',v)

    # 获取评价及人均价格
    get_shopNum(content)
    print(type_dic)


# 定义获取评价和人均价格的函数
def get_shopNum(content):
    shopNum  = type_dic['shopNum']
    # 开始替换
    for k,v in shopNum.items():
        # 替换
        content = content.replace('&#x'+k[-4::]+';',v)
    print(content)
    ...


if __name__ == '__main__':
    # type_dic = {'tagName':{'16进制数':'值'},'shopNum':{'16进制数':'值'},'address':{16进制数:值},'reviewTag':{16进制数:值}}
    type_dic = {}
    # 定义基础URL
    base_url = 'http://www.dianping.com/beijing/ch10'
    # 定义请求头字典
    headers = {
        'user-agent': '网页上的用户代理',
    }
    # 定义woff_list
    woff_list = ['1', '2', '3', '4', '5', '6', '7', '8',
                 '9', '0', '店', '中', '美', '家', '馆', '小', '车', '大',
                 '市', '公', '酒', '行', '国', '品', '发', '电', '金', '心',
                 '业', '商', '司', '超', '生', '装', '园', '场', '食', '有',
                 '新', '限', '天', '面', '工', '服', '海', '华', '水', '房',
                 '饰', '城', '乐', '汽', '香', '部', '利', '子', '老', '艺',
                 '花', '专', '东', '肉', '菜', '学', '福', '饭', '人', '百',
                 '餐', '茶', '务', '通', '味', '所', '山', '区', '门', '药',
                 '银', '农', '龙', '停', '尚', '安', '广', '鑫', '一', '容',
                 '动', '南', '具', '源', '兴', '鲜', '记', '时', '机', '烤',
                 '文', '康', '信', '果', '阳', '理', '锅', '宝', '达', '地',
                 '儿', '衣', '特', '产', '西', '批', '坊', '州', '牛', '佳',
                 '化', '五', '米', '修', '爱', '北', '养', '卖', '建', '材',
                 '三', '会', '鸡', '室', '红', '站', '德', '王', '光', '名',
                 '丽', '油', '院', '堂', '烧', '江', '社', '合', '星', '货',
                 '型', '村', '自', '科', '快', '便', '日', '民', '营', '和',
                 '活', '童', '明', '器', '烟', '育', '宾', '精', '屋', '经',
                 '居', '庄', '石', '顺', '林', '尔', '县', '手', '厅', '销',
                 '用', '好', '客', '火', '雅', '盛', '体', '旅', '之', '鞋',
                 '辣', '作', '粉', '包', '楼', '校', '鱼', '平', '彩', '上',
                 '吧', '保', '永', '万', '物', '教', '吃', '设', '医', '正',
                 '造', '丰', '健', '点', '汤', '网', '庆', '技', '斯', '洗',
                 '料', '配', '汇', '木', '缘', '加', '麻', '联', '卫', '川',
                 '泰', '色', '世', '方', '寓', '风', '幼', '羊', '烫', '来',
                 '高', '厂', '兰', '阿', '贝', '皮', '全', '女', '拉', '成',
                 '云', '维', '贸', '道', '术', '运', '都', '口', '博', '河',
                 '瑞', '宏', '京', '际', '路', '祥', '青', '镇', '厨', '培',
                 '力', '惠', '连', '马', '鸿', '钢', '训', '影', '甲', '助',
                 '窗', '布', '富', '牌', '头', '四', '多', '妆', '吉', '苑',
                 '沙', '恒', '隆', '春', '干', '饼', '氏', '里', '二', '管',
                 '诚', '制', '售', '嘉', '长', '轩', '杂', '副', '清', '计',
                 '黄', '讯', '太', '鸭', '号', '街', '交', '与', '叉', '附',
                 '近', '层', '旁', '对', '巷', '栋', '环', '省', '桥', '湖',
                 '段', '乡', '厦', '府', '铺', '内', '侧', '元', '购', '前',
                 '幢', '滨', '处', '向', '座', '下', '県', '凤', '港', '开',
                 '关', '景', '泉', '塘', '放', '昌', '线', '湾', '政', '步',
                 '宁', '解', '白', '田', '町', '溪', '十', '八', '古', '双',
                 '胜', '本', '单', '同', '九', '迎', '第', '台', '玉', '锦',
                 '底', '后', '七', '斜', '期', '武', '岭', '松', '角', '纪',
                 '朝', '峰', '六', '振', '珠', '局', '岗', '洲', '横', '边',
                 '济', '井', '办', '汉', '代', '临', '弄', '团', '外', '塔',
                 '杨', '铁', '浦', '字', '年', '岛', '陵', '原', '梅', '进',
                 '荣', '友', '虹', '央', '桂', '沿', '事', '津', '凯', '莲',
                 '丁', '秀', '柳', '集', '紫', '旗', '张', '谷', '的', '是',
                 '不', '了', '很', '还', '个', '也', '这', '我', '就', '在',
                 '以', '可', '到', '错', '没', '去', '过', '感', '次', '要',
                 '比', '觉', '看', '得', '说', '常', '真', '们', '但', '最',
                 '喜', '哈', '么', '别', '位', '能', '较', '境', '非', '为',
                 '欢', '然', '他', '挺', '着', '价', '那', '意', '种', '想',
                 '出', '员', '两', '推', '做', '排', '实', '分', '间', '甜',
                 '度', '起', '满', '给', '热', '完', '格', '荐', '喝', '等',
                 '其', '再', '几', '只', '现', '朋', '候', '样', '直', '而',
                 '买', '于', '般', '豆', '量', '选', '奶', '打', '每', '评',
                 '少', '算', '又', '因', '情', '找', '些', '份', '置', '适',
                 '什', '蛋', '师', '气', '你', '姐', '棒', '试', '总', '定',
                 '啊', '足', '级', '整', '带', '虾', '如', '态', '且', '尝',
                 '主', '话', '强', '当', '更', '板', '知', '己', '无', '酸',
                 '让', '入', '啦', '式', '笑', '赞', '片', '酱', '差', '像',
                 '提', '队', '走', '嫩', '才', '刚', '午', '接', '重', '串',
                 '回', '晚', '微', '周', '值', '费', '性', '桌', '拍', '跟',
                 '块', '调', '糕']
    get_content()
    
二.Base64 加密

# 安居客:base64加密,属于css加密的一种
# 思路:
# 1. 请求页面,获取base64加密的字符串
# 2. 使用base64模块进行解密
# 3. 定义字典{16进制数:真实的值}
# 4. 替换即可

import requests,re,base64,io
from fontTools.ttLib import TTFont

def get_dict(base64_content):
    # 加加密的内容,进行解密,需要使用base64模块,返回二进制类型数据
    real_content = base64.b64decode(base64_content)
    # 保存到woff文件中
    with open('anjuku.woff','wb') as fp:
        fp.write(real_content)
    # print(real_content)

    # 读取内容
    # TTFont(文件)  ---> 读取文件
    # TTFont(bytes)  ---->  读取二进制类型的内容,内存io,需要使用io模块
    font = TTFont(io.BytesIO(real_content))
    # 保存到xml中
    # font.saveXML('ajk.xml')

    # 获取cmap
    # getBestCmap():返回一个字典,字典中的key是10进制数
    cmap = font.getBestCmap()
    dic = {hex(k):v for k,v in cmap.items()}

    # 找规律来对应
    data = {}
    for k,v in dic.items():
        data[k] = int(v[-2::])-1
    return data

def get_content():
    # 发起请求,接收响应
    response = requests.get(url=base_url,headers=headers)
    content = response.text
    # 提取base64加密的字符串
    base64_pattern = re.compile(r'base64,(.*?)\'\)')
    base64_content = base64_pattern.findall(content)[0]
    data = get_dict(base64_content)
    # 开始替换
    for k,v in data.items():
        content = content.replace('&#x'+k[-4::]+';',str(v))
    print(content)
    ...

if __name__ == '__main__':
    # 定义基础URL
    base_url = 'https://bj.zu.anjuke.com/?from=navigation'
    # 定义请求头
    headers = {
        'user-agent': '网页上的用户代理',
    }
    get_content()
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值