飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 10858|回复: 36

[Android] 分享:反汇编工具和模糊处理工具原理及使用

[复制链接]
  • TA的每日心情
    无聊
    2022-10-11 10:14
  • 签到天数: 228 天

    [LV.7]常住居民III

    发表于 2015-7-30 16:22:56 | 显示全部楼层 |阅读模式
    反编译和对安全的威胁      虽然,大部分的代码反编译是完全正大光明的,但事实是一个优秀的反汇编器是软件侵权的必需工具之一。正因如此,尤其对于在商业和不开放源代码领域中的开发人员来说,便宜的(或免费的) Java 代码反汇编工具的存在是一个严重的问题。
          就语言本身而言, 由于其相对简单的 Java 虚拟机(与真实的微处理器相比)和其写得很规范的字节码格式, Java 代码非常容易反汇编。而这随着 Java 语言在 Web 开发平台上的日益普及,已经在商业开发领域引起了很多争议。自从 Mocha 于 1996 年首次发布以来,一些在保护它们的源代码方面有过投资的公司和个人一直在为 Java 反编译器大吵大闹。
    6ddde838806e45028896db81ace90512.gif
          实际上,当 Mocha 第一次发布时,它的作者 Hanpeter van Vliet 曾被一些公司的诉讼威胁过(请参阅 参考资料)。起初,他把反编译器从他的网站上移去,但是他后来以 Crema 的形式提供了一个更好的解决方案。Crema 是一个 Java 模糊处理器,它完全对立于 Mocha。
          自 Crema 发布以来,许多 Java 模糊处理器开始出现,其中一些是商业的,也有一些是开放源代码的。正如您看到的那样,一个好的 Java 模糊处理器可以在很大程度上保护您的 Java 代码。
    针锋相对的代码模糊处理
           代码模糊处理字面上的意思就是模糊处理您代码的行为。Java 模糊处理器用不易察觉的方法改变程序,以致于它的 运行对 JVM 来说是一模一样的,但它使得试图理解程序的人更加迷惑了。
          让我们看一下当反汇编器遇到经过模糊处理后的代码会发生什么情况。清单 6 显示了 Mocha 在尝试反汇编被一种名为 jmangle 的工具模糊处理的 Java 代码后的结果。请注意以下的一小段程序和我们在前面清单中使用的是相同的,尽管乍一看,您肯定不会这么认为。
    清单 6. 经过 jmangle 模糊处理的代码       public Foo()       {           jm2 = 10;           int i = jm0();           System.out.println("foo constructor");           jm1(i);       }
          象 jmangle 这样的模糊处理器把许多变量名和方法名(有时甚至是类名和包的名称)转换成没有意义的字符串。这样就使得人们难以阅读程序,但对于 JVM 来说,其在本质上和原来的程序是一样的。
    变得卑鄙      所有的模糊处理器都要使标记变得没有意义,但他们所做的不仅仅是这些。Crema 之所以臭名昭著是因为它用了许多卑鄙的手段来阻止反汇编,并且有许多在已经出现的模糊处理器中,纷纷仿效它。
          一种常用的模糊处理代码的方法是用一个非法的字符串来替代类文件中的标记,这比使用没有意义的字符串更进了一步。替代的有可能是一个关键字,例如 private ,或者甚至是象 *** 这样没有意义的标记。一些虚拟机 -- 尤其在浏览器中 -- 对这些古怪的用法不会作出合法的反应。从技术上说,一个象 = 这样的变量与 Java 的规范是相反的;一些虚拟机可以忽略它,而另一些不可以这样。
    Crema 放置炸弹      按字面意思,Crema 使用的另一个计策就是炸弹。Crema 具有完全关闭 Mocha 的能力。它在编译后的代码中添加一个小“炸弹”,导致 Mocha 在试图反编译代码时崩溃。
           可惜,Crema 已经没有了,但有一种名为 HoseMocha 的工具是专门为关闭 Mocha 而设计的。为了了解 HoseMocha 是如何工作的,我们将使用 javap,这个值得信赖的反汇编器。清单 7 所示的是 HoseMocha 放置炸弹前的代码。
    清单 7. 放置炸弹前的代码Method void main(java.lang.String[])      0 new #4       3 invokespecial #10       6 return
    以下是 HoseMocha 处理后的代码。
    清单 8. 放置炸弹后的代码Method void main(java.lang.String[])      0 new #4       3 invokespecial #10       6 return      7 pop
          您看到那颗炸弹吗?请注意现在这个程序在返回后面有一条 pop 语句。等一下 -- 一个函数在返回之后还能做什么吗?很显然,它不能,而这就是关键所在。在返回语句后放一条指令确保了它不会被执行。您这儿所见的是根本不可能被反汇编的。因为它没有对应任何可能的 Java 源代码,所以也就没有任何意义。
          但为什么这一个小小的障碍就能导致 Mocha 崩溃呢? Mocha 可以只是简单地忽略它,或发一条警告信息并继续下去。尽管 Mocha 对于此类炸弹的脆弱性可以被认为是一个程序错误,但更有可能的是 van Vliet 为了回应对 Mocha 的攻击而故意设置的。
    游客,如果您要查看本帖隐藏内容请回复


    本帖被以下淘专辑推荐:

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 17:09
  • 签到天数: 1691 天

    [LV.Master]伴坛终老

    发表于 2015-7-30 16:40:02 | 显示全部楼层
    沙发,支持楼主
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    5 小时前
  • 签到天数: 1404 天

    [LV.10]以坛为家III

    发表于 2015-7-30 18:28:09 | 显示全部楼层
    支持一下 ,感谢分享了
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2023-3-15 11:43
  • 签到天数: 42 天

    [LV.5]常住居民I

    发表于 2015-7-30 21:24:06 | 显示全部楼层
    感谢分享。。。。。。。。。。。。。。。。。。。。。。。。。。。。看看
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    昨天 07:00
  • 签到天数: 1947 天

    [LV.Master]伴坛终老

    发表于 2015-7-30 21:44:04 | 显示全部楼层
    本帖最后由 songtao6 于 2015-7-30 21:46 编辑

    看看攻和防哪个更厉害
    看了隐藏部分和链接,怎么感觉是软文啊?
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2023-3-28 00:29
  • 签到天数: 1786 天

    [LV.Master]伴坛终老

    发表于 2015-7-30 23:03:21 | 显示全部楼层
    看看到底是什么
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    9 小时前
  • 签到天数: 2068 天

    [LV.Master]伴坛终老

    发表于 2015-7-30 23:16:49 | 显示全部楼层
    学习一下,支持楼主
    PYG19周年生日快乐!
  • TA的每日心情

    2015-11-15 17:30
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-7-31 08:27:27 | 显示全部楼层
    先来学习看看啊
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2015-7-31 11:00:49 | 显示全部楼层
    感谢楼主分享, 希望楼主 给一些实例{:soso_e113:}
    下面是我碰到的一个实例 包名为 "com.musixmatch.android.lyrify" 版本为 5.0.1    想挑战的 可以自己搜索下载地址 自己来研究一下,
    具体思路可  参考   "2015阿里安全峰会"的 <<Android混淆技巧与反混淆-小波.pdf>>
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    7 天前
  • 签到天数: 2104 天

    [LV.Master]伴坛终老

    发表于 2015-7-31 11:16:49 | 显示全部楼层
    感谢分享哈,学习看看了。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表