一、前言
今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了:Android中静态方式破解Apk
主要采用的是静态方式,步骤也很简单,首先使用apktool来反编译apk,得到smail源码,然后分析smail代码,采用代码注入技术来跟踪代码,然后找到关键方法进行修改,进而破解,同时还可以使用一些开源的hook框架,比如:Xposed和Cydia Substrate,来进行关键方法的hook。所以这里我们可以看到我们破解的第一步是使用apktool来进行成功的反编译,然后是需要了解smali语法,不过关于smali语法其实很简单,网上有很多教程。
二、知识概要分析
那么今天我们就用另外一种方式来破解apk:动态方式,关于动态方式其实很广义的,因为动态方式相对于静态方式来说,难度大一点,但是他比静态方式高效点,能够针对更过的破解范围。当然动态方式很多,所以这里就分为三篇文章来讲解这块:
1、动态方式破解apk前奏篇(Eclipse动态调试smail源码)
2、动态方式破解apk升级篇(IDA动态调试so源码)
3、动态方式破解apk终极篇(应对加固的apk破解方法)
从这三篇文章能够让我们破解一般的apk没有任何问题,不过不能代表能够破解所有的apk,因为没有绝对的安全,也是没有绝对的破解,两方都在进步,我们只能具体问题具体分析。好了,下面我们就来看第一篇文章,也是今天的重点:Eclipse动态调试smali源码
首先需要解释一下,这里为什么说是调试smali源码,不是Java源码,因为我们弄过反编译的人知道,使用apktool反编译apk之后,会有一个smali文件夹,这里就存放了apk对应的smali源码,关于smali源码这里不解释了,网上有介绍。
三、案例分析
因为这一篇是一个教程篇,所以不能光说,那样会很枯燥的,所以这里用一个例子来介绍一下:
第一步:使用apktool来破解apk
但是有一个参数必须带上,那就是:-d
因为这个参数代表我们反编译得到的smali是java文件,这里说的文件是后缀名是java,如果不带这个参数的话,后缀名是smali的,但是Eclipse中是不会识别smali的,而是识别java文件的,所以这里一定要记得加上这个参数。
上面我们反编译成功了,下面我们为了后续的调试工作,所以还是需要做两件事:
2》在入口处添加waitForDebugger代码进行调试等待。
adb dumpsys activity top 命令查看都是可以的。
找到入口Activity之后,我们直接在他的onCreate方法的第一行加上waitForDebugger代码即可,找到对应的MainActivity的smali源码:
然后添加一行代码:
invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
第三步:回编译apk并且进行签名安装
java -jar apktool_2.0.0rc4.jar b -d out -o debug.apk
关于签名的相关知识,可以看这篇文章:
Android中的签名机制详解
java -jar .signsignapk.jar .sign estkey.x509.pem .sign estkey.pk8 debug.apk debug.sig.apk
签名之后,我们就可以进行安装了。
第四步:在Eclipse中新建一个Java工程,导入smali源码
这一步我们看到,其实说的比较广义了,这个要具体问题具体分析了,比如这个例子中,我们知道当我们输入密码之后,肯定要点击按钮,然后触发密码的校验过程,那么这里我们知道找到这个button的定义的地方,然后进入他的点击事件中就可以了。这里分为三步走:
这里我们看到定义是@+id/button这个值。
第六步:运行程序,设置远程调试工程
在第五步中,我们找到了关键点,然后打上断点,下面我们就来运行程序,然后在Eclipse中设置远程调试的工程
1》在程序等待远程调试服务器的时候,前面会出现一个红色的小蜘蛛
2》在调试服务端这里我们会看到两个端口号:8600/8700,这里需要解释一下,为什么会有两个端口号呢?
222》JDWP协议(用于传输调试信息的,比如调试的行号,当前的局部变量的信息等),这个就可以说明,为什么我们在一开始的时候,反编译成java文件,因为为了Eclipse导入能够识别的Java文件,然后为什么能够调试呢?因为smali文件中有代码的行号和局部变量等信息,所以可以进行调试的。
其实他的作用就是远程调试端备用的基本端口,也就是说比如这里的破解程序,我们用8600端口可以连接调试,8700也是可以的,但是其他程序,比如demo.systemapi他的8607端口可以连接调试,8700也是可以的:
好了,到这里我们就弄清楚了,Java中的调试系统以及远程调试的端口号。
注意:
我们可以在Eclipse中新建一个远程调试项目,将我们的smali源码工程和设备中需要调试的程序关联起来:
#Listner方式:是调试客户端启动就准备好一个端口,当调试服务端准备好了,就连接这个端口进行调试
好了,我们设置完远程调试的工程之后,开始运行,擦发现,设备上的程序还是白屏,这是为什么呢?看看DDMS中调试程序的状态:
擦,关联到了这个进程,原因也很简单,我们是上面使用的是8700端口号,这时候我们选中了这个进程,所以就把smali调试工程关联到了这个进程,所以破解的进程没反应了,我们立马改一下,用8600端口:
好了,这下成功了,我们看到红色的小蜘蛛变成绿色的了,说明调试端已经连接上远程调试服务端了。
注意:
我们在设置远程调试项目的时候,一定要注意端口号的设置,不然没有将调试项目源码和调试程序关联起来,是没有任何效果的
第七步:开始运行调试程序,进入调试
那么上面我们就分析完了所有的代码逻辑,还不算复杂,我们来梳理一下流程:
A>调用MainActivity中的getTableFromPic方法,获取一个table字符串
B>通过MainActivity中的getPwdFromPic方法,获取正确的密码内容
C>获取我们输入内容的utf-8的字节码,然后调用access$0方法,获取加密之后的内容
D>access$0方法中在调用bytesToAliSmsCode方法,获取加密之后的内容
这个方法是最核心的,我们通过分析知道,他的逻辑是,通过传递进来的字节数组,循环遍历数组,拿到字节转化成int类型,然后在调用密钥库字符串table的charAt得到字符,使用StringBuilder进行拼接。
通过上面的分析之后,我们知道获取加密之后的输入内容和正确的密码内容做比较,那么我们现在有的资源是:密钥库字符串和正确的加密之后的密码,以及加密的逻辑
那么我们的破解思路其实很简单了,相当于,我们知道了密钥库字符串,也知道了,加密之后的字符组成的字符串,那么可以通过遍历加密之后的字符串,循环遍历,获取字符,然后再去密钥库找到指定的index,然后在转成byte,保存到字节数组,然后用utf-8获取一个字符串,那么这个字符串就是我们要的密码。
补充:
所以从这里可以看到,这个例子,其实我们在破解apk的时候,有时候日志也是一个非常重要的信息。
破解需要的资料,我已经上传了,想动手的同学可以尝试的操作,下载地址:
http://download.csdn.net/detail/jiangwei0910410003/9526113
四、思路整理
1、我们通过apktool工具进行apk的反编译,得到smali源码和AndroidManifest.xml,然后修改AndroidManifest.xml中的debug属性为true,同时在入口处加上waitForDebug代码,进行debug等待,一般入口都是先找到入口Activity,然后在onCreate方法中的第一行这里需要注意的是:apktool工具一定要加上-d参数,这样反编译得到的文件是java文件,这样才能够被Eclipse识别,进行调试。
2、修改完成AndroidManifest.xml和添加waitForDebug之后,我们需要在使用apktool进行回编译,回编译之后得到的是一个没有签名的apk,我们还需要使用signapk.jar来进行签名,签名文件直接使用测试程序的签名文件就可以,最后在进行安装。
3、然后我们将反编译之后的smali源码导入到Eclipse工程中,找到关键点,进行下断点,这里的关键点,一般是我们先大致了解程序运行的结构,然后找到我们需要破解的地方,使用View分析工具,或者是使用jd-gui工具直接查看apk源码(使用dex2jar将dex文件转化成jar文件,然后用jd-gui进行查看),找到代码的大体位置。然后下断点,这里我们可以借助Eclipse的DDMS自带的View分析工具找到对应控件的resid,然后在全局搜索这个控件的resid,或者直接在values/public.xml中查找,最终定位到这个控件位置,在查看他的点击事件即可。
4、设置远程调试工程,首先运行需要调试程序,然后在DDMS中找到对应的调试服务端的端口号,然后在Debug Configurations中设置远程调试项目,设置对应的调试端口和ip地址(一般都是本机pc,那就是localhost),然后红色小蜘蛛变成绿色的,表示我们的远程调试项目连接关联上了调试程序,这里需要注意的是,一定需要关联正确,不然是没有任何效果的,关联成功之后,就可以进行操作。
5、操作的过程中,会进入到关键的断点处,通过F6单步,F5单步进入,F7单步跳出,来进行调试,找到关键方法,然后通过分析smali语法,了解逻辑,如果逻辑复杂的,可以通过查看具体的环境变量的值来观察,这里也是最重要的,也是最复杂的,同时这里也是没有规章可寻的,这个和每个人的逻辑思维以及破解能力有关系,分析关键的加密方法是需要功底的,当然这里还需要注意一个信息,就是Log日志,有时候也是很重要的一个信息。
6、最后一般当我们知道了核心方法的逻辑,要想得到正确的密码,还是需要自己用语言去实现逻辑的,比如本文中的加密方法,我们需要手动的code一下加密的逆向方法,才能得到正确的密码。
五、遗留问题
2、本文中说到了Java的调试系统,但是为了篇幅限制,没有详细的讲解了整个内容,后面会写一篇文章具体介绍Java中的调试系统以及Android的调试系统。
3、有时候我们还会遇到回编译成功了,然后遇到运行不起来的错误,这个就需要使用静态方式先去分析程序启动的逻辑,看看是不是程序做了什么运行限制,比如我们在静态分析那篇文章中,提到了应用为了防止反编译在回编译运行,在程序的入口处作了签名校验,如果校验失败,直接kill掉自己的进程,退出程序了,所以这时候我们还是需要使用静态方式去分析apk。
4、如何做到不修改AndroidManifest.xml中的debug属性就可以进行调试:
1》 修改boot.img,从而打开系统调试,这样就可以省去给app添加android:debuggable='true',再重打包的步骤了。
2》直接修改系统属性,使用setpropex工具在已经root的设备上修改只读的系统属性。使用此工具来修改ro.secure和ro.debuggable的值。
这个也会在后面详细介绍这两种方法
六、总结
这篇文章我们就介绍了如何使用Eclipse去动态调试反编译之后的smali源码,这种方式比静态方式高效很多的,比如本文中的这个例子,其实我们也可以使用静态方式进行破解的,但是肯定效率没有动态方式高效,所以以后我们又学会了一个技能,就是动态的调试smali源码来跟踪程序的核心点,但是现在市场上的大部分应用没有这么简单就破解了,比如核心的加密算法放到了native层去做,那么这时候就需要我们去动态调试so文件跟踪,这个是我们下一篇文章的内容,也有的时候,apk进行加固了,直接在apktool进行反编译就失败了,这时候我们就需要先进行apk修复,然后才能后续的操作,这个是我们下下篇的文章,如何应对apk的加固策略。通过这篇文章我们可以看到动态方式破解比静态方式高效的多,但是有时候我们还需要使用静态方式先做一些准备工作,所以在破解apk的时候,动静结合,才能做到完美的破解。
更多详细内容:www.wjdiankong.cn
本文地址:http://ww.kub2b.com/news/16852.html 企库往 http://ww.kub2b.com/ , 查看更多- 光威复材2024年下降逾15%,连续两年发生下滑
- 看完超人气游戏改编的《我的世界大电影》,我整个人都方了
- 手机大脑手机阅读「手机大脑」
- 远洋集团(03377):拟3.22亿元出售北京盛永置业投资23%股权
- 600375,停牌,退市风险解除!
- 300万像素手写滑盖三星G618行货大跌530三星滑盖手机「300万像素手写滑盖三星G618行货大跌530」
- 最新手机续航TOP10排行榜:小米14垫底,Mate60和iPhone15落榜,第一名让人很意外手机续航排行「最新手机续航TOP10排行榜:小米14垫底,Mate60和iPhone15落榜,第一名让人
- “好房子”新规激发楼市活力 北京3月新旧房成交量齐增
- 智能手机:重塑现代人生活方式的双刃剑现代手机「智能手机:重塑现代人生活方式的双刃剑」
- 10块钱的VR跟7000元的到底有啥区别?部手机「10块钱的VR跟7000元的到底有啥区别?」
- 车子停多久需要启动,防止电瓶亏电?手机闲置太久充不了电「车子停多久需要启动,防止电瓶亏电?」
- AI辅助音乐创作,做有温度有情感的科技
- 朝阳区电影嘉年华开启,持电影票根可享酒店景区折扣
- 合金弹头7手机版合金弹头手机版下载「合金弹头7手机版」
- 朝鲜侠客传2M一键多开教程,小六云手机全自动挂机搬砖攻略!
- 小米4的通话录音在什么地小米手机通话录音在哪里找「小米4的通话录音在什么地」
- 细节拉满,为什么说龙珠GT是致敬经典,最后自己成了经典
- Steam集换卡牌简史:热衷集卡的玩家,都在收藏什么?
- 离谱!东映晒《海贼王》草帽海贼团无山治合照,这是演都不演了?
- 《TxT小说阅读器》最新版手机txt阅读器「《TxT小说阅读器》最新版」
- 1001Lr调色lr手机版「Lr调色」
- 922上海海关上线“携带出境宠物检疫系统”
- 923手机大脑手机阅读「手机大脑」
- 87410块钱的VR跟7000元的到底有啥区别?部手机「10块钱的VR跟7000元的到底有啥区别?」
- 805“好房子”新规激发楼市活力 北京3月新旧房成交量齐增
- 806最新手机续航TOP10排行榜:小米14垫底,Mate60和iPhone15落榜,第一名让人很意外手机续航排行「最新手机续航TOP10排行榜:小米14垫底,Mate60和iPhone15落榜,第一名让人
- 767远洋集团(03377):拟3.22亿元出售北京盛永置业投资23%股权
- 638光威复材2024年下降逾15%,连续两年发生下滑
- 619智能手机:重塑现代人生活方式的双刃剑现代手机「智能手机:重塑现代人生活方式的双刃剑」