第一天
JavaScript逆向练习1
0x01 目标网址
http://www.juxiangyou.com/login/index
0x02 定位JS
1.只需输入账号和密码验证码,点击登录,即可查看提交的参数
1 可以看到,发出了两个请求,第一个是获取密钥,第二个是登录。登录包中有一个加密的密码参数。
2.Ctrl+Shift+F 打开搜索面板并搜索jxy_parameter。共有三个结果。相应打开查看,发现第三个就是你需要的。在这里设置一个断点就可以了。
23.重新输入账号和密码验证码,点击登录,JS中断。 F11 跟进,或者将鼠标悬停在断点处的函数名称上,点击弹出内容跳转。
3这里可以看到e是之前第一个请求包的返回内容,n是需要加密的明文密码。调用加密函数的核心就在这里。
4.同上,后续F11,输入一个JSEncrypt.min.js,传入第一步返回的哈希+明文密码。
4.这里一看到JSEncrypt,看上下文就可以确认是AES加密(可以百度搜索JSEncrypt),然后把整个JSEncrypt.min.js拿走,重写一个被调用的函数就可以了。
0x03 改写JS
1.模仿图3中的位置,编写一个调用函数。
function getrsa(pKey,password) { //也可以把密钥写死,公钥不会改变
var 加密=new JSEncrypt();
加密.setPublicKey(pKey);
var 加密=加密.加密(密码);
返回加密的
}此时在多数情况下就能正常运行了。
2.当我用Python调用练习时,我发现这样会报错JSEncrypt is not Defined。我很困惑。我尝试直接赋值一个空对象,结果不行。我仔细看了代码,发现第一部分是判断客户端。
!函数(t,e){
"函数"==typeof 定义define.amd ?定义(["出口"],e): e("对象"==typeof出口"字符串"!=typeof出口.nodeName?module.exports : t)
}(this, function(t) {**函数体**});在浏览器中调试时,发现"function"==typeof Define Define.amd 为true,则直接更改函数,暴露函数体。
var JSEncryptExports={};
(函数(t){
**函数体**
})(JSEncryptExports);
var JSEncrypt=JSEncryptExports.JSEncrypt;此时,JSEncrypt 就是一个构造函数。然后将上面5中的代码粘贴到下面,就可以在Python中运行它了。
0x04 Python代码
我一开始尝试了js2py,但出现了错误。可能是js代码太多,所以直接改用execjs了。
附言。其实你可以尝试直接调用Python的AES加密库。如果JS没有被修改,结果应该是可用的(即另一种想法:可以通过所使用的语言直接实现JS功能)。
# -*- 编码: utf-8 -*-
"""
@文件:0x01-juxiangyou.com.py
@时间: 2019/11/06 10:42:43
@作者:独孤孤单独孤鲁小牛
@版本: 1.0
@链接: https://www.jianshu.com/u/6a4c6ef97be7
@Desc : 聚享游www.juxiangyou.com 登录示例
"""
开始
导入execjs
导入请求
导入时间
导入json
标头={
"用户代理":
"Mozilla/5.0 (Linux; U; Android 8.0.0; zh-cn; Mi Note 2 Build/OPR1.170623.032) AppleWebKit/537.36 (KHTML, 如Gecko) Version/4.0 Chrome/61.0.3163.128 Mobile Safari/537.36 小米/Miui浏览器/10.1.1"
}
s=requests.Session()
s.headers.update(标题)
imageURL="http://www.juxiangyou.com/verify?v={}000".format(int(time.time()))
keyURL="http://www.juxiangyou.com/login/getkey"
loginURL="http://www.juxiangyou.com/login/auth"
# 下载验证码
图像=s.get(imageURL).content
打开("image.png","wb")作为f:
f.write(图像)
# 获取公钥
publicKey=s.post(keyURL).json()
jskey=公钥["密钥"]
jshash=公钥["哈希"]
登录
用户名="ermao6@qq.com"
密码="*****"
varifyCode=input("请输入验证码(当前目录下的image.png):")
#varifyCode="1111"
时间戳=int(time.time() * 1000)
with open("js/0x01-juxiangyou.com.js") as f: # 坑0x01相对路径前面不带/,带/不报错但读不到数据
jscode=f.read()
ctx=execjs.compile(jscode) #execjs加载js代码
xsign=ctx.call("get", timestamp) # 坑0x02 这里传递的时间戳是一个整数(旧版本验证的参数,所以现在不计算)
# xsign=ctx.eval("get({})".format(timestamp)) # 通过eval调用js代码中的函数
enPass=ctx.call("getrsa", jskey, jshash + password) # 通过call调用js代码中的函数
数据={
"jxy_parameter": # 坑0x03 提交json格式参数需要转换成json字符串,否则请求失败。
json.dumps({
"c": "索引",
"乐趣": "登录",
"帐户": 用户名,
"密码": enPass,
"verificat_code": varifyCode,
"is_auto": 正确
}),
“时间戳”:
时间戳
}
【《揭秘聚享游RSA:每日JS逆向解析》】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
哇,感觉越来越实用啦!要学习这个加密算法!
有11位网友表示赞同!
感觉这篇文章一定能让我对聚享游的加密机制有了更深刻的理解!
有9位网友表示赞同!
每天分享JS知识太棒了,我最近一直在研究前端开发,希望能学到更多!
有19位网友表示赞同!
了解RSA算法是多么重要啊!这个系列简直是我的福音!
有17位网友表示赞同!
终于可以解开聚享游の裏面秘密啦!
有8位网友表示赞同!
好期待这篇文章能让我更深入地学习JS逆向工程!
有18位网友表示赞同!
学习新的知识,提升技能,我支持这个行动!
有9位网友表示赞同!
希望这些JS分享能让更多人参与进来,学习和交流是进步的动力!
有20位网友表示赞同!
每天都分享最新的技术内容,真是个宝藏公众号啊!
有7位网友表示赞同!
这个系列帖子很符合我的需求,期待后续更深入的内容!
有9位网友表示赞同!
最近在尝试JS 逆向工程,希望能从这篇文章中获得一些启发!
有11位网友表示赞同!
学习加密算法知识很有必要,这篇文章我一定不会错过!
有9位网友表示赞同!
感谢作者分享这个有价值的知识,让我能够更加了解聚享游的技术细节!
有11位网友表示赞同!
RSA算法听起来很复杂,但是文章能把它拆解成可理解的内容,真厉害!
有19位网友表示赞同!
希望这篇文章能够详细讲解加密流程,帮助我更好地理解整个系统!
有14位网友表示赞同!
学习新东西总是令人兴奋的,期待继续关注作者的分享内容!
有19位网友表示赞同!
这个系列很实用,对我们想深入学习JS技术的人来说简直太棒了!
有13位网友表示赞同!
每天都发布如此有价值的内容真的令人敬佩,感谢作者的付出!
有7位网友表示赞同!
聚享游这款APP确实很好用,希望能够进一步了解它的安全机制!
有7位网友表示赞同!