翼度科技»论坛 编程开发 python 查看内容

使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录!

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
今天来分享一下如何使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录。
逆向目标


  • 目标:某 7 网游登录
  • 主页:aHR0cHM6Ly93d3cuMzcuY29tLw==
  • 接口:aHR0cHM6Ly9teS4zNy5jb20vYXBpL2xvZ2luLnBocA==
  • 逆向参数:Query String Parameters:password: SlVEOThrcjgzNDNjaUYxOTQzNDM0eVM=
逆向过程

抓包分析

来到某 7 网游首页,随便输入一个账号密码,点击登陆,抓包定位到登录接口为 aHR0cHM6Ly9teS4zNy5jb20vYXBpL2xvZ2luLnBocA== ,GET 请求:

分析一下 Query String Parameters 里的主要参数:
callback 是一个回调参数,这个参数的值不影响请求结果,它的格式为 jQuery + 20位数字 + _ + 13位时间戳,使用 Python 很容易构建:
  1. import time
  2. import random
  3. timestamp = str(int(time.time() * 1000))
  4. jsonp = ''
  5. for _ in range(20):
  6.     jsonp += str(random.randint(0, 9))
  7. callback = 'jQuery' + jsonp + '_' + timestamp
  8. print(callback)
复制代码
 
login_account 是登录的账户名;
password 是加密后的密码;
_ 是13位时间戳。
参数逆向

需要我们逆向的参数就只有一个 password, 我们尝试直接全局搜索此关键字,会发现出来的结果非常多,不利于分析,这里就有一个小技巧,加个等号,搜索 password=,这样就极大地缩短了查找范围,当然也可以搜索 password:,也可以在关键字和符号之间加个空格,还可以搜索 var password 等,这些都是可以尝试的,要具体情况具体分析,一种没有结果就换另一种。
在本案例中,我们搜索 password=,在 sq.login2015.js 文件里可以看到语句 h.password = td(f),疑似密码加密的地方,在此处埋下断点进行调试,可以看到返回的值确实是加密后的密码:

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

参数 JS 加密关键代码
  1. var ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  2. function __rsa(str) {
  3.     var out, i, len;
  4.     var c1, c2, c3;
  5.     len = str.length;
  6.     i = 0;
  7.     out = "";
  8.     while (i < len) {
  9.         c1 = str.charCodeAt(i++) & 0xff;
  10.         if (i == len) {
  11.             out += ch.charAt(c1 >> 2);
  12.             out += ch.charAt((c1 & 0x3) << 4);
  13.             out += "==";
  14.             break
  15.         }
  16.         c2 = str.charCodeAt(i++);
  17.         if (i == len) {
  18.             out += ch.charAt(c1 >> 2);
  19.             out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  20.             out += ch.charAt((c2 & 0xF) << 2);
  21.             out += "=";
  22.             break
  23.         }
  24.         c3 = str.charCodeAt(i++);
  25.         out += ch.charAt(c1 >> 2);
  26.         out += ch.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
  27.         out += ch.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
  28.         out += ch.charAt(c3 & 0x3F)
  29.     }
  30.     return out
  31. }
  32. function getEncryptedPassword(a) {
  33.     var maxPos = ch.length - 2
  34.       , w = [];
  35.     for (i = 0; i < 15; i++) {
  36.         w.push(ch.charAt(Math.floor(Math.random() * maxPos)));
  37.         if (i === 7) {
  38.             w.push(a.substr(0, 3))
  39.         }
  40.         if (i === 12) {
  41.             w.push(a.substr(3))
  42.         }
  43.     }
  44.     return __rsa(w.join(""))
  45. }
  46. # 完整代码都放在这个Q裙了 592539176
  47. # 直接加它领取
  48. // 测试样例
  49. // console.log(getEncryptedPassword("34343434"))
复制代码
 
Python 登录关键代码
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import time
  4. import random
  5. import execjs
  6. import requests
  7. login_url = '脱敏处理,完整代码领取Q裙 592539176'
  8. def get_encrypted_password(password):
  9.     with open('encrypt.js', 'r', encoding='utf-8') as f:
  10.         www_37_js = f.read()
  11.     encrypted_pwd = execjs.compile(www_37_js).call('getEncryptedPassword', password)
  12.     return encrypted_pwd
  13. def login(username, encrypted_password):
  14.     timestamp = str(int(time.time() * 1000))
  15.     jsonp = ''
  16.     for _ in range(20):
  17.         jsonp += str(random.randint(0, 9))
  18.     callback = 'jQuery' + jsonp + '_' + timestamp
  19.     params = {
  20.         'callback': callback,
  21.         'action': 'login',
  22.         'login_account': username,
  23.         'password': encrypted_password,
  24.         'ajax': 0,
  25.         'remember_me': 1,
  26.         'save_state': 1,
  27.         'ltype': 1,
  28.         'tj_from': 100,
  29.         's': 1,
  30.         'tj_way': 1,
  31.         '_': timestamp
  32.     }
  33.     headers = {
  34.         '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',
  35.         'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"'
  36.     }
  37.     response = requests.post(url=login_url, headers=headers, params=params)
  38.     print(response.text)
  39. def main():
  40.     username = input('请输入登录账号: ')
  41.     password = input('请输入登录密码: ')
  42.     encrypted_password = get_encrypted_password(password)
  43.     login(username, encrypted_password)
  44. if __name__ == '__main__':
  45.     main()
复制代码
 
好了,今天的分享就到这里,大家拿到代码后快去试试吧!

来源:https://www.cnblogs.com/hahaa/p/17231011.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具