背景
在昨天,我发布了一篇又长又臭的StarUML 3.x 完美破解方案
然后今天早上一起床就想到,啊~好麻烦啊!能不能让完美再简单点?
好的,然后我又开始了折腾(真丶生命在于折腾)
我的想法
这一次,我要先从about-dialog.js
开始分析
(about-dialog.js
路径:解压app.asar
后app/src/dialogs/about-dialog.js
)
正所谓:你要什么我就给什么才是最方便的🌚
正文
下面开始正式分析破解
找出关于中要显示的信息的数据来源
首先我们要找出要在关于中显示的信息来源
about-dialog.js
中第 45-71 行:
// 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()
这个方法:
/**
* Get Registration Status
* @Return {string}
*/
getStatus () {
return status
}
嗯......很简单的一个方法,我是试过直接在这里设置"true"
(注意!这里是返回字符串),但是没什么用,我就没改这里了。那么这里到底有什么用呢?大家看它返回的那个变量:status
,这是我们唯一从这里得到的信息,我们全文搜索一下status
,可以找到一个setStatus(...)
的方法。我修改了一下让它总是设置为true
,代码如下:
function setStatus (licenseManager, newStat) {
if (status !== newStat) {
status = newStat
licenseManager.emit('statusChanged', 'true') // status修改为'true',注意要带单引号
}
}
好了,现在我们可以进入那个if语句了🌚。不难看出,接下来需要的数据都在变量info
里,从这一句
var info = app.licenseManager.getLicenseInfo()
可以看出,它调用了license-manager.js
中的getLicenseInfo()
方法获取所需数据,我们去看一下getLicenseInfo()
方法:
getLicenseInfo () {
return licenseInfo
}
嗯.....还是那么简洁,但是从昨天的文章我们已经知道这个licenseInfo
的数据内容格式,他要的数据也是licenseInfo
的数据。那么,我们直接模拟licenseInfo
的数据即可:
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()
这个方法就好了。
修改后的代码如下:
checkLicenseValidity () {
this.validate().then(() => {
setStatus(this, true)
}, () => {
// 原来的代码,如果失败就会将状态设置成false
// setStatus(this, false)
// UnregisteredDialog.showDialog()
//修改后的代码
setStatus(this, true)
})
}
注册成功!!
完成以上流程后应该就能成功直接破解了,不用输入注册码,并且这种方法破解后同样能在关于显示你自定义的破解信息!!一样完美~