另一种 StarUML 3.x 完美破解的思路——比较暴力

Author Avatar
Reborn 9月 15, 2018
  • 在其它设备中阅读本文章

背景

在昨天,我发布了一篇又长又臭的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)
  })
}

注册成功!!

完成以上流程后应该就能成功直接破解了,不用输入注册码,并且这种方法破解后同样能在关于显示你自定义的破解信息!!一样完美~
staruml-about

这种方法和昨天的比起来更简单,但是也更暴力。昨天的比较接近正常的验证流程,这种就有点爆破的味道了。这里给出另一种思路给大家参考,希望对大家有帮助。