【JS逆向系列】站大爷免费代理IP

577 阅读3分钟

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!


前言

目标地址:aHR0cHM6Ly93d3cuemRheWUuY29tL0ZyZWVJUExpc3QuaHRtbA==


一、页面分析

常规操作,先看下源码有没有IP数据,发现后缀都被wait替换了,然后取xhr看看是不是动态加载

在这里插入图片描述 在这里插入图片描述

只有这么个玩意,看来不是 在这里插入图片描述

再来判断是否是CSS字符加密,字体转以后一般是这样类型得𘡒𘡓𘡓𘡏𘡒&#100435,看来也不是字体加密,那估计就是JS调用修改了


二、参数加密定位

经过调试发现xhr里的这个地址返回数据一直再变化,先下xhr断点看看 在这里插入图片描述

跟栈到这里发现了xhr链接得生成位置 在这里插入图片描述 然后mk,ak在这包里,其中am是不变,ak是变化的 在这里插入图片描述 这里的k就是xhr返回得数据,然后再循环里使用,应当是一个解密得key值 在这里插入图片描述 在这里插入图片描述


三、参数解密

先看$.showm方法,生成32位得数据,其实是MD5得加密,可以自行测试 在这里插入图片描述 在这里插入图片描述

这个sdfsgfdg是对m分割,然后取ascii码进行字符拼接 在这里插入图片描述 在这里插入图片描述

这个dsfgsd是对#分割,然后取ascii码进行字符拼接 在这里插入图片描述

在这里插入图片描述 参数得解密方法都已经获取,只需要拿到加密得ip和ak,ck,即可得到完整得ip


4、源码分享

# -*- coding: utf-8 -*-
'''
@File:      run.py
@SourceUrl: https://www.zdaye.com/FreeIPList.html
@Author:    阿J
@Date:      2021/3/22 16:04
@Software:  PyCharm
@Desc:      站大爷
'''
import re
import requests,hashlib
import time
from lxml import etree


headers = {
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
    'Accept': 'text/plain, */*; q=0.01',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Dest': 'empty',
    'Referer': 'https://www.zdaye.com/FreeIPList.html',
    'Accept-Language': 'zh-CN,zh;q=0.9',
}



def MD5(p):
    return hashlib.md5((p).encode()).hexdigest().upper()

def sdfsgfdg(s):
    s2 = s.split('m')
    ts = ''
    for i in range(len(s2)-1,-1,-1) :
        ts += chr(int(s2[i])-352)
    return ts

# s:367#367#367#367 kk:key
def dsfgsd(s, kk):
    s2 = s.split("#")
    ts = ""
    for i in range(len(s2)-1,-1,-1):
        ts += chr(int(s2[i])-kk)
    return ts

def get_keyUrl(mk,ak):
    url = "https://www.zdaye.com"+"/" + mk + "_" + MD5(MD5(sdfsgfdg(mk) + "beiji" + ak)) + ".gif"
    return url

# print(get_keyUrl('400m403m401m398m401m407m401m398m407m401m398m402m401m401','32912'))

session = requests.session()
res = session.get('https://www.zdaye.com/FreeIPList.html',headers=headers).text

# 获取加密的ip
selector = etree.HTML(res)
trs = selector.xpath('//*[@id="ipc"]/tbody/tr')
ip_infos = []
# num = 1
for tr in trs:
    ip_1 = tr.xpath('./td[1]/text()')[0]
    ip_2 = tr.xpath('./td[1]/@v')[0]
    ip_infos.append((ip_1,ip_2))
    # # 保存验证码图片
    # with open('{}.jpg'.format(num),'wb') as f:
    #     igm_url = 'https://www.zdaye.com'+tr.xpath('./td[3]/img/@src')[0]
    #     f.write(session.get(igm_url,headers=headers).content)
    # num+=1
print('解密前:',ip_infos)

# 获取加密参数
t = str(time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())).replace(' ','%20').replace('/0','/')
url = 'https://www.zdaye.com/js/base.js?'+t
print(url)
pp = session.get(url,headers=headers).text
mk = re.findall('mk = "(.*?)"',pp)[0]
ak = re.findall('ak = "(.*?)"',pp)[0]
print(mk,ak)

key_url = get_keyUrl(mk,ak)
print(key_url)

key = session.get(key_url,headers=headers).text
print('解密得key:',key)

# 解密IP
ip_new = []
for info in ip_infos:
    ip = info[0].replace('wait',dsfgsd(info[1],int(key)))
    ip_new.append(ip)
print('解密后:',ip_new)


在这里插入图片描述