深度解析数美点选验证逆向流程

本文将使用一个全新的编程语言,来详细解析数美点选验证的逆向流程。涵盖的内容包括抓包分析、代码混淆处理、请求参数解析等步骤。通过这些步骤,我们将揭示验证流程中的核心请求,提取验证图片及文字信息,最终通过代码构造出正确的坐标数据进行验证。

目标网站与抓包分析
目标网站为:

bash


aHR0cHM6Ly9zZWN1cmUuZWxvbmcuY29tL3Bhc3Nwb3J0L2xvZ2luX2NuLmh0bWw/bmV4dHVybD1odHRwczovL3d3dy5lbG9uZy5jb20v
目标是分析数美点选验证流程中的关键请求,并逆向其参数生成过程。以下是需要重点分析的三个核心请求:

https://captcha1.fengkongcloud.cn/ca/v2/fverify
https://captcha1.fengkongcloud.cn/ca/v1/register
https://captcha1.fengkongcloud.cn/ca/v1/conf
解决动态JS无法调试问题
在进行抓包分析之前,需要解决动态JS文件加载的问题。该文件URL每次都会变化,导致断点无法稳定设置。可以使用Charles或mitmproxy拦截并替换动态JS URL,使其加载固定的本地JS文件。

Charles替换方法
使用Charles捕获目标请求,右键保存响应内容。
启用Charles的Map Local功能,将动态JS URL映射到本地保存的文件。
mitmproxy脚本替换方法
以下是mitmproxy的拦截脚本示例:

python

from mitmproxy import http
from mitmproxy.http import Request, Response

def request(flow):
    if flow.request.pretty_url.startswith("https://secure.elong.com/passport/login_cn.html?nexturl=https://www.elong.com/"):
        with open("res.html", mode="rb") as f:
            content = f.read()
        flow.response = Response.make(
            200,
            content,
            {"Content-Type": "text/html"}
        )

def response(flow: http.HTTPFlow):
    pass
代码混淆处理
首先抓取conf请求指向的api.js文件。该文件代码混淆严重,例如:

javascript

var _0x19e1cf = _0x136e2f[_0x2ae8e9(0x2fd)];
可以通过解混淆脚本处理:

ruby

require 'execjs'

def decode(hex_rg)
  context = ExecJS.compile(File.read('main.js'))
  context.call('decode', hex_rg)
end

def run
  File.open('f1.js', 'r:utf-8') do |fr|
    File.open('f2.js', 'w:utf-8') do |fw|
      fr.each_line do |line|
        line.gsub!(/(_0x\w+\((.*?)\))/) do |func_string|
          hex_str = $2
          decoded_str = decode(hex_str)
          "\"#{decoded_str}\""
        end
        fw.write(line)
      end
    end
  end
end

run
conf请求分析
分析conf请求中的核心参数:

appId: default
organization: xQsKB7v2qSFLFxnvmjdO
callback: sm_1705412287345
sdkver: 1.1.3
model: select
captchaUuid: 20240116213802Zwas5htESARemRJWfW
rversion: 1.0.4
lang: zh-cn
channel: DEFAULT
生成captchaUuid
captchaUuid由当前时间和17个随机字符组成:

ruby

def gen_captcha_uuid
  total_string = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
  part = Array.new(17) { total_string[rand(total_string.length)] }.join
  ctime = Time.now.strftime('%Y%m%d%H%M%S')
  "#{ctime}#{part}"
end
fverify请求分析
fverify请求包含多个加密参数,需要解密分析其生成过程。以下是需要分析的参数:

en
dy
xy
tb
mu
oc
mp
nu
qd
ww
kq
jo
分析加密函数
通过混淆处理后的代码,找到加密函数getEncryptContent:

javascript

getEncryptContent: function(data, key) {
    var cipher = CryptoJS.DES.encrypt(data, key);
    return cipher.toString(CryptoJS.enc.Base64);
}
利用Ruby实现该加密函数:

ruby

require 'openssl'
require 'base64'

def des_encrypt(data, key)
  cipher = OpenSSL::Cipher::DES.new(:ECB)
  cipher.encrypt
  cipher.key = key
  encrypted_data = cipher.update(data.ljust(8, "\0")) + cipher.final
  Base64.encode64(encrypted_data).strip
end

if __FILE__ == $0
  data = 'default'
  key = '9cc268c1'
  encrypted = des_encrypt(data, key)
  puts encrypted  # Output: WYfkIZp7GoA=
end
完整示例代码
ruby

require 'openssl'
require 'base64'
require 'time'

def gen_captcha_uuid
  total_string = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
  part = Array.new(17) { total_string[rand(total_string.length)] }.join
  ctime = Time.now.strftime('%Y%m%d%H%M%S')
  "#{ctime}#{part}"
end

def des_encrypt(data, key)
  cipher = OpenSSL::Cipher::DES.new(:ECB)
  cipher.encrypt
  cipher.key = key
  encrypted_data = cipher.update(data.ljust(8, "\0")) + cipher.final
  Base64.encode64(encrypted_data).strip
end

def get_encrypted_params
  {
    'mp' => des_encrypt('default', '9cc268c1'),
    'oc' => des_encrypt('DEFAULT', 'c2659527'),
    'xy' => des_encrypt('zh-cn', 'b1807581'),
    'jo' => des_encrypt('10', '6d005958')
  }
end

if __FILE__ == $0
  captcha_uuid = gen_captcha_uuid
  encrypted_params = get_encrypted_params
  puts "captchaUuid: #{captcha_uuid}"
  puts "encryptedParams: #{encrypted_params}"
end

更多内容联系1436423940

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值