背景 在昨天,我发布了一篇又长又臭的StarUML 3.x 完美破解方案
然后今天早上一起床就想到,啊~好麻烦啊!能不能让完美再简单点?
好的,然后我又开始了折腾(真丶生命在于折腾😂)
我的想法 这一次,我要先从about-dialog.js
开始分析
(about-dialog.js
路径:解压app.asar
后/app/src/dialogs/about-dialog.js
)
正所谓:你要什么我就给什么才是最方便的🌚
正文 下面开始正式分析破解
查看关于中要显示的信息需要获取的数据 about-dialog.js
中第 45-71 行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// set license info
if ( app . licenseManager . getStatus () === true ) {
var info = app . licenseManager . getLicenseInfo ()
var licenseTypeName = 'Unknown'
switch ( info . licenseType ) {
case 'PS' :
licenseTypeName = 'Personal'
break
case 'CO' :
licenseTypeName = 'Commercial'
break
case 'ED' :
licenseTypeName = 'Educational'
break
case 'CR' :
licenseTypeName = 'Classroom'
break
}
$license . html ( 'Licensed to ' + info . name )
$licenseType . html ( licenseTypeName + ' License' )
$quantity . html ( info . quantity + ' User(s)' )
$crackedAuthor . html ( 'Cracked by ' + info . crackedAuthor )
} else {
$license . html ( 'UNREGISTERED' )
}
return dialog
}
可以看出,它首先会先调用license-manager.js
中的getStatus()
方法判断程序的注册状态。那现在我们去license-manager.js
看一下getStatus()
这个方法:
1
2
3
4
5
6
7
/**
* Get Registration Status
* @return {string}
*/
getStatus () {
return status
}
嗯……很简单的一个方法,我是试过直接在这里设置"true"
(注意!这里是返回字符串),但是没什么用,我就没改这里了。那么这里到底有什么用呢?大家看它返回的那个变量:status
,这是我们唯一从这里得到的信息,我们全文搜索一下status
,可以找到一个setStatus(...)
的方法。我修改了一下让它总是设置为true
,代码如下:
1
2
3
4
5
6
function setStatus ( licenseManager , newStat ) {
if ( status !== newStat ) {
status = newStat
licenseManager . emit ( 'statusChanged' , 'true' ) // status修改为'true',注意要带单引号
}
}
好了,现在我们可以进入那个if语句了🌚。不难看出,接下来需要的数据都在变量info
里,从这一句
1
var info = app . licenseManager . getLicenseInfo ()
可以看出,它调用了license-manager.js
中的getLicenseInfo()
方法获取所需数据,我们去看一下getLicenseInfo()
方法:
1
2
3
getLicenseInfo () {
return licenseInfo
}
嗯…..还是那么简洁,但是从昨天的文章我们已经知道这个licenseInfo
的数据内容格式,他要的数据也是licenseInfo
的数据。那么,我们直接模拟licenseInfo
的数据即可:
1
2
3
4
5
6
7
8
9
10
11
12
getLicenseInfo () {
licenseInfo = {
name : "Reborn" ,
product : "Reborn product" ,
licenseType : "PS" ,
quantity : "Reborn Quantity" ,
timestamp : "1529049036" ,
licenseKey : "It's Cracked!!" ,
crackedAuthor : "Reborn"
};
return licenseInfo
}
好了,模拟成功,about-dialog.js
那边应该能获取到licenseInfo
的数据了。但是,仅仅是这样还不行哦!还有最重要的一点你们别忘了——我们还没破解!
破解注册 破解注册很简单,直接修改license-manager.js
中的checkLicenseValidity()
这个方法就好了。
修改后的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
checkLicenseValidity () {
this . validate (). then (() => {
setStatus ( this , true )
}, () => {
// 原来的代码,如果失败就会将状态设置成false
// setStatus(this, false)
// UnregisteredDialog.showDialog()
//修改后的代码
setStatus ( this , true )
})
}
注册成功!! 完成以上流程后应该就能成功直接破解 了,不用输入注册码 ,并且这种方法破解后同样能在关于显示你自定义的破解信息!!一样完美~staruml-about
这种方法和昨天的比起来更简单,但是也更暴力。昨天的比较接近正常的验证流程,这种就有点爆破的味道了。这里给出另一种思路给大家参考,希望对大家有帮助。