javassist,不反编译也可以破解class

     昨天遇到一个问题,可不可以直接修改class,因为用jad反编译出来的java文件再次编译的时候出错,网上也有网友说,反编译出来的东西只能是看看思路,相对而言难度比较大。而我所谓的修改只需修改class的属性或者方法的属性,比如说从protected修改成public,或者从public修改成protected,修改的要求并不高。

    经过网上搜寻,终于找到了“帮凶”:javassist。目前来说,javassist就只能被我用来Modify一些现成的class了,其它高级功用就省了。

    原来我试过,写两个java,代码就区别在属性上,然后编译成class,比较两个class,发现真的只有一点点不同,不过,没法下手。最终能遇到javassist,真是一大幸事。

    如果使用javassist呢?网上搜索了很久,没有一篇讲得比较细的。不过javassist的官方网站有鸟语版的指南哈,照着搬弄一下还是可以搞定将protected修改成public,当然,javassist的功能完全不限于些。因为一个熟练使用javassist的家伙完全可以自己写一个java编译器,或者java反编译器,而这种难度却像南方人吃大米饭似的~

   下面讲讲,我在初步使用javassist的经验或者说是技巧。可能有高级功能我没有用到,我仅是使用自己搞懂的一点点东西去做复杂的事情哈。如果你更希望深入掌握javassist,建议直接看En版。如果你是大侠,这篇文章里也有问题for u... ...

   让我们看看如果将MMIDlet.class中的函数startApp的属性从protected 改成public

   1.我在j2me里使用javassist时,出现bug,提示找不到某某类... ...后来想,应该是j2me精简掉了吧,最终是什么原因我也不知道。所以我的经验是,要修改class请新建一个java app项目。如图:

javassist使用

  

   2.上图已经展示了项目结构,其中MMIDlet.class就是我们需要修改的类。在这个项目结构中我们需要注意的是,新建项目包名默认是JavaApplication1,也就是项目名,这个时候,我们需要将生成的包名去掉,当然这个需要我们看MMIDlet.class属于什么包了。由于示例中的MMIDlet没有指定包,所以就是空的,为了让Main.java能方便的对MMIDlet.class进行操作,将它们弄在一个包里面。Main.java里的代码:

扫描二维码关注公众号,回复: 8855381 查看本文章

3.运行,这个时候千万记住,不是选中JavaApplication1进行运行,而是选中Main.java进行运行,不然会提示没有找到相应的类哟,呵呵~~

4.修改后的类在哪里呢?从项目文件根目录下去找。由于这里,包是空的,所以生成的文件就在根目录下,如果有包的话,就会在相应的文件夹里。(我可能对包的概念有所误解似的~)



 

 

5.查看修改结果,这个改属性的结果可以使用ide查看对象结构就可以看出来。不过,还是可以下载jad,或者FrontEnd Puls反编译一下看看结果哈~

  ok, 到这里应该知道怎么使用javassist进行简单的操作了。javassist的功能比这强大很多哈。再次说明一下,如果想更全面的掌握javassist请到官方网站看教程,当然,我这里上传了一个javassist的zip,官方网站上最新的版本,里面也有教程哈。另外,把反编译的工具也传上来了,可以试试看哈。

(做个小广告:过一阵子,我可能会抽时间将javassist翻译成中文,如果有兴趣看,可以关注一下,如果有兴趣一起翻译,可以联系我哈~)

发布了39 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhongdaiqi/article/details/83326269
今日推荐