爱收集资源网

公众号迁移请求流程解析

网络 2023-06-24 12:01

提示!本文章仅供学习交流,禁止用于非法用途,文章如有不当可联系本人删掉!该文章为本人于2021.8.27在CSDN发布,迁移至公众号一、请求流程剖析

①一般是两次get+ajax,第一次get+ajax获得challenge使其有效,第二次get+ajax即获取验证码与校准验证码

②每个应用网站还会对应一个惟一的id值即gt,在获取验证码之前会初始化并校准获得第一个有效challenge,携带有效的challenge后可以获得验证码

③验证码校准的过程会涉及到w参数,w参数逆向是关键,校准通过则返回validate值

④整个流程主要涉及如下4个恳求包,具体网站具体剖析

⑤第一个链接初始化获得challenge,gt值

⑥第二个链接ajax.php校准challenge,此时出现一次w值(可置空,可固定,可能要js生成),具体网站具体剖析,本次案例此处w值不研究,直接置空

⑦第三个链接get.php携带有效challenge恳求获得图片链接,该图片是个正序图片,还须要还原;假如有返回challenge则代替上面的第一个challenge,同时恳请图片的响应会返回c和s参数,在前面研究w参数加密会用到这两个

⑧第四个链接ajax.php校准图片,携带challenge,w值,w值的加密会涉及到轨迹信息,轨迹是一难点,随便生成的轨迹并不可用,需尽量趋于人为的轨迹曲线,以及上面的c和s参数校准通过则返回validate

二、乱序背景还原逆向

①从网页领到的图片是正序的,还原后如下

>>>>>>>>

②逆向剖析:因为验证码图片是通过Canvas画布画下来的,所以我们这儿直接通过窃听Canvas下断点,之后就可以调试即可发觉还原正序代码的关键部份

③getImageData(x,y,width,height):开始复制的左上角位置的x座标、左上角位置的y座标,width要复制的圆形区域的厚度、height要复制的圆形区域的高度

④putImageData(imgData,x,y,dirtyX):将图象数据(从指定的ImageData对象)放回画布上,左上角位置的x座标、左上角位置的y座标,

⑤原图是260×160的图片,由正序的2×26份的10×80小图片拼接而成,按照形参依次判定去正序的图片上面去取这52份小图片之后依次拼接则产生原始图片

⑥还原代码:根据如上还原逻辑,代码如下

⑥Image.new(mode,(width,height)):创建新图片

js实现图片闪烁_js实现出现验证码图片_js实现当鼠标移到图片时出现阴影移出是阴影消失

⑥image.crop(x1,y1,x2,y2):左上角点到右下角点进行切割图片

⑥image.paste(im,box):box为要粘贴到的区域,box类型为(x1,y1):将im左上角对齐(x1,y1)点,其余部份粘贴,超出部份抛弃

from PIL import Image

image = Image.open('./luanxu.png')
standard_img = Image.new("RGBA", (260160))
position = [3938484941404647353450513332282927263637313044454342121323221415212089252467320111104519181617]
s, u = 8010
for c in range(52):
    a = position[c] % 26 * 12 + 1
    b = s if position[c] > 25 else 0
    im = image.crop(box=(a, b, a + 10, b + 80))
    standard_img.paste(im, box=(c % 26 * 1080 if c > 25 else 0))
standard_img.save("./restore_bg.png")

⑦识别缺口方法一:有一张原始的没有缺口的背景图,和一张带有缺口的图可用如下代码进行辨识

from PIL import Image


def get_slider_offset_method(pic_path, cut_pic_path, threshold=60):
    """比较两张图片的像素点RGB的绝对值是否小于阈值60,如果在阈值内则相同,反之不同"""
    pic_img = Image.open(pic_path)
    cut_img = Image.open(cut_pic_path)
    width, height = pic_img.size
    for x in range(40, width - 40):  # 从左往右
        for y in range(5, height - 10):  # 从上往下
            pixel1 = pic_img.load()[x, y]
            pixel2 = cut_img.load()[x, y]
            if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold:
                continue
            else:
                return x

三、案例剖析思路(w)

①目标研究参数,第4个链接的w参数,即校准图片的那种w参数,主要会涉及rsa+aes加密,aes的key参数是随机生成的,会通过rsa加密传给服务器

②确定了目标研究参数w参数,可以采用调用栈回溯的方式,这儿因为js文件做了一个unicode混淆字符串加密,所以我们直接通过搜索w的unicode码"\u0077":来找寻加密位置并打断点,w=_+s,所以只要研究s和_即可

③我们先研究s参数,攻入断点步入psgR这个函数

④s参数:发觉最后返回的是r参数,而这个r参数的加密方法本质是个rsa加密,rsa加密须要两个参数:私钥+待加密文本,那只须要调试进去找到私钥即可(此处省略,自行调试)

⑤s参数:那待加密文本即aes_key是如何生成的,我们可以步入t[MIDa(753)]这个函数逐渐看一下,一下就发觉了加密逻辑,就是4个S4()函数组成

⑥s参数:用python还原rsa加密,传入私钥和待加密文本aes_key即可

import rsa
from binascii import b2a_hex


def rsa_encrypt_text(key, _text: str):
    """
    RSA加密
    :param key: 公钥的参数
    :param _text: 待加密的明文
    :return: 加密后的数据
    """

    e = int('010001'16)
    n = int(key, 16)
    pub_key = rsa.PublicKey(e=e, n=n)
    return b2a_hex(rsa.encrypt(_text.encode(), pub_key)).decode()

⑦`参数:`参数和u参数有关,先看u参数,这个u参数分解下,传入了带加密文本o参数(传入前进行了字典转字符串操作即JSON.stringify())和上面随机生成的aes_key,其中这个o参数我们前面再剖析

⑧_参数的u参数:深入u参数加密函数ee[rndd(365)]再具体剖析,对aes的加密结果进行了一个转链表的操作

⑨_参数的u参数:继续深入看aes加密是CBC加密模式,所以只要3个参数:key,iv,待加密文本,key就是上面所说的aes_key,待加密文本是传进来的(前面具体剖析),iv参数调试找到为"0000000000000000",js代码实现,那u参数已研究完

⑩_参数:是对上面的u参数又做了一层加密,这个加密也比较好扣,省略

11、w参数:w=_+s,上面和s参数合成即可,至此w参数加密已完成研究,细节部份继续往前看

12、w参数>_参数>u参数>o参数剖析:可变参数剖析,我们注重看下aa参数和userresponse参数

13、aa参数:aa参数unicode码"\u0061\u0061",我们发觉是上一个函数传过来的,也就是现今的t值

14、aa参数:向前回溯看上一个函数,发觉对应的是f值,也就是aa现今就是f值,只要看f值是如何生成的,此处打断点,重新调试,可见f是一个函数的返回结果,传入的三个参数分别对应着:轨迹加密、响应的c、s参数

15、aa参数:r[LsRU(1063)][LsRU(1047)]()就是对轨迹加密的,其中r[LsRU(1063)]就是传入的链表轨迹,步入SOQd就可以看具体的轨迹加密逻辑,扣完SOQd()这个函数,轨迹加密就有了

16、aa参数的轨迹:轨迹生成传入,此处需注意你的轨迹是叠加传入的值,还是早已做了加法的值,这涉及到你要不要再加个e函数进行差减;轨迹生成可网上自行查找

17、如我传的xyt_list是这些格式(x和t早已做了差):[[28,34,0],[1,0,45],[3,0,63],[4,-1,8],[4,0,9],[3,0,7],[4,0,9]…..

18、而非这些格式(x和t都是累加的):[[-31,-19,0],[0,0,0],[1,0,36],[2,0,44],[2,0,52],[4,0,61],[6,0,69],[8,0,77],[14,0,85],[17,0,92],[21,1,99],[25,2,106],…..

19、userresponse参数:U函数加密结果返回而得,传入滑块距离和challenge,除去冗余代码,U函数可以直接扣下来

20、rp参数:对gt、challenge、passtime进行了md5加密

21、最终疗效

js实现出现验证码图片
上一篇:完美者网站改版,独门技巧大揭秘! 下一篇:没有了