摘要
本文内容转自网络,个人学习记录使用,请勿传播
声明:
- 逆向主要的作用:
- 1.数据的加密和解密的处理
- 2.动态变化的请求参数
- 都是通过js代码生成
试客联盟逆向分析
分析思路:
输入了用户名和密码后,打开抓包工具,然后点击登录按钮发起请求,发现抓包工具捕获到一个数据包,从中可以看出password是加密的,因此需要对其进行搜索。
在可以之处打断电,然后重新点击登录按钮发起请求,查看是否会停留在断点位置。
js代码的改写:
var formData = $(“#loginForm”).serializeArray();
将等号右侧的内容选中,鼠标放上去,则显示该内容返回的结果是什么,返回的结果是一个数组,里面存储了4个元素(字典)。
1
2
3
4
5
6
7#formData就是如下数组:
[
{name: 'username', value: 'bobo@qq.com'},
{name: 'password', value: '123456'},
{name: 'vcode', value: ''},
{name: 'to', value: 'http://user.shikee.com/'}
]
找寻rsa_n的值,这个值表示的是公钥,它要么是单独的请求获取的,要么隐藏在前台页面中。
将断点取消,打开抓包工具,刷新等于页面,然后点击登录按钮。说明抓包工具捕获到了所有的数据包,然后contrl+f打开全局搜索框,搜索rsa_n定位该值对应的数据包即可!
1
2
3
4
5
6
7
8
9
10#动态提取rsa_n的值
import requests
import re
url = 'http://login.shikee.com/getkey?v=97434350dfd69718c42d82249257621d'
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).text
rsa_n = re.findall('var rsa_n = "(.*?)";',page_text)[0]
print(rsa_n)
完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import requests
import re
import execjs
url = 'http://login.shikee.com/getkey?v=97434350dfd69718c42d82249257621d'
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).text
rsa_n = re.findall('var rsa_n = "(.*?)";',page_text)[0]
node = execjs.get()
fp = open('./shikelianmeng.js','r',encoding='utf-8')
ctx = node.compile(fp.read())
pwd = '123456'
funcName = 'getPwd("%s","%s")'%(pwd,rsa_n)
result = ctx.eval(funcName)
print(result)
空中网
分析:
输入用户名和密码,点击登录按钮使用抓包工具捕获数据包。
点击登录按钮后发起的是一个get请求,请求参数中的密码加密了,所以全局搜索password,在可以的位置打断点。
通过逐一文件的分析,没有找到任何一个可以之处,为什么?
核心逆向的js代码被混淆(js混淆)。
什么是js混淆:
- 网站的设计者,可以将核心的js代码进行单独编码或者加密,因此我们就无法直接定位到核心的js代码了。
因此,我们是需要进行js反混淆之后,就可以看到明文形式的js核心代码了,因此就可以愉快的改写js代码进行逆向了。
那么如何对js混淆的代码进行反混淆呢?
使用浏览器开发工具自带的反混淆工具实现【自动反混淆】操作!
如何操作:
打开浏览器开发者工具,点击设置按钮
点上该对钩:
在抓包工具的全局搜索框中,重新搜索相关的关键字,重点找寻VMxxx的数据包,该数据包就是反混淆后的结果。
js改写:
动态获取data[“dc”]的值,在抓包工具所有数据包的响应数据中查找。
1
2
3
4
5
6
7
8
9
10
11
12import re
import json
import execjs
url = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1648128700957'
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
"Referer": "https://passport.kongzhong.com/",
}
page_text = requests.get(url=url,headers=headers).text
dc_str = re.findall('KZLoginHandler.jsonpCallbackKongZ\((.*?)\)',page_text)[0]
dc_obj = json.loads(dc_str)
dc = dc_obj['dc']
完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21import requests
import re
import json
import execjs
url = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1648128700957'
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
"Referer": "https://passport.kongzhong.com/",
}
page_text = requests.get(url=url,headers=headers).text
dc_str = re.findall('KZLoginHandler.jsonpCallbackKongZ\((.*?)\)',page_text)[0]
dc_obj = json.loads(dc_str)
dc = dc_obj['dc']
node = execjs.get()
fp = open('./kongzhongwang.js','r',encoding='utf-8')
ctx = node.compile(fp.read())
pwd = '123456'
funcName = 'getPwd("%s","%s")'%(pwd,dc)
result = ctx.eval(funcName)
print(result)