MyException - 我的异常网
当前位置:我的异常网» 编程 » 破译YourKit Java Profiler 2013的方法

破译YourKit Java Profiler 2013的方法

www.MyException.Cn  网友分享于:2014-08-07  浏览:0次
破解YourKit Java Profiler 2013的方法

最近一直很忙,今天总算抽出点时间总结一下破解YourKit Java Profiler 2013的过程。YourKit Java Profiler 2013(后面简称YJP)是我见过的软件保护做的最好的Java应用软件,虽然YJP是用Java写的应用软件,但是软件保护相关却是用C++写的,在 windows上是的Native代码是yjpagent.dll,在Linux上是Native代码是yjpagent.o。下面的破解是基于 windows版本的YJP。

1.快速浏览一下YJP的安装目录(在我电脑上路径为c:\Program Files\yjp 2013 build 13056\lib),jar包不多,yjp.jar基本上就是要破解的jar包。用java反编译工具jd-gui打开yjp.jar,可以看到jar包中大部分的class和资源文件都以“_”结尾。
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法

2. 用jd-gui无法查看这些文件,仔细查看发现这些文件经过加密处理的。大家都知道,jvm只能执行byte code代码,所以一眼看到这些加密的class文件,就能会想到,不论是如何加密以及在什么地方加密,一定在某个地方会进行解密处理,而且,加载解密后 Class的ClassLoader一定没有加密。经过仔细调查,果不其然,在YJP自定义的ClassLoader类 com.yourkit.h.l.class中找到了这部分代码:
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法

 


顺便说一下,Natives类是本地方法调用的类,并且未进行加密:
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法
       

3. 接下来要根据上面的代码:Natives.decipher1(arrayOfByte),可以把所有加密的class和资源文件可以解密出来。(这点很容易!)
  解密后的yjp包结构如下:
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法


4.接下来就在解密后class文件中查找license处理相关的代码,很快就在com.yourkit.h.n.class中找到:
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法
       
   再阅读此类和调用此类的其他类,可以了解license的结构如下:
   1.userId  (String)
   2.固定值=1 (int)
   3.授权类型 (int,可选4000/4002)
   4.授权代码  (string)
   5.License签发日期 (date)
   6.License失效日期 (为null时表示永不失效)
   7.可选项,比如免费支持有效期 
  
 5.了解了License结构,接下来就要进行破解了。
    YJP是采用RSA进行加密的,我在《破解JRebel 5.x的方法》中介绍了几种可行的破解非对称密钥加密的方法。
    如果采用伪造一对RSA公钥和密钥,并替换原有的公钥,那就需要去破解native代码yjpagent.dll。
    而破解本地代码要远比破解经过混淆的java byecode困难的多。如果有其他的可行的方法时,一般不考虑这种方式。
    (如果一定要用这种方式破解,那么首先要伪造的公钥替换掉yjpagent.dll中的公钥,并在第三步的基础上用伪造的私钥对原yjp.jar中进行了加密的class和资源进行加密)。  

   现在采取另一种更简单的破解方法,即绕过解密过程直接注入一个合法的License。经过分析,可以在com.yourkit.h.n.class中注入License。
   由于com.yourkit.h.n.class在原jar包中是加密的,为了确保注入代码后不存在任何问题就需要对此类进行加密,但是,由于不知道 YJP原始的加密密钥,除非采用前面所说的“伪造一对RSA公钥和密钥,并替换原有的公钥”。原因就是:如果注入License后不进行加密,则会存在一 个隐患:因为加密的class和未加密的class是使用不同的ClassLoader加载的,而com.yourkit.h.n.class原来是加密 的,这样com.yourkit.h.n.class的ClassLoader就发生了变化,就会引起ClassNotFoundException异 常。
    大家知道,在JVM中是由唯一决定一个Class,也就是说一个Class使用不同的ClassLoader加载时是不同的。
  
    基于上面的原因,在com.yourkit.h.n.class中注入License不是一个好的方法。仔细分析,最好的方法是在Natives类的 decipher2方法中注入License,并把decipher2由Native调用修改成非Native调用,其他所有的信息保持不变。(可以使用 cglib或javassist来完成)

6. 注入License到Natives类的decipher2方法后, 启动YJP,在License输入窗口,随便输入偶数个16进制数或者空格
   就可点击“OK”进行注册。
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法

注册完成后,看到注入的License信息:
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法

但是,在启动YJP自带的Profile demo application时出现错误,而且错误还是来自对createDatabaseImpl的native调用:
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法


7. 既然是createDatabaseImpl的native调用出错,那就用反汇编工具IDA Pro打开看看,并按F5之后看到如下伪代码。 (下面以32位的yjpagent.dll为例):
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法


  问题一目了然,黄色部分的“The installation is corrupt”跟上一步java.lang.RuntimeException信息一样。下一步要做的就是从“v18 = 0;”无条件跳转到"v18 = 2;",即绕开中间的"if ( v16 ....."检查。
  回到反汇编窗口,找到对应的指令和地址:
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法

也就是在上图中,要由地址7001CA66无条件跳转到地址7001CAAB,即:jmp short loc_7001CABB(对应的HEX代码为EB 43,EB->JMP, 43表示目的地址跟当前地址的偏移量)。换句话说,就是要把把地址7001CA66开始的汇编指令0F 84改为EB 43,并把B1 00 00 00改为90 90 90 90 (90指令代表nop)。

使用任何一种Hex Editor,比如:UltraEdit,010 Editor,HEX Workshop,WinHex等进行修改:
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法
对于64位的yjpagent.dll,处理方法基本一样,在此不再阐述。

8. 再启动YJP,并执行Profile demo application,运行良好,算是成功破解!
破解YourKit <wbr>Java <wbr>Profiler <wbr>2013的方法

总结起来,三个关键步骤:
1. 解密已经加密的"Class_"文件。
2. 在Natives中注入License。
3. 绕过yjpagent.dll中的License完整性校验。

文章评论

程序员的鄙视链
程序员的鄙视链
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
代码女神横空出世
代码女神横空出世
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
鲜为人知的编程真相
鲜为人知的编程真相
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
我是如何打败拖延症的
我是如何打败拖延症的
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
编程语言是女人
编程语言是女人
如何成为一名黑客
如何成为一名黑客
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
旅行,写作,编程
旅行,写作,编程
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员都该阅读的书
程序员都该阅读的书
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员和编码员之间的区别
程序员和编码员之间的区别
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
一个程序员的时间管理
一个程序员的时间管理
每天工作4小时的程序员
每天工作4小时的程序员
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
老程序员的下场
老程序员的下场
程序员必看的十大电影
程序员必看的十大电影
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
为什么程序员都是夜猫子
为什么程序员都是夜猫子
 程序员的样子
程序员的样子
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员应该关注的一些事儿
程序员应该关注的一些事儿
那些争议最大的编程观点
那些争议最大的编程观点
漫画:程序员的工作
漫画:程序员的工作
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
中美印日四国程序员比较
中美印日四国程序员比较
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
10个调试和排错的小建议
10个调试和排错的小建议
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有