文章目录

  • 声明
  • 逆向目标
  • 逆向过程
    • 抓包分析
    • 参数逆向
  • 完整代码
    • 37_encrypt.js
    • 37_login.py

声明

本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

逆向目标

  • 目标:37网游登录

  • 主页:https://www.37.com/

  • 接口:https://my.37.com/api/login.php

  • 逆向参数:

    Query String Parameters:password: SlVEOThrcjgzNDNjaUYxOTQzNDM0eVM=

逆向过程

抓包分析

随便输入一个账号密码,点击登陆,抓包定位到登录接口为 https://my.37.com/api/login.php ,GET 请求,分析一下 Query String Parameters 里的主要参数:

callback 是一个回调参数,这个参数的值不影响请求结果,它的格式为 jQuery + 20位数字 + _ + 13位时间戳,使用 Python 很容易构建;

login_account 是登录的账户名;

password 是加密后的密码;

_ 是13位时间戳。

参数逆向

需要我们逆向的参数就只有一个 password, 我们尝试直接全局搜索此关键字,会发现出来的结果非常多,不利于分析,这里就有一个小技巧,加个等号,搜索 password=,这样就极大地缩短了查找范围,当然也可以搜索 password:,也可以在关键字和符号之间加个空格,还可以搜索 var password 等,这些都是可以尝试的,要具体情况具体分析,一种没有结果就换另一种。

在本案例中,我们搜索 password=,在 sq.login2015.js 文件里可以看到语句 h.password = td(f),疑似密码加密的地方,在此处埋下断点进行调试,可以看到返回的值确实是加密后的密码:

继续跟进 td 函数,可以看到是用到了一个自写的 RSA 加密,很简单明了,我们直接将其复制下来使用 Python 调用即可:

完整代码

GitHub 关注 K 哥爬虫,持续分享爬虫相关代码!欢迎 star !

本案例完整代码:https://github.com/kuaidaili/crawler/tree/main/www_37_com

37_encrypt.js

var ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
function __rsa(str) {var out, i, len;var c1, c2, c3;len = str.length;i = 0;out = "";while (i < len) {c1 = str.charCodeAt(i++) & 0xff;if (i == len) {out += ch.charAt(c1 >> 2);out += ch.charAt((c1 & 0x3) << 4);out += "==";break}c2 = str.charCodeAt(i++);if (i == len) {out += ch.charAt(c1 >> 2);out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));out += ch.charAt((c2 & 0xF) << 2);out += "=";break}c3 = str.charCodeAt(i++);out += ch.charAt(c1 >> 2);out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));out += ch.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));out += ch.charAt(c3 & 0x3F)}return out
}function getEncryptedPassword(a) {var maxPos = ch.length - 2, w = [];for (i = 0; i < 15; i++) {w.push(ch.charAt(Math.floor(Math.random() * maxPos)));if (i === 7) {w.push(a.substr(0, 3))}if (i === 12) {w.push(a.substr(3))}}return __rsa(w.join(""))
}// 测试样例
// console.log(getEncryptedPassword("34343434"))

37_login.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-import time
import randomimport execjs
import requestslogin_url = 'https://my.37.com/api/login.php'def get_encrypted_password(password):with open('37_encrypt.js', 'r', encoding='utf-8') as f:www_37_js = f.read()encrypted_pwd = execjs.compile(www_37_js).call('getEncryptedPassword', password)return encrypted_pwddef login(username, encrypted_password):timestamp = str(int(time.time() * 1000))jsonp = ''for _ in range(20):jsonp += str(random.randint(0, 9))callback = 'jQuery' + jsonp + '_' + timestampparams = {'callback': callback,'action': 'login','login_account': username,'password': encrypted_password,'ajax': 0,'remember_me': 1,'save_state': 1,'ltype': 1,'tj_from': 100,'s': 1,'tj_way': 1,'_': timestamp}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36','sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"'}response = requests.post(url=login_url, headers=headers, params=params)print(response.text)def main():username = input('请输入登录账号: ')password = input('请输入登录密码: ')encrypted_password = get_encrypted_password(password)login(username, encrypted_password)if __name__ == '__main__':main()

【JS 逆向百例】37网游登录接口参数逆向相关推荐

  1. 【JS 逆向百例】房天下登录接口参数逆向

    文章目录 声明 逆向目标 逆向过程 抓包分析 参数逆向 完整代码 fang_encrypt.js fang_login.py 声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产 ...

  2. 【JS 逆向百例】有道翻译接口参数逆向

    文章目录 逆向目标 逆向过程 抓包分析 参数逆向 完整代码 youdao_encrypt.js youdaofanyi.py 逆向目标 目标:有道翻译接口参数 主页:https://fanyi.you ...

  3. 【JS 逆向百例】当乐网登录接口参数逆向

    文章目录 声明 逆向目标 逆向过程 抓包分析 参数逆向 完整代码 d_cn_encrypt.js d_cn_login.py 声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产 ...

  4. 【JS 逆向百例】网洛者反爬练习平台第六题:JS 加密,环境模拟检测

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 逆向目标 抓包分析 查找加密 环境补齐 完整代码 JavaScript 加密关键代码 Python 计算关键代码 ...

  5. 【JS 逆向百例】网洛者反爬练习平台第四题:JSFuck 加密

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 逆向目标 JSFuck 简介 JSFuck 解混淆方法 逆向参数 完整代码 JavaScript 加密代码 Py ...

  6. 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 写在前面 逆向目标 绕过无限 debugger Hook 参数 逆向参数 PyCharm 本地联调 完整代码 J ...

  7. 【JS 逆向百例】复杂的登录过程,最新微博登录逆向

    文章目录 声明 逆向目标 登录流程 1.预登陆 2.获取加密后的密码 3.获取 token 4.获取加密后的账号 5.发送验证码 6.校验验证码 7.访问 redirect url 8.访问 cros ...

  8. 【JS 逆向百例】网洛者反爬练习平台第五题:控制台反调试

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 逆向目标 逆向过程 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业 ...

  9. 【JS 逆向百例】网洛者反爬练习平台第三题:AAEncode 加密

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 文章目录 声明 逆向目标 AAEncode 简介 逆向参数 完整代码 JavaScript 加密代码 Python 计算关键代码 ...

最新文章

  1. LinQ中Skip()方法和Take()方法的使用
  2. netty tcp服务端主动断开客户端_「Netty核心技术」6-ChannelPipeline源码
  3. 17_clickhouse分布式集群部署
  4. 程序员必知的8大排序(三)-------冒泡排序,快速排序(java实现) .
  5. C#图解教程 第二十一章 命名空间和程序集
  6. 心跳检测以及应用层心跳包机制设计
  7. Android的布局
  8. jquery中的each不能结束外层的function
  9. VCL已死,RAD已死(插播)
  10. NLog.config
  11. CISCO常用配置命令
  12. 总结了200道经典的机器学习面试题(附参考答案)
  13. 【数字化】数字档案馆系统测试指标分布总览
  14. 六一儿童节海报合集,一起重拾童年吧~
  15. 新手入门指南 | 教你如何写研报?
  16. Socket和Sock之间同步机制
  17. MySQL的各种安装方式都给你
  18. 三电极体系 电化学传感器
  19. (一)走进Linux世界(安装Centos8,初始化生产环境,GNU bash)
  20. 【杂烩】各种MarkDown 符号

热门文章

  1. MVC中JSON字符长度超出限制的异常处理
  2. Java学习笔记3——集合框架
  3. 了解WWW服务与HTTP协议 【入门与应用】
  4. mysql多源复制 知乎_MySQL多主一从(多源复制)同步配置
  5. python语音分割_用7行Python代码构建自己的有声读物
  6. Navicat Error 2003 - can't connect to mysql server 'localhost' (10061)
  7. java版本streamgobbler_java调用本地命令 Runtime class's exec() method
  8. tp5 php正则邮箱,TP5验证器使用实例
  9. python中sn的意思_python获取内存SN编号等信息
  10. linux修改某个用户的数组,linux-shell编程1:变量和数组