游戏近期改变了登录方式,于是把之前的研究成果分享一下
研究仅供学习交流,如有侵权请联系删除
启动启动器,输入账号密码,点击登录,抓包得到一些信息
由于游戏更新后,原文件丢失了,这里就不详细演示调试过程了qwq,改用ida静态分析演示。
因为游戏启动需要解密数据构造 commandline 来启动,所以解密的代码应该就在启动器里.
启动ida,等待分析结束,搜索关键字符串 authinfo ,找到对应函数
调试分析的话,可以发现在走完 sub_45A180 后,就解密完成了,那么这个肯定就是解密函数了,第一个参数是加密的数据,第二个是iv
分析一下这个函数,发现前面对iv做了一系列的运算,实际上就是取出iv中的数字拼接在了一起, 简化一下的python代码如下
这里我是半调试半加直觉的,调试后发现他在获取完iv后,将加密数据分成了两部分,然后反过来拼接起来
经过测试后得出,iv是第二部分数据的长度
继续往下调试,走到 sub_44C2B0 发现传入了两个字符串参数
ida跟进分析了一下,发现很明显的AES的s_box
那么基本肯定这里就是AES的解密了,传入的两个字符串参数一个是key,一个是iv
key 和 iv
解密的流程清楚了 解析iv还原数据顺序->base64解码->aes解密
用 CyberChef 测试一下,成功解密
在尝试自己发post的时候发现还有个auth参数不知道怎么得到,继续分析
调试得出auth就是 source=mini_micro&target=auth&time=时间戳 加盐后md5加密的值,盐值调试一下或者明文都能看到
小白写的有点乱,有问题还请提出qwq
还有,看雪的Markdown编辑器字数多了变得好卡hh
https:
/
/
wskacchm.mini1.cn:
14100
/
login
/
auth_security
https:
/
/
wskacchm.mini1.cn:
14100
/
login
/
auth_security
length
=
int
(''.join(c
for
c
in
iv_
if
c.isdigit()))
length
=
int
(''.join(c
for
c
in
iv_
if
c.isdigit()))
length
=
int
(''.join(c
for
c
in
iv_
if
c.isdigit()))
res
=
content[
len
(content)
-
length:]
+
content[:
len
(content)
-
length]
res
=
base64.b64decode(res)
length
=
int
(''.join(c
for
c
in
iv_
if
c.isdigit()))
res
=
content[
len
(content)
-
length:]
+
content[:
len
(content)
-
length]
res
=
base64.b64decode(res)
key: fcafc12e17b93a30a8998fcbc7d5c786
iv:
624df8d86de5dc35
key: fcafc12e17b93a30a8998fcbc7d5c786
iv:
624df8d86de5dc35
SALT
=
"2ddb7619717147439c83ab022e9d4d38"
def
get_auth():
string
=
"source=mini_micro&target=auth&time="
+
str
(TIMESTAMP)
+
SALT
md5
=
hashlib.md5()
md5.update(string.encode())
return
md5.hexdigest()
SALT
=
"2ddb7619717147439c83ab022e9d4d38"
def
get_auth():
string
=
"source=mini_micro&target=auth&time="
+
str
(TIMESTAMP)
+
SALT
md5
=
hashlib.md5()
md5.update(string.encode())
return
md5.hexdigest()
import
requests
import
base64
import
uuid
import
hashlib
from
datetime
import
datetime
from
Crypto.Cipher
import
AES
requests.packages.urllib3.disable_warnings()
UIN
=
"<Uin>"
PASSWORD
=
"<Password>"
APIID
=
110
CLTVERSION
=
73472
AES_KEY
=
"fcafc12e17b93a30a8998fcbc7d5c786"
AES_IV
=
"624df8d86de5dc35"
SALT
=
"2ddb7619717147439c83ab022e9d4d38"
LOGIN_API
=
"https://wskacchm.mini1.cn:14100/login/auth_security"
TIMESTAMP
=
int
(datetime.now().timestamp())
def
get_auth():
string
=
"source=mini_micro&target=auth&time="
+
str
(TIMESTAMP)
+
SALT
md5
=
hashlib.md5()
md5.update(string.encode())
return
md5.hexdigest()
def
get_device_id():
return
"WIN"
+
uuid.uuid1().
hex
def
decrypt_data(content, iv_):
length
=
int
(''.join(c
for
c
in
iv_
if
c.isdigit()))
res
=
content[
len
(content)
-
length:]
+
content[:
len
(content)
-
length]
res
=
base64.b64decode(res)
aes
=
AES.new(AES_KEY.encode(), AES.MODE_CBC, AES_IV.encode())
dec
=
aes.decrypt(res)
return
dec.decode()
data
=
{
"auth"
: get_auth(),
"passwd_auth"
: {
"DeviceID"
: get_device_id(),
"apiid"
: APIID,
"cltversion"
: CLTVERSION,
"passwd"
: PASSWORD,
"uin"
: UIN
},
"source"
:
"mini_micro"
,
"target"
:
"auth"
,
"time"
: TIMESTAMP
}
if
__name__
=
=
'__main__'
:
response
=
dict
(requests.post(LOGIN_API, json
=
data, verify
=
False
).json())
iv
=
response[
"iv"
]
print
(decrypt_data(response[
"authinfo"
], iv))
print
(decrypt_data(response[
"baseinfo"
], iv))
import
requests
import
base64
import
uuid
import
hashlib
from
datetime
import
datetime
from
Crypto.Cipher
import
AES
requests.packages.urllib3.disable_warnings()
UIN
=
"<Uin>"
PASSWORD
=
"<Password>"
APIID
=
110
CLTVERSION
=
73472
AES_KEY
=
"fcafc12e17b93a30a8998fcbc7d5c786"
AES_IV
=
"624df8d86de5dc35"
SALT
=
"2ddb7619717147439c83ab022e9d4d38"
LOGIN_API
=
"https://wskacchm.mini1.cn:14100/login/auth_security"
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)