Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
IT.BOB
Python3-Spider-Practice
提交
1fd7fe6b
P
Python3-Spider-Practice
项目概览
IT.BOB
/
Python3-Spider-Practice
9 个月 前同步成功
通知
3
Star
3
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Python3-Spider-Practice
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
1fd7fe6b
编写于
8月 27, 2021
作者:
IT.BOB
🇨🇳
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
✅
魅族登录【2021.08.27】
上级
e7d59359
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
172 addition
and
0 deletion
+172
-0
JSReverse/login_flyme_cn/README.md
JSReverse/login_flyme_cn/README.md
+96
-0
JSReverse/login_flyme_cn/flyme_encrypt.js
JSReverse/login_flyme_cn/flyme_encrypt.js
+19
-0
JSReverse/login_flyme_cn/flyme_login.py
JSReverse/login_flyme_cn/flyme_login.py
+57
-0
未找到文件。
JSReverse/login_flyme_cn/README.md
0 → 100644
浏览文件 @
1fd7fe6b
## 魅族
-
目标:魅族官网登录
-
主页:aHR0cHM6Ly9sb2dpbi5mbHltZS5jbi8=
-
接口:aHR0cHM6Ly9sb2dpbi5mbHltZS5jbi9zc28vbG9naW4=
-
逆向参数:
Form Data:
`password: %C5%94%C5%93%C5%92%C5%93%C5%94%C5%92%C5%94%C5%92`
## 逆向过程
### 抓包分析
来到魅族的登录页面,随便输入一个账号密码进行登录,抓包定位到登录接口为 aHR0cHM6Ly9sb2dpbi5mbHltZS5jbi9zc28vbG9naW4= ,POST 请求,Form Data 里,参数比较多,分析一下主要参数的含义:
-
`cycode`
:号码前缀;
-
`account`
:号码前缀 + 手机账号;
-
`password`
:密码,被加密处理了;
-
`geetest_challenge`
:极验(GeeTest)验证码相关参数;
-
`geetest_validate`
:极验(GeeTest)验证码相关参数;
-
`geetest_seccode`
:极验(GeeTest)验证码相关参数。
对于极验验证码的处理我们后面会专门写文章来进一步研究,在本案例中,我们只注重密码
`password`
加密方式的逆向。
![
01.png
](
https://i.loli.net/2021/08/21/kXZUamlewhHE96s.png
)
### 参数逆向
全局搜索
`password`
,会发现在好几个 JS 文件里都有结果,我们注意到有个 login.js,很明显和登录有关,重点先关注一下这个 JS 文件,可以看到有两行代码:
```
javascript
var
kk
=
cryPP
.
generateMix
();
data
[
'
password
'
]
=
cryPP
.
excutePP
(
data
[
'
password
'
],
kk
);
```
貌似是将明文的 password 经过一个函数处理过后再次写入 data 里面,比较可疑,埋下断点,重新点击登陆进行调试:
![
02.png
](
https://i.loli.net/2021/08/21/pEGZhdRXaY7W6TI.png
)
可以看到成功断下,经过这个函数处理后的结果正是最终我们需要的值,观察用到的两个函数:
`cryPP.generateMix()`
和
`cryPP.excutePP()`
,鼠标放上去可以看到是调用了 cryPP.min.js 的加密函数:
![
03.png
](
https://i.loli.net/2021/08/21/ZtvxKDLh7RFB5Xz.png
)
直接跟进这个函数,来到 cryPP.min.js 可以看到这两个加密方法:
![
04.png
](
https://i.loli.net/2021/08/21/J6BXnlgvGtabfxF.png
)
我们直接改写一下整个加密代码,直接重写为两个方法即可:
```
javascript
function
excutePP
(
r
,
e
)
{
for
(
var
n
=
""
,
t
=
0
;
t
<
r
.
length
;
t
++
)
{
var
o
=
e
^
r
.
charCodeAt
(
t
);
n
+=
String
.
fromCharCode
(
o
)
}
return
encodeURIComponent
(
n
)
}
function
generateMix
(
r
)
{
return
Math
.
ceil
(
1
e3
*
Math
.
random
())
}
function
getEncryptedPassword
(
password
)
{
var
kk
=
generateMix
();
return
excutePP
(
password
,
kk
);
}
// 测试样例
// console.log(getEncryptedPassword("12345678"))
```
当然,改写成对象的形式也可以:
```
javascript
var
cryPP
=
{}
cryPP
.
excutePP
=
function
(
r
,
e
)
{
for
(
var
n
=
""
,
t
=
0
;
t
<
r
.
length
;
t
++
)
{
var
o
=
e
^
r
.
charCodeAt
(
t
);
n
+=
String
.
fromCharCode
(
o
)
}
return
encodeURIComponent
(
n
)
}
cryPP
.
generateMix
=
function
(
r
)
{
return
Math
.
ceil
(
1
e3
*
Math
.
random
())
}
function
getEncryptedPassword
(
password
)
{
var
kk
=
cryPP
.
generateMix
();
return
cryPP
.
excutePP
(
password
,
kk
);
}
// 测试样例
// console.log(getEncryptedPassword("12345678"))
```
JSReverse/login_flyme_cn/flyme_encrypt.js
0 → 100644
浏览文件 @
1fd7fe6b
function
excutePP
(
r
,
e
)
{
for
(
var
n
=
""
,
t
=
0
;
t
<
r
.
length
;
t
++
)
{
var
o
=
e
^
r
.
charCodeAt
(
t
);
n
+=
String
.
fromCharCode
(
o
)
}
return
encodeURIComponent
(
n
)
}
function
generateMix
(
r
)
{
return
Math
.
ceil
(
1
e3
*
Math
.
random
())
}
function
getEncryptedPassword
(
password
)
{
var
kk
=
generateMix
();
return
excutePP
(
password
,
kk
);
}
// 测试样例
// console.log(getEncryptedPassword("12345678"))
JSReverse/login_flyme_cn/flyme_login.py
0 → 100644
浏览文件 @
1fd7fe6b
# ==================================
# --*-- coding: utf-8 --*--
# @Time : 2021-08-27
# @Author : TRHX
# @Blog : www.itrhx.com
# @CSDN : itrhx.blog.csdn.net
# @FileName: flyme_login.py
# @Software: PyCharm
# ==================================
import
execjs
import
requests
login_url
=
'https://login.flyme.cn/sso/unionlogin'
def
get_encrypted_password
(
password
):
with
open
(
'flyme_encrypt.js'
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
exec_js
=
f
.
read
()
encrypted_password
=
execjs
.
compile
(
exec_js
).
call
(
'getEncryptedPassword'
,
password
)
return
encrypted_password
def
login
(
username
,
encrypted_password
):
headers
=
{
'User-Agent'
:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
params
=
{
'cycode'
:
'+86'
,
'account'
:
'0086: %s'
%
username
,
'password'
:
encrypted_password
,
'abnormal'
:
''
,
'kapkey'
:
''
,
'appuri'
:
''
,
'useruri'
:
'http://store.meizu.com/member/login.htm?useruri=http://www.meizu.com'
,
'service'
:
'store'
,
'sid'
:
'unionlogin'
,
'geetest_challenge'
:
''
,
'geetest_validate'
:
''
,
'geetest_seccode'
:
''
,
'unCommonlandedCode'
:
''
,
}
response
=
requests
.
post
(
url
=
login_url
,
params
=
params
,
headers
=
headers
)
print
(
response
.
json
())
def
main
():
username
=
input
(
'请输入登录账号: '
)
password
=
input
(
'请输入登录密码: '
)
encrypted_password
=
get_encrypted_password
(
password
)
login
(
username
,
encrypted_password
)
if
__name__
==
'__main__'
:
main
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录