没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
断断续续的总算的把android开发和逆向的这两本书看完了,虽然没有java,和android开发的基础,但总体感觉起来还是比较能接收的,毕竟都是触类旁通的。当然要深入的话还需要对这门语言的细节特性和奇技淫巧进行挖掘。 这里推荐2本书,个人觉得对android开发入门和android逆向入门比较好的教材: 《google android 开发入门与实战》 《android 软件安全与逆向分析》 1. 我对android逆向的认识 因为之前有一些windows逆向的基础,在看android逆向的时候感觉很多东西都是能共通的。但因为android程序本身的特性,还是有很多不同的
资源详情
资源评论
资源推荐
Android 逆向学习详解及实例逆向学习详解及实例
断断续续的总算的把android开发和逆向的这两本书看完了,虽然没有java,和android开发的基础,但总体感觉起来还是比较能接收的,毕竟都是触类旁通的。当然要
深入的话还需要对这门语言的细节特性和奇技淫巧进行挖掘。
这里推荐2本书,个人觉得对android开发入门和android逆向入门比较好的教材:
《google android 开发入门与实战》开发入门与实战》
《 《android 软件安全与逆向分析》软件安全与逆向分析》
1. 我对我对android逆向的认识逆向的认识
因为之前有一些windows逆向的基础,在看android逆向的时候感觉很多东西都是能共通的。但因为android程序本身的特性,还是有很多不同的地方。
1.1 反编译反编译
android程序使用java语言编写,从java到android虚拟机(Dalvik)的dex代码(可以看成是android虚拟机的机器码)需要一个中间语言的转换过程。类似.NET的IL中间虚拟
指令。而我们知道,.NET的IL中间代码之所以能很容易的”反编译”回C#源代码,是因为除了IL中间语言,还包含了大量的META元数据,这些元数据使我们可以很容易的一
一对应的反编译回C#的源代码。java的中间语言.class文件也是类似的道理,我们可以使用工具直接从dex机器码反编译回java源代码。
1.2 逆向分析手段逆向分析手段
windows的逆向分析中,我们可以使用OD或者C32ASM来分析汇编指令(当然OD还可以动态调试),或者使用IDA + F5(hex Ray反编译插件)来静态的分析源代码
(C/C++)
在android逆向分析过程中:
1) 我们可以使用ApkTool(本质上是BakSmali反汇编引擎)对apk文件进行反汇编,得到各个类、方法、资源、布局文件…的smali代码,我们可以直接通过阅读smali代码
来分析程序的代码流,进行关键点的修改或者代码注入。
2) 我们可以从apk中提取.dex文件,使用dex2jar工具对dex进行反汇编,得到jar包(java虚拟指令),然后使用jd-gui等工具再次反编译,得到java源代码,从源码级的高
度来审计代码,更快的找到关键点函数或者判断,然后再回到smali层面,对代码进行修改。这种方法更倾向于辅助性的,最终的步骤我们都要回到smali层面来修改代码。
3) 使用IDA Pro直接分析APK包中的.dex文件,找到关键点代码的位置,记下文件偏移量,然后直接对.dex文件进行修改。修改完之后把.dex文件重新导入apk中。这个
时候要注意修改dex文件头中DexHeader中的checksum字段。将这个值修复后,重新导入apk中,并删除apk中的META-INF文件夹,重新签名即可完成破解。
1.3 android与与C的结合的结合
在学习android逆向的时候感觉遇到的最难的问题就是分析原生代码,即JNI代码。开发者使用android NDK编写C/C++代码供android的java代码调用(通过java的代码转
接层来完成接口的转换)。
使用android NDK编写的C/C++代码最终会生成基于ARM的ARM ELF可执行文件,我们想要分析软件的功能就必须掌握另一项技能,ARM汇编,ARM汇编个人感觉虽
然和x86汇编类似,不过由于IDA Pro对ARM汇编没有反编译功能以及貌似没有工具能动态调试ARM代码(我网上没找到),导致我们只能直接硬看ARM代码,加上往往伴随
着复杂的密码学算法等等,导致对Native Code的逆向相对来说比较困难,对基本功的要求比较高。
1.4 关于分析关于分析android程序程序
1) 了解程序的AndroidManifest.xml。在程序中使用的所有activity(交互组件)都需要在AndroidManifest.xml文件中手动声明。包括程序启动时默认启动的主activity,通过
研究这个AndroidManifest.xml文件,我们可以知道该程序使用了多少的activity,主activity是谁,使用了哪些权限,使用了哪些服务,做到心中有数。
2) 重点关注Application类
这本来和1) AndroidManifest.xml是一起的,但是分出来说是因为这个思路和windows下的逆向思路有相通之处。
在windows exe的数据目录表中如果存在TLS项,那程序在加载后会首先执行这个TLS中的代码,执行完之后才进行main主程序入口。
在android 中Application类比程序中其他的类启动的都要早。
3) 定位关键代码
3.1) 信息反馈法(关键字查找法)
通过运行程序,查找程序UI中出现的提示消息或标题等关键字,到String.xmlzhong中查找指定字符串的di,然后到程序中查找指定的id即可。
3.2) 特征函数法
这种做法的原理和信息反馈法类似,因为不管你提示什么消息,就必然会调用相应的API函数来显示这个字符串,例如Toast.MakeText().show()
例如在程序中搜索Toast就有可能很快地定位到调用代码
3.3) 代码注入法
代码注入法属于动态调试的方法,我们可以手动修改smali反汇编代码,加入Log输入,配合LogCat来查看程序执行到特定点时的状态数据。
3.4) 栈跟踪法
栈跟踪法属于动态调试方法,从原理上和我们用OD调试时查看call stack的思想类似。我们可以在smali代码中注入输出运行时的栈跟踪信息,然后查看栈上的函数调用
序列来理解方法的执行流程(因为每个函数的执行都会在栈上留下记录)
3.5) Method Profiling
Method Profiling,方法剖析(这是书上的叫法,我更愿意叫BenchMark测试法),它属于一种动态调试方法,它主要用于热点分析和性能优化。在DDMS中有提供这个功
能,它除了可记录每个函数所占用的CPU时间外,还能够跟踪所有的函数调用关系。
1.5 关于关于android的代码混淆和加壳的代码混淆和加壳
java语言编写的代码本身就很容易被反编译,google为此在android 2.3的SDK中正式加入了ProGuard代码混淆工具,只要正确的配置好project.properties与
proguard.cfg两个文件即可使用ProGuard混淆软件。
java语言由于语言自身的特殊性,没有外壳保护这个概念,只能通过混淆方式对其进行保护。对android NDK编写的Native Code倒是可以进行加壳,但目前貌似只能进
行ups的压缩壳保护
2. CrackMe_1 分析学习分析学习
2.1 运行一下程序,收集一些运行一下程序,收集一些基本信息基本信息
weixin_38722464
- 粉丝: 4
- 资源: 939
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0