普通网站怎么做h5常见的网页编辑软件
普通网站怎么做h5,常见的网页编辑软件,加强网站建设 统计局,运城环保局网站王建设本次分析的目标是“车智赢”APP#xff08;版本v5.6.1#xff09;的登录协议。通过抓包#xff0c;我们确定了登录请求#xff08;https://dealercloudapi.che168.com/tradercloud/sealed/login/login.ashx#xff09;的关键参数在于请求体中的 _sign、pwd和 udid。本文将…本次分析的目标是“车智赢”APP版本v5.6.1的登录协议。通过抓包我们确定了登录请求https://dealercloudapi.che168.com/tradercloud/sealed/login/login.ashx的关键参数在于请求体中的_sign、pwd和udid。本文将从反编译开始详细拆解这三个参数的生成算法。一、反编译与关键代码定位使用反编译工具如 Jadx打开目标APK文件。要定位登录相关的代码最直接的方法是搜索登录请求的URL特征或接口路径。-- 搜索关键词在 Jadx 中全局搜索登录请求的地址login.ashx或部分路径sealed/login。-- 定位结果通过搜索可以快速定位到处理登录请求的代码位置通常位于某个Model或ViewModel中。例如文档中在com.che168.autotradercloud.login.model包下找到了LoginModel类其中的login方法包含了登录的网络请求逻辑。这是分析的起点。二、核心参数算法逆向登录请求的成功构建依赖于对pwd(密码)、udid(设备标识) 和_sign(请求签名) 的逆向。1. 密码 (pwd) 算法-- 初步判断抓包数据显示pwd值为32位十六进制字符串疑似 MD5 哈希值。-- 代码追踪在LoginModel的登录方法中追踪密码参数的处理。发现密码被传递给了SecurityUtil.encodeMD5(String str)方法。-- 算法确认分析SecurityUtil.encodeMD5方法的源码确认其为标准的 MD5 算法实现没有加盐。其流程是获取明文字符串的字节数组通过MessageDigest进行 MD5 计算再将结果转换为小写的十六进制字符串。-结论pwd md5(明文密码)2. 请求签名 (_sign) 算法签名用于防止请求被篡改是逆向的重点。-- 搜索与定位在代码中搜索_sign关键字可以找到多处赋值点。通过代码回溯和动态 Hook 验证最终确定签名是在LaunchModel.lambda$initRequestCommonParams$0方法中被添加到参数列表的。该方法调用SignManager.INSTANCE.signByType(i, treeMap)生成签名。-- 签名算法分析分析SignManager.signByType方法本例中i的值为1其核心逻辑如下1.获取密钥根据类型i选择对应的密钥字符串。对于登录请求使用的密钥是“WoC!AH_6Ew1f6%8“。2.拼接字符串-- 将密钥置于开头。-- 遍历TreeMap一个已按Key排序的Map将每个参数的Key和Value依次拼接。-- 将密钥置于结尾。最终形成一个待签名的原始字符串。- -Python 算法还原示例import hashlib def md5(data_string): obj hashlib.md5() obj.update(data_string.encode(utf-8)) return obj.hexdigest().upper() # 注意转为大写 def generate_sign(params_dict): key “WoC!AH_6Ew1f6%8“ # 由于参数来源于 TreeMap已按 Key 排序 sorted_params ““.join([f“{k}{params_dict[k]}“ for k in sorted(params_dict.keys())]) sign_string key sorted_params key return md5(sign_string)3. 设备标识 (udid) 算法udid是一个加密字符串逆向过程相对复杂。- -生成流程追踪在LaunchModel.lambda$initRequestCommonParams$0方法中udid由AppUtils.getUDID(context)生成。继续跟进该方法getUDID(context)方法内部会先构造一个原始字符串格式为“{uuid}|{nanoTime}|{deviceId}“。- -uuid一个随机生成的 UUID。- -nanoTime系统启动到当前的纳秒时间。- -deviceId从本地 SPSharedPreferences中读取的设备ID分析发现其常为空或固定值可置空或使用固定值如 “358908“替代。--加密算法上述原始字符串会传入SecurityUtil.encode3Des(context, str)进行加密。-- 密钥与IV通过静态分析或动态 HookAHAPIHelper.getDesKey(context)方法可获取加密使用的固定密钥“appapiche168comappapiche168comap“实际使用前24字节。加密的固定IV为“appapich“。-- 算法模式采用DESede/CBC/PKCS5Padding 算法。-- 输出加密后的字节数组会经过自定义的encode方法实则为 Base64 编码输出最终形成udid值。-- Python 算法还原示例import base64 from Crypto.Cipher import DES3 from Crypto.Util.Padding import pad import uuid import random def generate_udid(): # 1. 构造原始字符串 imei str(uuid.uuid4()) nano_time random.randint(5000000000000, 8000000000000) # 模拟纳秒时间 device_id ““ # 可置空 raw_str f“{imei}|{nano_time}|{device_id}“ # 2. 3DES加密 key b“appapiche168comappapiche168comap“[:24] # 取前24字节 iv b“appapich“ cipher DES3.new(key, DES3.MODE_CBC, iv) padded_data pad(raw_str.encode(‘utf-8‘), DES3.block_size) encrypted_data cipher.encrypt(padded_data) # 3. Base64编码 udid base64.b64encode(encrypted_data).decode(‘utf-8‘) return udid