Myeclipse2022注册码逆向分析实录前言:之前为了注册52破解论坛的账号,写了一篇tongweb7容器破解的文章,结果给通报了,文章给移动了,管理员觉得怕我的小心脏受伤,还将该篇文章给了一个”精华”。随着在52破解网玩了一段时间后,发现好像精华的文章还是比较少的,忽然感觉自己被认可了,这个精华给足了我满满的虚荣心。随后我开始观察什么样的文章可以拿精华,总结发现,只有分析软件许可,最后破解的文章比较容易得精华。
随后我就一直在思考要写一篇破解什么的比较好,思考过后,我记得N久前好像安装过一个Myeclipse2022,但是启动后,许可过期了,马上2022就结束了,希望管理员能够给个精华,再次满足我小小的虚荣心!
声明:
本人对此次逆向分析只是为了分析学习软件安全是如何防范的,知道如何逆向分析软件,我们才知道如何更好的防范他人逆向破解。本文仅研究分析myeclipse的许可安全激活算法,不提供传播注册激活码生成相关脚本,包括使得他人能注册破解myeclipse的相关程序,其实文中关系到完全破解myeclipse的关键操作都已删减,希望所有同学都支持正版。
开始正题。
启动Myecipse提示已经过期53天了
image.png
接下来,我们开始找到这个校验逻辑的程序代码,可以使用jvm参数 -verbose开启日志
修改myeclipse.ini文件,新增class加载日志(目的是用于定位lic许可相关的class在哪个jar),将javaw修改为java是有个控制台,方便看见日志输出
image.png
重新启动myeclipse随便输入一个许可号
image.png
查看class加载日志,简单的搜索下lic字符,观察分析
image.png
在看一张大图,可以看见许可的弹框Dialog相关类
image.png
我们就去找这几个jar都拿出来反编译分析下(主要是这下也不知道许可相关代码在什么位置,先拿出来分析下)D:/ProgramFiles/Myeclipse/configuration/org.eclipse.osgi/35/0/.cp/libs/genuitec-gson-2.8.5.jar/D:/ProgramFiles/Myeclipse/plugins/org.eclipse.jdt.ui_3.25.0.v20211115-1252.jar/D:/ProgramFiles/Myeclipse/plugins/com.genuitec.eclipse.core_16.0.0.202203221716.jarD:/Program Files/Myeclipse/plugins/com.genuitec.eclipse.ui.common.platform_13.0.0.202203221713.jar 使用eclipse(我的eclipse有自带反编译插件JAD之类的)新建一个工程,用于破解myeclipse测试,静态分析相关代码,写测试用例
image.png
查看com.genuitec.eclipse.core_16.0.0.202203221716.jar这个jar就发现如下图所示,有混淆的代码(那些A.class之类的),还有公钥,非对称加密算法工具类RSA,看来许可控制相关程序就在整个包下了,有了这些我们就可以逆向分析注册算法了
image.png
反编译一份代码
image.png
根据弹框信息关键字搜索Invalid license, please double check your ID and code
image.png
搜索得到了一个许可验证正确与否的方法如下图:com.genuitec.eclipse.core.ui.wizard. UpdateLicenseDialog. Validate()
image.png
破解的关键其实就是下断点,如在OD中调试我们都喜欢在不同的win都是弹框函数下断点,然后出栈找到调用的方法,然后就是CMP、JE、JMP等关键比较的地方进行分析,如果补丁就是等于暴力破解该程序。总的静态分析代码只能做到缩小分析范围,方便调试时候下断点,接下来,这里先反编译class代码(原本代码给混淆了,肯定是不能正确编译的),且修正java代码达到可以编译打包进行补丁原本的程序。在修正java代码需要耐心,这里还是需要一些时间的,可以使用多个反编译工具逆向的结果进行对比结合,然后修正(比较耗时,要耐心)修补后如下图所示:
image.png
其实我们只需要修正几个需要调试的class即可,然后用于替换原本jar包中的class文件,然后替换到myeclipse中开启动态调试,再次输入ID与注册码
image.png
发现我们动态调试可以查看到输入的信息了,当K是false代表s与s2都是我们输入的ID与激活码,true的时候就是公钥私钥认证机器指纹的那条线,我们开始分析
image.png
这时候感觉我们已经成功一半的感觉了,只要可以动态调试说明接下来就可以暴力破解,或者分析激活算法编写注册机了,但是会发现,几秒钟过后,myeclipse会自动关闭退出了,猜测可能是myeclipse有反调试的程序,或者是因为我们修改替换了class,myeclipse有相关完整性验证签名的机制,检测到有修改了class代码,然后就直接退出了。
image.png
手写一个findClass,使用javaAgent技术用来替换verbose检索class加载,将日志输出到文件检索日志中也有体现
image.png
接下来就是如何去除完整性校验,直接全局搜索找关键字,将所有jar解压,好多文件
image.png
利用搜索工具全局搜索class文件,properties文件、xml文件,所有文件夹都不放过,搜索” This product did not pass the MyEclipse integrity check” 好庞大的检索当然我们运气不错,搜索结果如下:
image.png
分析重点开始查看这几个类com.genuitec.eclipse.meexplorer_13.0.0.202203221713\com\genuitec\eclipse\meexplorer\filter\MEFileNameFilter$2.classcom.genuitec.eclipse.server.core_13.0.0.me202203171613\com\genuitec\eclipse\server\core\ServerLaunchClasspathProvider$2.classcom.genuitec.eclipse.ui.common_13.0.0.202202011855\com\genuitec\eclipse\core\ui\preference\MECPListContentProvider.class确定了,就是这个几个类,如下图(这里就只贴一张吧),
image.png
接下来就是利用暴力破解的那套,你CMP,我JMP,”我不管你如何比较判断,反正我强制跳转”,Java还是比汇编指令舒服的,起码指令可以随意添加,要是汇编,可能指令过长,还得另外寻找一个空的代码段用于编写补丁程序,跳过去补丁程序,然后补丁程序在跳回来。(我可能破解太激动了,走到隔壁win程序破解了,偏了,我的错,我们继续回到主线)修改好相关的类,然后补丁修改到相应的jar包,然后又可以重启myeclipse了
image.png
三个jar补丁后,我以为已经去除完整性校验了, 结果还是没完全去除,可能是没有检索完全
image.png
接下来的几个代码完整性校验的逻辑就不贴了(因为涉及是否能破解,且大致完整性校验的逻辑都是一样的)在这里可以给myeclipse公司的开发一些建议,可以将这些字符串使用加密形式存储到某个常量里面,那么在源程序中使用字符串检索就无效了,这样可以加大破解的难度,提高了破解的门槛。
同上去除完整性代码操作,补丁后,再次启动myeclipse,正常了,没有完整性校验错误提示了,这下我们可以随心所欲的动态调试分析算法了。
image.png
到这里一波三折,感觉myeclipse破解这差点把人弄劝退,不过好在坚持了,也成功了。这里题外分享以下:如果仅仅只是为了分析算法,动态调试,其实还有一种办法是可以不去除完整性.也可以让myeclipse是不会退出的,在控制台窗口,myeclipse刚好启动完毕后,鼠标点击它(win11等于阻塞该线程),那么myeclipse是不会退出的。当然我们是奔着精品贴,所以必须去除完整性校验了,否则就没意思了。再次输入激活码如下图所示:
image.png
开始动态跟踪调试,发现一个关键的算法
image.png
很遗憾,第一次跑到异常里去了,按照提示,可能是位数太少了
image.png
那这次我们加大A的值长度
image.png
结果还是不行
image.png
看来也不能太长了,因为下面代码21字节后面的要转换为int,且这个分支不能进入,我们要让他相等
image.png
到这里我们主要要分析方法如下,两个加密解密算法A()可以理解位一个亦或,明文进去变成密文,密文进去变成明文
image.png
image.png
我们手写一个测试用例(其实就是注册机,我们会一直完善该类知道生成合法的注册码),找出ID和code的关系,自动生成
image.png
进入调试,发现我们随便写的ID是不符合规程的,但是不影响我们继续分析
image.png
7-13位应该是个数字类型的,第1位的字符应该是Y或者T,我们继续生成ID与code继续调试如下:
image.png
到这里,ID还要修改
image.png
反正以上都是不断的补ID的规则一直尝试(一位一位的调试补充),直到我看见这串代码,我感觉应该是一个合法的ID,那么我就拷贝一个且生成code后
image.png
再次输入验证,忽然发现这是一个过期的,但是是一个合法的ID
image.png
简单的分析了下这个注册码格式后,14到20位应该表示的是注册码过期时间,重新生成后(是不是有丝丝的小激动了,感觉我要成功了),再次注册如下图所示:
image.png
接下来就是破解激活码了
image.png
相同方法找到激活码校验的方法,如下所示
image.png
这个方法是系统解析用户输入的激活码信息 -RSA公钥解密激活码串,等会我们需要重新生成公私密钥对,用于加密(明文激活码) -解析机器指纹 -解析用户code -许可有效期
image.png
读取公钥文件
image.png
下图红色框推出激活码里面的code的位置
image.png
这里可以看出系统id的长高度和组合规则,一个共是19位
image.png
我们可以做一个假的先进行调试,用于跟踪我们输入的信息与程序获取的系统信息比较,当debug到下图方法时候,我们知道了程序获取当前系统的指纹信息是create();返回的SystemId,该方法可以用来编写注册机使用
image.png
到这里我们就开始编写注册机了脚本了,原本的RSAUtil可以直接使用,生成公钥和私钥(工程左侧的红框俩个文件)
image.png
机器指纹的算法,参考SystemIdFactory.create(),主要逻辑如下:
image.png
下图的脚本运行生成了一个注册码激活码(完整的注册激活码生成算法的细节就不展示了)
image.png
再次验证,这次的ID和code我们修改位了2099年12月31日
image.png
点击激活后,有三种验证方式,我们脚本都编写好了
image.png
输入激活码
image.png
最后看看成果,成功了
image.png
另外URL自己访问的形式注册的,可以看出注册的http服务请求url如下
image.png
我们也编写的注册脚本可以大家http服务用于其他机器安装myeclipse时候可以计算出激活码,我这里就是简单的截取url的参数生成激活码
image.png