StarUML3.x 版本解包分析
由于软件工程基础课需要,搜索发现这个工具还算毕竟好用的,下载了这个工具发现需要注册码,遂进行一番查找,最后确定如下方法。之所以写博客记录下来是因为有两个坑点。
OS:Windows 10 专业版。
更新时间:2020/5/17
StarUML版本:3.2.2
破解思路
该工具是用 Electron 框架所写,代码是通过 asar 工具打包而成,我们只需要利用该工具反编译出源代码,修改相关判断逻辑即可。
具体做法
下载安装 node
如果不会,自(bie)行(lai)解(zhao)决(wo)。
使用 cnpm 包管理工具下载 asar
由于众所周知的原因,用 cnpm 下载,先安装 cnpm并使用淘宝镜像源:
npm install -g cnpm --registry=https://registry.npm.taobao.org // 下载 asar
cnpm install -g asar // 安装 asar
解压 asar 文件,修改源代码
找到 StarUML 安装目录里 resource 文件夹下的 app.asar 文件,执行解压:
asar extract app.asar app
坑点一、解压盘符问题
由于 StarUML 默认安装位置是 C 盘,直接在 StarUML 的安装目录下执行会有权限问题,会报类似这种错误:
$ asar extract app.asar app
internal/fs/utils.js:230
throw err;
^
Error: EPERM: operation not permitted, open 'app\package.json'
at Object.openSync (fs.js:458:3)
at Object.writeFileSync (fs.js:1279:35)
at Object.module.exports.extractAll (C:\Users\shiluo\AppData\Roaming\npm\node_modules\asar\lib\asar.js:201:10)
at Command.<anonymous> (C:\Users\shiluo\AppData\Roaming\npm\node_modules\asar\bin\asar.js:72:10)
at Command.listener [as _actionHandler] (C:\Users\shiluo\AppData\Roaming\npm\node_modules\asar\node_modules\_commander@5.1.0@commander\index.js:413:31)
at Command._parseCommand (C:\Users\shiluo\AppData\Roaming\npm\node_modules\asar\node_modules\_commander@5.1.0@commander\index.js:914:14)
at Command._dispatchSubcommand (C:\Users\shiluo\AppData\Roaming\npm\node_modules\asar\node_modules\_commander@5.1.0@commander\index.js:865:18)
at Command._parseCommand (C:\Users\shiluo\AppData\Roaming\npm\node_modules\asar\node_modules\_commander@5.1.0@commander\index.js:882:12)
at Command.parse (C:\Users\shiluo\AppData\Roaming\npm\node_modules\asar\node_modules\_commander@5.1.0@commander\index.js:717:10)
at Object.<anonymous> (C:\Users\shiluo\AppData\Roaming\npm\node_modules\asar\bin\asar.js:80:9) {
errno: -4048,
syscall: 'open',
code: 'EPERM',
path: 'app\\package.json'
}
解决方法:只需要把 app.asar 单独拿出来放其他盘比如你放 D 盘(不要在根目录,下面有解释),然后再次执行上面这个命令即可。
然后找到解压出来的源代码的 app/src/engine/license-manager.js 文件,大概在 120 行:
checkLicenseValidity() {
this.validate().then(() => {
setStatus(this, true)
}, () => {
// setStatus(this, false)
// UnregisteredDialog.showDialog()
setStatus(this, true)
})
}
可以很明显看到是一个 Promise ,成功了将注册状态设置为 true,否则设置为 false,并且弹窗提示。所以嘛。。就在这里下手,把逻辑改掉,如上图所示。
重新打包运行
asar pack app app.asar
坑点二、打包路径问题
上面说到不要把解压得到的 app 目录放在根目录下,否则执行打包命令后会报这个错误,这里我拿 D 盘举个栗子:
$ asar pack app app.asar
(node:9504) UnhandledPromiseRejectionWarning: Error: EPERM: operation not permitted, mkdir 'D:\'
(node:9504) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:9504) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
执行完后会得到一个 80 MB 左右的 asar 文件,拿它覆盖原安装包内的 asar 文件,运行 StarUML。
搞定。