首页
社区
课程
招聘
[原创]某国产沙盒游戏的启动器逆向
发表于: 2024-1-10 20:54 11423

[原创]某国产沙盒游戏的启动器逆向

2024-1-10 20:54
11423

游戏近期改变了登录方式,于是把之前的研究成果分享一下
研究仅供学习交流,如有侵权请联系删除

启动启动器,输入账号密码,点击登录,抓包得到一些信息

图片描述

图片描述

由于游戏更新后,原文件丢失了,这里就不详细演示调试过程了qwq,改用ida静态分析演示。
因为游戏启动需要解密数据构造 commandline 来启动,所以解密的代码应该就在启动器里.
启动ida,等待分析结束,搜索关键字符串 authinfo ,找到对应函数
调试分析的话,可以发现在走完 sub_45A180 后,就解密完成了,那么这个肯定就是解密函数了,第一个参数是加密的数据,第二个是iv
图片描述

分析一下这个函数,发现前面对iv做了一系列的运算,实际上就是取出iv中的数字拼接在了一起, 简化一下的python代码如下

图片描述

这里我是半调试半加直觉的,调试后发现他在获取完iv后,将加密数据分成了两部分,然后反过来拼接起来
经过测试后得出,iv是第二部分数据的长度

继续往下调试,走到 sub_44C2B0 发现传入了两个字符串参数
ida跟进分析了一下,发现很明显的AESs_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]
# base64解码
res = base64.b64decode(res)
length = int(''.join(c for c in iv_ if c.isdigit()))
res = content[len(content) - length:] + content[:len(content) - length]
# base64解码
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()
 
# ---------- config ----------
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():
    # 随便伪造的设备ID,不是游戏本身的算法
    return "WIN" + uuid.uuid1().hex
 
 
def decrypt_data(content, iv_):
    # 根据iv取到第二部分的长度, 还原顺序
    length = int(''.join(c for c in iv_ if c.isdigit()))
    res = content[len(content) - length:] + content[:len(content) - length]
    # base64解码
    res = base64.b64decode(res)
    # AES解密
    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()
 
# ---------- config ----------
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期)

收藏
免费 5
支持
分享
最新回复 (3)
雪    币: 2948
活跃值: (30846)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2024-1-11 09:32
1
雪    币: 203
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享 
2024-1-23 14:54
0
雪    币: 182
活跃值: (2576)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
奖励一把米米世界
2024-1-23 15:40
0
游客
登录 | 注册 方可回帖
返回
//