去年年底的时候,听说该游戏出现了一个挂号称可以无限刷爱心(游戏货币),于是从朋友A那里要来了样本,折腾半天干掉了网络验证部分,结果一顿分析完之后发现该功能的实现原理十分不优雅,放国内游戏厂商估计老早ban掉了...这里就把其网络验证部分的分析和破解思路分享出来吧,整个流程还是挺有意思的
国际惯例,DIE启动,可以看到加了个SE壳

启动dump一下,丢IDA分析,看代码特征能看出来是易语言写的,还有经典的一堆VMProtect标记,大概是网络验证模块里的代码自带的,代码也没有任何被vm的地方,那就简单了

首先要解决第一个问题,因为出了一些意外被作者抓到有人破解了他的大宝贝,所以有一个关键云端文件被清空了,现在直接打开会报一个错误

HTTP Debugger抓包看一下,从云端获取了SSSSSPRO.json
这个文件

当时第一次破的时候忘记把文件内容存下来了,所以后面在这里折腾了好一会,去分析代码又太麻烦。这时突然就灵机一动,他既然有PRO,那会不会还有不带PRO的版本呢?
诶试了一下他还真有,格式是一模一样的

然后又折腾好一会猜一下对应字段的意思
那么本地起个server简单模拟一下数据,然后将程序对应的url替换了就可以了
为了后面方便,我这里直接选用注入frida gadget
的方案了,但又懒得写劫持注入,所以写了个loader.exe,CreateProcess
启动外挂主程序后立刻把gadget.dll
注入进去
hook.js
gadget.config
现在双击loader.exe
启动,就不会再弹那个错误了,剩下的卡密验证部分,当然可以选择逆向找到验证点修改跳转,但那还是太吃操作了,有没有更简单的方法呢?有的兄弟有的
先定位到接口url

然后用密探扫一下子域名

fe7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4Q4x3X3g2Q4x3V1q4Q4x3X3g2U0L8$3#2Q4x3V1j5`.
就是目标使用的网络验证的接口文档,里面还给了sign的计算方式和加解密算法,加入文档的QQ群也可以获取到其他语言的SDK,再结合抓包得到的数据其实就可以自己写一个server把他对接过来了

但实际写的时候不知道哪里出了问题,一直报数据异常,但又懒的去调试了,所以这里又去换了条路。
9dcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4k6h3u0Q4x3X3g2Q4x3V1q4Q4x3X3g2U0L8$3#2Q4x3V1j5`.
这个就是其网络验证后台登录地址,他是允许任何人去注册的,这不就省去我自己写server的麻烦了

注册之后自己新建一个软件,然后生成配置,加密算法默认rc4,

然后修改hook.js替换对应配置值就行了
给自己生成几个永久卡玩玩

至此就破解完毕了

整个流程下来难度其实不大,没有太多逆向的地方,主要是思维的发散了。还有那两个猜测的点,想不到的话就只能硬干了,如果能把server模拟出来当然是最好的。
{
"SM"
:
"d54bca47c7d6fa5247dd8f9cadd2ac5e1"
,
"UM"
:
"b27d69cf88e09e919328b0a2bada77c8"
,
"DB"
: 1131533037,
"ZB"
: 1,
"MRDB"
: [
...
],
"clickPic"
:
"..."
,
"notice"
:
"..."
}
{
"SM"
:
"d54bca47c7d6fa5247dd8f9cadd2ac5e1"
,
"UM"
:
"b27d69cf88e09e919328b0a2bada77c8"
,
"DB"
: 1131533037,
"ZB"
: 1,
"MRDB"
: [
...
],
"clickPic"
:
"..."
,
"notice"
:
"..."
}
from
flask
import
Flask, jsonify, make_response
app
=
Flask(__name__)
@app
.route(
'/pc/SSSSSPRO.json'
, methods
=
[
'GET'
])
def
init():
d
=
jsonify({
"SM"
:
"8e8b5927c023c6c04689c94f3b96269b"
,
"UM"
:
"0974868e7f92234dfab0ccc9d37f2c28"
,
"DB"
:
1131533037
,
"ZB"
:
1
,
"MRDB"
: [
],
"clickPic"
: "",
"notice"
: ""
})
res
=
make_response(d)
res.status_code
=
200
return
res
if
__name__
=
=
'__main__'
:
app.run(host
=
'0.0.0.0'
, port
=
8818
, debug
=
False
)
from
flask
import
Flask, jsonify, make_response
app
=
Flask(__name__)
@app
.route(
'/pc/SSSSSPRO.json'
, methods
=
[
'GET'
])
def
init():
d
=
jsonify({
"SM"
:
"8e8b5927c023c6c04689c94f3b96269b"
,
"UM"
:
"0974868e7f92234dfab0ccc9d37f2c28"
,
"DB"
:
1131533037
,
"ZB"
:
1
,
"MRDB"
: [
],
"clickPic"
: "",
"notice"
: ""
})
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2025-5-7 09:53
被TubituX编辑
,原因: 修复图片错误