FinalShell 30是什么不用我多介绍了吧,目前网上貌似只有低版本(<3.9.6)的激活方法 6,甚至有一些根据机器码在线生成激活码的工具网站 12。
闲来无事,今天就来分析一下新版本的授权算法
- 首先从官网下载finalshell(话说好像有一个新域名 25,不知道是不是作者整的,安装包是msi格式的,也不知道和原版有啥区别)
- 安装后找出finalshell.jar,使用下面的命令启动,后面调试要用
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar finalshell.jar
启动后点左下角,登录时账号密码随便输入,提示密码错误不用管,只需要打开离线激活就可以看到当前生成了机器码123@acb33a2719acb54e
接着随便输入一个激活码aaa,这时点击确定下面就会显示免费版,接下来开始调试分析 - 使用idea随便创一个java项目,将finalshell.jar加到库中
可以看到,大多数类都经过了混淆,暂时不用管,因为旧版在构造机器码前后缀的时候使用到了DES算法,于是尝试在SecretKeyFactory的getInstance方法下个断点,接着附加到本地的5005调试端口上进行远程调试
输入激活码后点击一下确定,这时会触发断点,查看调用堆栈就会发现,这个DES加密就是为了生成一下后缀,摘要算法变为了keccak
和旧版的算法思路差不多,这里得到的是高级版后缀:“hSf(78cvVlS5E”,实际上断点会命中两次,第二次得到的就是专业版后缀:“FF3Go(*Xvbb5s2” - 所以新版的激活算法就是:keccak384(机器码+高级版/专业版后缀)[12:28],最后给个python脚本(python需要安装pycryptodome库):
from Crypto.Hash import keccak
from Crypto.Hash import MD5
def md5(msg):
hash_obj = MD5.new(msg)
return hash_obj.hexdigest()
def keccak384(msg):
hash_obj = keccak.new(data=msg, digest_bits=384)
return hash_obj.hexdigest()
if __name__ == '__main__':
code = input('输入机器码: ')
print('版本号 < 3.9.6 (旧版)')
print('高级版:', md5(f'61305{code}8552'.encode())[8:24])
print('专业版:', md5(f'2356{code}13593'.encode())[8:24])
print('版本号 >= 3.9.6 (新版)')
print('高级版:', keccak384(f'{code}hSf(78cvVlS5E'.encode())[12:28])
print('专业版:', keccak384(f'{code}FF3Go(*Xvbb5s2'.encode())[12:28])
最后贴个成功激活的图:
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容