在上两篇博文中,我们研究了逆向中的两大手段:
在本篇,将着重利用上述两种手段,来参破My Eclipse 2015的注册、激活算法及软件保护机制。
先看成果,Bling授权至2099年:
激活通过:
因为之前并不熟悉My Eclipse,所以找了很久都找不到提示授权信息的界面在哪里,汗一个先!
逆向本身,是从无道到有道,其中的乐趣在于探索本身,而不是结果。
要逆向一个东西,得先熟悉它的布局、机理,否则逆向只能是空谈。
插件巨多:
当面对的是一头大象,要战胜它,就需要忍耐,你需要观察它的一举一动,然后才能出击。
这里,用我们熟悉的verbose
大法,分析类加载信息,缩小目标。
同时,搜集到的类加载信息,在后续的jar包
分析中,也是频繁要来看一看,找一找的。
关于main
:
关于license/licence
:
一旦发现或者猜想到一些门路,就要来这里看一看,然后分析jar
包中的关键类的四周信息,以充分掌握软件的特性,避免做无用功。
对My Eclipse安装目录下的*.ini
进行修改,指定我们自己的java/jre/jvm
,以方便使用 jinfo 等工具.
查看vm options
和command line args
:
通过分析,从$ME_HOME/plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
入手,尝试将程序启动起来。
正如其名,真的是个launcher/loader
,虽然程序启动起来了,但是要想在注册授权信息/My Eclipse Subscription Info
之类的附近断掉程序,并且显示源码,这一点还是远远不够的。
为了能够充分掌握某个关键类、方法的调用路径,以方便我们进行回溯或者探索重要信息,通常我们采用如下几种方法:
sed/grep/less
等工具,以及文件索引能力,方便大批量的进行关键代码搜索.-g
以产生调试信息,这一点在My Eclipse的保护机制下受到限制,但这也是我们需要突破的地方.查找使用/正向依赖/反向依赖
分析技术.总之,灵活结合上述几种手段,目的是为了充分在My Eclipse这头大象身上辗转腾挪,取我所需.
jar包是采用zip格式压缩的,所以我们也可以利用unzip
来进行解压缩.
为了取得更好的反编译效果,我们这次不使用jd
来做,在博主安装的Intellij IDEA
的lib下,有一个fern flower
的反编译工具,这也是IDEA
的默认反编译器,我们就用它了,有兴趣的东西可以搜索下,貌似跟mine craft
有很大渊源。
反编译,首先将需要反编译的包搜集到一个文件中,比如genuitec.jar.txt
中,然后建立一个简单的脚本进行批处理:
解压缩类似,就不贴图了,我们利用unzip
,你也可以利用jar/编程
等方式实现解压缩,当然,如果你不嫌累,1000多个jar包,你也可以手工解压缩^^.
unzip ${jar} -d ${out_dir}
有条件的可以用solr/lucene
来做,这里我们利用IDE的索引能力就可以了,很简单,将所有我们感兴趣的java文件,丢进IDE:
然后,就可以这样来方便地搜索我们需要的class/java文件了:
当然,也可以路径搜索:
虽然因为各种依赖关系极其复杂,要全部修复十分困难,无法全面编译并利用语义搜索等手段,但这一步,为我们充分地占有资料并检索打下坚实基础,配合前面所述的
verbose
信息,我们可以对关键代码、类、路径、符号进行搜索、跳转,极大地提升我们的分析效率。
在静态阶段,我们的分析能力是受到局限的,了解一个软件的运行机制,比较好的办法,就是调试它。
但是,我们面对的是My Eclipse这样的大象,即使给你完整的源代码,要分析清楚也是一件很困难的事,所以,我们要利用修复、截取等手段,缩小我们动态调试的范围,降低难度。
上面所述,是建立在我们的静态分析基础之上,而静态分析,需要做大量的工作,繁琐、细碎,有时会极为恼火,让你有rm -rf /
的冲动,这时候,就静下来,你做的是逆向工作,是从没有门路,创造门路,耐心和调节心情是必做的一件事,这个时候,听听无脑的神曲,尽快reset自己的烦躁,因为后面,还有许多未知的困难在等着你挑战。
ok,这里在我们反编译的java代码中,挑一段感兴趣的地方,小小修改一点,编译为class文件,替换到对应的jar包中,然后利用前文所述的launcher
来跑一下看看吧!
我擦,这什么鬼东西?
后话:My Eclipse 2015 采用的完整性验证技术,配合数字签名,以达到检测代码被修改的目的。
真是令人恼火,看来没有CLion
那么好搞,静一静,想想思路。
让我们来推测一下这个提示框的调用栈:
java
-> main
-> initialize
-> ..
-> integrationCheck
-> alert("骚年,你动了我的代码!")
好的,想必你已经懂我在说什么。
利用回溯法来分析完整性验证机制,并看看它做了什么.
既然修改了代码,出现了错误,动态调试从何谈起?
作为工程师,你能够改变世界的那一点,就在于你可以按照需要,来造轮子。
这个时候,我们有两种办法:
为什么需要自己造轮子呢?
看看我们这个时候需要的轮子:
没错,我们需要在jar包中、zip包中、文件夹中、class文件中:
如下:
这个时候,我们的检索能力如下:
在抹除前,My Eclipse的完整性验证代码之一如下:
抹除后,如下:
MyEclipse 2015 的完整性验证,分散在多个jar包的多个类中,要不遗漏,一是需要耐心,二是依赖finder的字节指纹搜索,同时配合静态环境的分析。
这里,思路很重要,剩下的就看你擅长不擅长干细活了^^.
现在,我们需要用抹除验证的代码,替换原来的代码,并删除、增加一些东西,这里你可以手动去做,毕竟jar包就是zip格式,也可以自己做patch程序。
考虑自己做patch程序的主要目的:
如下:
调试信息:
做完了上面的步骤,基本上,就可以为所欲为了。
现在,让我们将程序跑起来,以确保我们的小范围修改可以如期运行:
完整性验证保护已突破,但是还有注册保护,如上图所示,看来,逆向之旅还遥遥无期呢?
那么,如何破解注册保护呢?
下篇揭晓。
撰文不易,若觉得本文对你有益或者博你一笑,留个言,点个推荐吧 :]