准备工作

先使用npm安装asar模块

安装命令:npm install -g asar

image-20210519152117604

然后打开程序位置下的resources文件夹,将下面的app.asar反编译出来,如果没有提示任何信息就结束则已经好了。

反编译命令:

1
asar extract app.asar ./app

asar用法提示:

解压app.asar

1
2
asar e app.asar <解压后的目录>
asar extract app.asar <解压后的目录>

打包app.asar

1
2
asar p <被打包的目录> app.asar
asar pack <被打包的目录> app.asar

image-20210519152325569

image-20210519152401985

正式修改

本文代码针对Windows 版7.11.3,由于原作者对软件进行了混淆加密,不同版本参考思路进行修改即可。

首次欢迎界面

原样式:

image-20210519153450211

Hint:由于程序经过代码混淆,请参考下面原值找到正确的位置进行修改

位置:app\js\ui-process.js

定位值:openLoginScreen:A})))))}}

image-20210519153059224

搜索定位到此方法的代码出,利用括号匹配提示找到整个方法的代码

参考值:

1
class pv extends De.Component{componentDidMount(){this.props.mounted&&this.props.onMountWelcome()}render(){const{openLoginScreen:A,onOk:e,opacityWelcome:t,translateYWelcome:r,opacityContainer:n,closeContainer:i,onClose:s,classes:o,endMount:a,mounted:B,handleTransitionEnd:c,setRef:g,setFadeOutRef:l}=this.props;return me.a.createElement("div",{className:jr()({"termius-dark-theme":!0,[o.container]:!0,[o.transitionContainer]:!0,[o[n?"opacityOn":"opacityOff"]]:!0}),onTransitionEnd:c,ref:g},me.a.createElement("div",{className:jr()({[o.loginBtnContainer]:!0,[o[B?"transition":"transitionElement2"]]:!0,[o[t?"opacityOn":"opacityOff"]]:!0,[o[r?"translateYOff":"translateYOn"]]:!0})},me.a.createElement(Ug,{onClick:()=>{A()}},"Log In")),me.a.createElement("div",{className:jr()({[o.description]:!0,[o[B?"transition":"transitionElement"]]:!0,[o[t?"opacityOn":"opacityOff"]]:!0,[o[r?"translateYOff":"translateYOn"]]:!0})},me.a.createElement(fv,null)),me.a.createElement("div",{className:jr()({[o.row]:!0,[o[B?"transition":"transitionElement3"]]:!0,[o[t?"opacityOn":"opacityOff"]]:!0,[o[r?"translateYOff":"translateYOn"]]:!0}),onTransitionEnd:a,ref:l},me.a.createElement("div",{className:o.pictureContainer},me.a.createElement("img",{className:o.image,src:Mv,alt:"welcome"}),me.a.createElement(vv,null)),me.a.createElement("div",{className:o.formGroup},me.a.createElement(av,{onOk:e,onClose:s,closeContainer:i,openLoginScreen:A},me.a.createElement(hv,{closeContainer:i,openLoginScreen:A})))))}}

修改值:

1
class pv {}

此时再打开程序时,提示界面已经没有了

Preferences中的Account

原样式:

image-20210519153653768

位置:app\js\ui-process.js

原值:[],{title:"Account"},{title:"Terminal"}

修改值:[],{title:"Terminal"}

方法:使用修改值替换原值

image-20210519153805293

效果图:

image-20210519153852726

左上方菜单栏中的Account

原样式:

image-20210519153953762

位置:app\js\ui-process.js

原值:[],"Account","Terminal","Shortcuts"

修改值:[],"Terminal","Shortcuts"

方法:使用修改值替换原值

效果图:

image-20210519154203394

左上方菜单栏中的Login

定位值:()}},"Login")

image-20210519154318561

位置:app\js\ui-process.js

参考值:

1
!o&&me.a.createElement(hm,{className:n.item,dense:!0,onClick:()=>{this.login(),e()}},"Login"),

方法:根据定位值找到此方法的代码,类似参考值,然后删除即可

提示:注意最有有个逗号也要一起删除,代码由于混淆了,不要直接搜索参考值

效果图:

image-20210519154832524

菜单栏Try

原样式:

image-20210519155109641

位置:app\js\ui-process.js

定位值:},"Create Account")));

image-20210519163502066

参考值:

1
,M=me.a.createElement("div",{className:i.promoContainer},me.a.createElement("div",{className:i.tryPremiumContainer},me.a.createElement(EQ,{color:"primary",fontSize:12,bold:!0},"Try Premium for Free"),me.a.createElement("div",{className:i.infoText},"SFTP, Secure Sync, Snippets"),me.a.createElement(Ug,{className:i.createAccountButton,onClick:C,size:"xs",fullWidth:!0},"Create Account")))

方法:找到类似上方代码删除,最前面的逗号要删去,)))后的分号要保留。

image-20210519163717297

Hint:修改后仍然显示“Sentry Logger”,这里我们可以先不用管它。

左下角Try

原样式:

image-20210519163004444

位置:app\js\ui-process.js

定位值:})?null:a};

image-20210519155228893

参考值:

1
var m0=({isCompactMode:A})=>{const e=Kn(Ea),t=Kn(vO),r=On(),n=Object(De.useCallback)(()=>{r(IF(Date.now())),r(TB({promotionLocation:"Sidebar",promotionType:"Trial",trialDaysLeft:void 0}))},[r]),i=Object(De.useCallback)(async()=>{try{r(RB({promotionLocation:"Sidebar",promotionType:"Trial",trialDaysLeft:void 0})),Eh.userJustSawSuggestionToTryPremium();const A=await M0();r(nB({Source:"TryPremium",Email:A})),await iF(),await Db()}catch(A){}},[r]),s=Object(De.useCallback)(()=>me.a.createElement(I0,null),[]),o=Object(De.useCallback)(()=>me.a.createElement(EQ,{whiteSpace:"nowrap",color:"success",fontSize:10,underline:!0},me.a.createElement(Ug,{base:!0,color:"inherit",onClick:i},"Learn about the free trial")),[i]),a=Object(De.useMemo)(()=>me.a.createElement(bQ,{handleClose:n,IconComponent:s,LinkComponent:o,isCompactMode:A,description:"Try Premium for Free"}),[s,o,n,A]);return Object(De.useEffect)(()=>{D0({username:e,freeToTrialDismissTimestamp:t})||r(LB({promotionLocation:"Sidebar",promotionType:"Trial",trialDaysLeft:void 0}))},[e]),D0({username:e,freeToTrialDismissTimestamp:t})?null:a};

修改值:

1
var m0=({isCompactMode:A})=>{return null};

方法:将方法返回为null,参考上方代码

效果图:

image-20210519163252589

开启专业模式

原样式:

image-20210519164722945

位置:app\js\ui-process.js

原值1:return A.user.account.pro_mode

修改值1:return true

原值2:return A.user.username

修改值2:return 'FreeUser'

image-20210519155950442

image-20210519164859497

效果图:

image-20210519164928210

image-20210519165106493

Hint:这里需要替换修改两处内容,开启专业模式后上面的Sentry longer就没了。

关于信息

位置:app\js\main-process.js

原值:Version ${this.options.version}\n\nTermius Corporation

修改值:Version ${this.options.version}\nTermius Corporation\nCracked by Oliver

Hint:为了显示破解信息故作者在关于增加此信息

打开开发者工具

位置:app\js\main-process.js

原值:this.browserWindow.loadURL(e.url)

修改值:this.browserWindow.webContents.openDevTools()

屏蔽自动更新

1、删除 resources/app-update.yml

2、去除菜单栏里的检查更新

原样式:

image-20210519170118572

位置:app\js\main-process.js

定位值:)},visible:

这边定位会出现两处代码,可以看一下第一个位置,它不显示是怎么写的,如图这便混淆后要想不显示则设置的是gu()

image-20210519165729354

接下来跳转至第二处定位值,注意后面应该有“About”,将这里的vu()改为gu()

image-20210519165901693

参考值:

1
{label:"Check for Update",click(){_u("menu:check-for-update")},visible:vu()}

修改为:

1
{label:"Check for Update",click(){_u("menu:check-for-update")},visible:gu()}

效果图:

image-20210519170411325

总结

一定要记得每修改一处代码就要保存,打开程序是否能正常打开。如果你按照上面的方法修改后,就可以愉快的使用Termius了,提示下不要将app文件夹在打包asar文件,打包后貌似不太管用咯!