Android逆向之旅—静态分析技术来破解Apk

从这篇文章开始我们开始我们的破解之路,之前的几篇文章中我们是如何讲解怎么加固我们的Apk,防止被别人破解,那么现在我们要开始破解我们的Apk,针对于之前的加密方式采用相对应的破解技术,Android中的破解其实大体上可以分为静态分析和动态分析,对于这两种方式又可以细分为Java层(smail和dex)和native层(so)。所以我们今天主要来讲解如何通过静态分析来破解我们的apk,这篇文章我们会通过破解Java层和native层的例子来讲解。

二、准备工作

在开始今天的文章之前,我们需要准备点东西,

第一、首先是基本知识:

1、了解Android中的Apk文件的结构。

2、了解Smail语法和dex文件格式

3、apk的签名机制

关于这三个知识点,这里就不做详细介绍了,不理解的同学可以自行网上学习,有很多资料讲解的。

第二、再者就是几个重要的工具

1、apktool:反编译的利器

2、dex2jar:将dex转化成jar

3、jd-gui:很好的查看jar文件的工具

4、IDA:收费的最全破解利器(分析dex和so都可以)

下载地址:

额外:上面四个工具是最基本的,但是现在网上也有一些更好的工具:JEB,GDA等。但是这些工具就是丰富了上面四个工具,所以说我们只要上面的四个工具就足够了。IDA工具我专门给了一个下载地址,其他的工具在我们提供的案例中。

三、技术原理

准备工作完了,下面就来看一下今天的破解方式介绍:

Android中的破解的静态分析说重要,也不重要,为什么这么说呢?

因为我们到后面会介绍动态分析,那时候我们在破解一个Apk的时候,发现静态分析的方式几乎毫无用途,因为现在的程序加固的越来越高级,静态分析几乎失效,所以动态分析是必须的,但是要是说静态分析没有用,那么也错了,因为我们在有些场景下,只有静态分析能够开始破解之门,没有静态分析之后的结果,动态分析是无法开展的。这个下面会举例说明。所以说在破解的过程中,静态分析和动态分析一定会结合在一起的,只有这样我们才会勇往直前。下面就来看看我们如何通过静态分析来破解apk.

第一、静态分析的流程

1、使用apktool来反编译apk

在这个过程中,我们会发现有些apk很轻易的被反编译了,但是有些apk每次反编译都会报各种错误,这个也是正常的,因为加固了吗。现在网上有很多对apk加密的方式,直接让反编译就通不过,比如Androidmanifest文件,dex文件等,因为apktool他需要解析这些重要的资源,一旦这些文件加密了那么就会终止,所以这里我们暂且都认为apk都能反编译的,因为我们今天是主要介绍怎么通过静态分析来破解,关于这里的反编译失败的问题,我后面会在用一篇文章详细介绍,到时候会列举一些反编译错误的例子。

2、得到程序的smail源码和AndroidManifest.xml文件

我们知道一个Android的程序入口信息都会在AndroidManifest.xml中,比如Application和入口Activity,所以我们肯定会先来分析这个文件,找到我们想要的信息,当然这里还有一个常用的命令需要记住:

adb shell dumpsys activity top

能够获取到当前程序的Activity信息

然后我们会分析smail代码,进行代码逻辑的修改

3、直接解压apk文件得到classes.dex文件,然后用dex2jar工具得到jar,用jd-gui工具查看

这里我们主要很容易的查看代码,因为我们在第二步中得到了smail源码,就可以分析程序了,但是我们知道虽然smail语法不是很复杂,至少比汇编简单,但是怎么看着都是不方便的,还是看java代码比较方便,所以我们借助jd-gui工具查看代码逻辑,然后在smail代码中进行修改即可,上面说到的JEB工具,就加强了jd-gui工具的功能,它可以直接将smail源码翻译成java代码,这样我们就不需要先用jd-gui工具查看,再去smail源码中修改了,借助JEB即可。

4、如果程序中有涉及到native层的话,我们可以用IDA打开指定的so文件。我们还是需要先看java代码,找到指定的so文件,在用IDA来静态分析so文件。

第二、用到的技术

上面介绍了静态分析的流程,下面来看一下静态分析的几个技术,我们在静态分析破解Apk的时候,首先需要找到突破点,找到关键的类和方法,当然这里就需要经验了,不是有方法可循的。但是我们会借助一些技术来加快破解。

1、全局查找关键字符串和日志信息

这个技术完全靠眼,我们在运行程序之后,会看到程序中出现的字符串,比如文本框,按钮上的文本,toast显示的信息等,都可能是重要信息,然后我们可以在jd-gui工具中全局搜索这个字符串,这样就会很快的定位到我们想要找的逻辑地方:

当然我们还有一个重要点就是Android中的Log信息,因为在一个大的项目中,会有多人开发,所以每个模块每个人开发,每个人都会调试信息,所以就会添加一些log信息,但是不是所有的人都会记得在项目发布的时候关闭项目中的所有log信息,这个也是我们在项目开发的过程中不好的习惯。这时候我们就可以通过程序运行起来之后,会打印一些log信息,那么我们可以通过这些信息获取突破点,Android中的log可以根据一个应用来进行过滤的,或者我们可以通过log信息中的字符串在jd-gui中进行全局搜索也是可以的。

2、代码的注入技术

在第一种方式中我们通过全局搜索一些关键的字符串来找突破点,但是这招有时候不好使,所以这时候我们需要加一些代码了来观察信息了,这里有一个通用的方法就是加入我们自己的log代码,来追踪代码的执行逻辑,因为这里讲的是静态分析技术,所以就用代码注入技术来跟踪执行逻辑,后面介绍了动态分析技术之后,那就简单了,我们可以随意的打断点来进行调试。这里的添加代码,就是修改smail代码,添加我们的日志信息即可,在下面我们会用例子来进行讲解,这个也是我们最常用的一种技术。

3、使用系统的Hook技术,注入破解程序进程,获取关键方法的执行逻辑

关于Android中的进程注入和Hook技术,这里就不做详细介绍了,不了解这些技术的同学可以转战:

注入技术:

Hook技术:

一个人,一条路,人在途中,心随景动,从起点,

Android逆向之旅—静态分析技术来破解Apk

相关文章:

你感兴趣的文章:

标签云: