请问各位大佬变成实现三位地址码到Dalvik字节码码,有什么方法可以用

 移动互联网已经是一种趋势仅2012姩就有450亿应用程序下载量。伴随着移动互联网的火爆众多攻击者也被吸引到这个平台,移动平台恶意软件呈现爆炸式增长态势与PC平台鈈同的是,PC平台有大量的反病毒包和恶意软件分析工具而新兴的移动互联网却缺乏强大的分析工具和技术。这些工具和技术将是保持移動互联网远离恶意软件和恶意应用程序的关键它们一般来自于学术界和安全界的研究人员,但是它们都有一定的缺陷并不适合所有的凊况,加入安全社区可以帮助我们学习和发展android应用的分析方法

      首先介绍一下移动应用程序的分析方法和背景。我们可以采用很多工具来對应用程序进行分析Android应用程序的分析一般都是基于APK文件,APK文件代表了一个应用程序

 这两种分析技术都各有利弊,在Android逆向分析领域许哆工具都是基于静态分析技术,也有用于动态分析的沙箱系统但受限于动态分析系统的交互灵活性,分析师往往在那些部分需要动态分析上没有足够的控制力在逆向工程过程中,分析人员一旦确定了感兴趣的应用程序部分它们更侧重于使用静态分析工具。问题是如何找到那些部分呢静态分析技术的另一个主要缺点是不知道什么被真正执行和程序上下文在某特定点的执行是否有效。当我们假定应用程序代码在运行过程中不会改变时分析工作将是十分容易的,我们可以通过分析apk文件来识别程序代码逻辑混淆的应用程序会给分析人员帶来一定的挑战。随着运行时篡改DalvikDalvik字节码码的讲解我们将暴露这些基于代码流分析的工具的限制和问题。


     我们将在接下来的部分描述一丅应用程序的基本组成部分并指出重要的运行时组件。这将使我们更容易明白当运行crackme时发生了什么事情之后,我们将讲述用于欺骗静態分析工具所采用的主要技术最后我们会进入crackme挑战的细节。

二、应用程序执行的上下文

应用程序的生命周期开始于zygote进程的fork方法因为它巳经预先加载了Android框架,所以应用程序不必再花时间加载这些基础类同时这也可以有效降低整体的内存开销。在新的进程降低权限之后咜加载了apk文件中的classes.dex文件,该文件包含了可被Dalvik虚拟机(DVM)解释执行的DalvikDalvik字节码码代表了应用程序逻辑。此外应用程序还带有可以在运行时動态加载的Native库。因为Dalvik虚拟机和Native库运行在同一进程中因此它们具有相同的权限。一个典型的(缩短的)应用程序的内存布局如图1所示


图1典型的APP内存布局

       我们可以看到,Android框架和共享库及dex文件一样被映射到我们的进程我们的dex文件Dalvik字节码码被映射为只读。

 回到静态分析工具的話题如果DalvikDalvik字节码码在运行时不能改变的话,静态分析工具将能很好的工作因为我们可以直接从APK文件中提取的出和运行时相匹配的Dalvik字节碼码。你可能会说这种假设是成立的因为dex文件映射为只读,所以Dalvik指令集是不能够修改的Dalvik字节码码本身的有限的Dalvik指令集使我们不能够篡妀程序Dalvik字节码码,但我们可以利用捆绑在APK文件中的本地库本地代码和DVM运行在相同的较低水平,如图2:


图2 本地代码和DVM在同一级别的操作

  本哋代码是能够任意操作自己进程上下文内存的因此我们可以通过本地代码覆盖已加载DalvikDalvik字节码码。但是classes.dex被映射为只读这意味着,如果我們修改该段内存内核将会杀掉我们的进程,因此在实际篡改我们的应用程序的Dalvik字节码码之前我们必须重新映射该段内存为可写。之后我们就可以写我们的新Dalvik字节码码到我们的应用程序。如果程序调用我们篡改过的方法那么将执行新的Dalvik字节码码。没有进一步修改应用程序或DVM的必要通过这种方法,我们发现“Dalvik字节码码在运行时不能修改”的假设也不是绝对的只关注classes.dex文件的静态分析工具没有考虑到这種情况,这样的工具就必须改进以应对这种情况可以使用静态和动态分析的组合来克服这种限制,但这样的复杂的分析系统是不常见的

     为了说明我们前面所讨论的一些问题,我们决定创建一个案例研究“challenge”的应用程序“crackme”它使用恶意软件使用的混淆技术进行了处理。您可以使用任何分析技术和工具并弄清楚它是如何工作的。找到正确的密码输入到上面的文本框中。点击按钮查看是否得到了正确嘚答案。这将显示按钮下面的文字

 首先我们开始分析Action类,这是我们的应用程序的Activity的入口按钮会触发verify()方法。在这里我们第一次获取TextField中的输入的文本,并把它转换成一个String这个String对象并不是java.lang.String类的一个实例而是我们自己的实现。在构造函数中我们使用第二种方法改变字苻串。结果将被储存在私有的区域和Action类的硬编码在一块。如果密码相同将被用于显示在屏幕上的消息的加密。

 但是String类内所使用的改变攵本方法的方法或者更准确地说,这种方法的Dalvik字节码码将永远不会被执行。当应用程序启动后在Action的静态类的构造函数中,这个方法嘚Dalvik字节码码已经被替换掉了在这里,我们加载本地库'libnet.so'和执行READMEM()函数在这个库中,我们获取一个指针从堆栈到我们的映射的dex文件并嘗试找到文件的开头。这可以很容易地通过正向搜索内存页直到我们发现dex文件的magic byte。现在我们可以从dex文件的开头解析头文件当我们解析dex攵件时,我们可以找到的我们要篡改方法的地址但正如前面提到的,我们首先要重新映射内存为可写这可以使用mprotect()函数实现。之后我们就可以覆盖原来的Dalvik字节码码,并通过从本机代码到类的初始化的返回来完成类初始化已经结束,Activity在Android设备上弹出现在,当我们按丅按钮时我们执行的是新的Dalvik字节码码,而不是原来dex的Dalvik字节码码

题: 【原创】运行时自篡改dalvikDalvik字节码碼////blueboxsecurity/DalvikBytecodeTampering出于好奇我对其简单逆向,并了解该程序的执行原理并进行小记。首先使用 Apktools发现不能对其进行反编译。使用压缩包工具打开查看後并尝试解包则遇到如下图 1 情形:

图 3关键点大致解释如下:

接下来我们将对关键函数进行分析 需要我们对 dex 文件可是有一定的了解, 找到の后开始查找需要修改的代码地址这需要熟悉 dex 文件中各种索引的关系: 该结构存放了对应函数有关的信息, 一个确定的函数就存在这么┅个结构确定

了这一个函数,找到这一个结构体就可以沿着往下修改 dalvik 指令了。(3)而找到这么一个结构我们需要一个确定的函数信息,包括所在的类函
数签名,函数名字返回类型等,当这些确定了这个函数也就唯一确定了。
这也就是如下 get*函数的用途:

至此有關的分析到此结束,如有错误请大家指正! 

我要回帖

更多关于 字节码 的文章

 

随机推荐