⑴ Android软件安全与逆向分析的书名
本书由浅入深、循序渐进地讲解了Android 系统的软件安全、逆向分析与加密解密技术。包括Android软件逆向分析和系统安全方面的必备知识及概念、如何静态分析Android 软件、如何动态调试Android 软件、Android 软件的破解与反破解技术的探讨,以及对典型Android 病毒的全面剖析。
本书适合所有Android 应用开发者、Android 系统开发工程师、Android 系统安全工作者阅读学习。 丰生强(网名非虫)
Android软件安全专家。看雪论坛Android安全版版主;安卓巴士开发交流版版主。
对Android软件与系统安全有狂热的爱好和独到的见解,对Android系统的全部源代码进行过深入地研究和分析。逆向分析实战经验丰富。
在国内信息安全杂志上发表过多篇有价值的软件安全文章,目前就职于国内某Android开发企业,常年混迹于看雪论坛(ID非虫)。
作者邮箱:[email protected]
愿与国内安全爱好者共同交流与探讨安全技术。 第1章 Android程序分析环境搭建11.1 Windows分析环境搭建11.1.1 安装JDK11.1.2 安装Android SDK31.1.3 安装Android NDK51.1.4 Eclipse集成开发环境61.1.5 安装CDT、ADT插件61.1.6 创建Android Virtual Device81.1.7 使用到的工具91.2 linux分析环境搭建91.2.1 本书的Linux环境91.2.2 安装JDK91.2.3 在Ubuntu上安装Android SDK101.2.4 在Ubuntu上安装Android NDK111.2.5 在Ubuntu上安装Eclipse集成开发环境121.2.6 在Ubuntu上安装CDT、ADT插件131.2.7 创建Android Virtual Device131.2.8 使用到的工具151.3 本章小结15第2章 如何分析Android程序162.1 编写第一个Android程序162.1.1 使用Eclipse创建Android工程162.1.2 编译生成APK文件192.2 破解第一个程序202.2.1 如何动手?202.2.2 反编译APK文件202.2.3 分析APK文件212.2.4 修改Smali文件代码262.2.5 重新编译APK文件并签名262.2.6 安装测试272.3 本章小结28第3章 进入Android Dalvik虚拟机293.1 Dalvik虚拟机的特点——掌握Android程序的运行原理293.1.1 Dalvik虚拟机概述293.1.2 Dalvik虚拟机与Java虚拟机的区别293.1.3 Dalvik虚拟机是如何执行程序的343.1.4 关于Dalvik虚拟机JIT(即时编译)363.2 Dalvik汇编语言基础为分析Android程序做准备373.2.1 Dalvik指令格式373.2.2 DEX文件反汇编工具393.2.3 了解Dalvik寄存器403.2.4 两种不同的寄存器表示方法——v命名法与p命名法423.2.5 Dalvik字节码的类型、方法与字段表示方法433.3 Dalvik指令集443.3.1 指令特点453.3.2 空操作指令453.3.3 数据操作指令463.3.4 返回指令463.3.5 数据定义指令463.3.6 锁指令473.3.7 实例操作指令473.3.8 数组操作指令483.3.9 异常指令483.3.10 跳转指令483.3.11 比较指令493.3.12 字段操作指令503.3.13 方法调用指令503.3.14 数据转换指令513.3.15 数据运算指令513.4 Dalvik指令集练习——写一个Dalvik版的Hello World523.4.1 编写smali文件523.4.2 编译smali文件543.4.3 测试运行543.5 本章小结55第4章 Android可执行文件564.1 Android程序的生成步骤564.2 Android程序的安装流程594.3 dex文件格式664.3.1 dex文件中的数据结构664.3.2 dex文件整体结构684.3.3 dex文件结构分析714.4 odex文件格式804.4.1 如何生成odex文件804.4.2 odex文件整体结构814.4.3 odex文件结构分析834.5 dex文件的验证与优化工具dexopt的工作过程884.6 Android应用程序另类破解方法914.7 本章小结93第5章 静态分析Android程序945.1 什么是静态分析945.2 快速定位Android程序的关键代码945.2.1 反编译apk程序945.2.2 程序的主Activity955.2.3 需重点关注的Application类955.2.4 如何定位关键代码——六种方法965.3 smali文件格式975.4 Android程序中的类1005.4.1 内部类1005.4.2 监听器1025.4.3 注解类1055.4.4 自动生成的类1085.5 阅读反编译的smali代码1105.5.1 循环语句1105.5.2 switch分支语句1155.5.3 try/catch语句1215.6 使用IDA Pro静态分析Android程序1275.6.1 IDA Pro对Android的支持1275.6.2 如何操作1285.6.3 定位关键代码——使用IDA Pro进行破解的实例1325.7 恶意软件分析工具包——Androguard1355.7.1 Androguard的安装与配置1355.7.2 Androguard的使用方法1375.7.3 使用Androguard配合Gephi进行静态分析1445.7.4 使用androlyze.py进行静态分析1485.8 其他静态分析工具1525.9 阅读反编译的Java代码1525.9.1 使用dex2jar生成jar文件1525.9.2 使用jd-gui查看jar文件的源码1535.10 集成分析环境——santoku1545.11 本章小结156第6章 基于Android的ARM汇编语言基础——逆向原生!1576.1 Android与ARM处理器1576.1.1 ARM处理器架构概述1576.1.2 ARM处理器家族1586.1.3 Android支持的处理器架构1596.2 原生程序与ARM汇编语言——逆向你的原生Hello ARM1606.2.1 原生程序逆向初步1606.2.2 原生程序的生成过程1626.2.3 必须了解的ARM知识1646.3 ARM汇编语言程序结构1666.3.1 完整的ARM汇编程序1666.3.2 处理器架构定义1676.3.3 段定义1686.3.4 注释与标号1696.3.5 汇编器指令1696.3.6 子程序与参数传递1706.4 ARM处理器寻址方式1706.4.1 立即寻址1706.4.2 寄存器寻址1716.4.3 寄存器移位寻址1716.4.4 寄存器间接寻址1716.4.5 基址寻址1716.4.6 多寄存器寻址1716.4.7 堆栈寻址1726.4.8 块拷贝寻址1726.4.9 相对寻址1726.5 ARM与Thumb指令集1736.5.1 指令格式1736.5.2 跳转指令1746.5.3 存储器访问指令1756.5.4 数据处理指令1776.5.5 其他指令1846.6 用于多媒体编程与浮点计算的NEON与VFP指令集1856.7 本章小结186第7章 Android NDK程序逆向分析1877.1 Android中的原生程序1877.1.1 编写一个例子程序1877.1.2 如何编译原生程序1887.2 原生程序的启动流程分析1947.2.1 原生程序的入口函数1947.2.2 main函数究竟何时被执行1987.3 原生文件格式1997.4 原生C程序逆向分析2007.4.1 原生程序的分析方法2007.4.2 for循环语句反汇编代码的特点2047.4.3 if...else分支语句反汇编代码的特点2087.4.4 while循环语句反汇编代码的特点2117.4.5 switch分支语句反汇编代码的特点2157.4.6 原生程序的编译时优化2187.5 原生C++程序逆向分析2227.5.1 C++类的逆向2227.5.2 Android NDK对C++特性的支持2257.5.3 静态链接STL与动态链接STL的代码区别2277.6 Android NDK JNI API逆向分析2327.6.1 Android NDK提供了哪些函数2327.6.2 如何静态分析Android NDK程序2337.7 本章小结235第8章 动态调试Android程序2368.1 Android动态调试支持2368.2 DDMS的使用2378.2.1 如何启动DDMS2378.2.2 使用LogCat查看调试信息2388.3 定位关键代码2408.3.1 代码注入法——让程序自己吐出注册码2408.3.2 栈跟踪法2448.3.3 Method Profiling2478.4 使用AndBug调试Android程序2508.4.1 安装AndBug2518.4.2 使用AndBug2518.5 使用IDA Pro调试Android原生程序2548.5.1 调试Android原生程序2558.5.2 调试Android原生动态链接库2568.6 使用gdb调试Android原生程序2608.6.1 编译gdb与gdbserver2608.6.2 如何调试2628.7 本章小结264第9章 Android软件的破解技术2659.1 试用版软件2659.1.1 试用版软件的种类2659.1.2 实例破解——针对授权KEY方式的破解2659.2 序列号保护2719.3 网络验证2729.3.1 网络验证保护思路2729.3.2 实例破解——针对网络验证方式的破解2739.4 In-app Billing(应用内付费)2779.4.1 In-app Billing原理2779.4.2 In-app Billing破解方法2809.5 Google Play License保护2819.5.1 Google Play License保护机制2819.5.2 实例破解——针对Google Play License方式的破解2839.6 重启验证2849.6.1 重启验证保护思路2859.6.2 实例破解——针对重启验证方式的破解2859.7 如何破解其他类型的Android程序2969.7.1 Mono for Android开发的程序及其破解方法2969.7.2 Qt for Android开发的程序及其破解方法3019.8 本章小结309第10章 Android程序的反破解技术31010.1 对抗反编译31010.1.1 如何对抗反编译工具31010.1.2 对抗dex2jar31110.2 对抗静态分析31210.2.1 代码混淆技术31210.2.2 NDK保护31510.2.3 外壳保护31610.3 对抗动态调试31610.3.1 检测调试器31610.3.2 检测模拟器31710.4 防止重编译31810.4.1 检查签名31810.4.2 校验保护31910.5 本章小结320第11章 Android系统攻击与防范32111.1 Android系统安全概述32111.2 手机ROOT带来的危害32111.2.1 为什么要ROOT手机32111.2.2 手机ROOT后带来的安全隐患32211.2.3 Android手机ROOT原理32211.3 Android权限攻击32911.3.1 Android权限检查机制32911.3.2 串谋权限攻击33311.3.3 权限攻击检测33611.4 Android组件安全33911.4.1 Activity安全及Activity劫持演示34011.4.2 Broadcast Receiver 安全34311.4.3 Service安全34511.4.4 Content Provider安全34611.5 数据安全34711.5.1 外部存储安全34711.5.2 内部存储安全34811.5.3 数据通信安全35011.6 ROM安全35111.6.1 ROM的种类35211.6.2 ROM的定制过程35211.6.3 定制ROM的安全隐患35911.6.4 如何防范36011.7 本章小结361第12章 DroidKongFu变种病毒实例分析36212.1 DroidKongFu病毒介绍36212.2 配置病毒分析环境36312.3 病毒执行状态分析36412.3.1 使用APIMonitor初步分析36512.3.2 使用DroidBox动态分析36912.3.3 其他动态分析工具37312.4 病毒代码逆向分析37612.4.1 Java层启动代码分析37612.4.2 Native层启动代码分析38112.4.3 Native层病毒核心分析39312.5 DroidKongFu病毒框架总结40412.6 病毒防治40612.7 本章小结406
⑵ linuxso加载路径linuxso加载
so是什么文件?
so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据。
1、so文件就跟.dll文件差不多。
2、一般来说,so文件就是常说的动态链接库,都是C或C++编译出来的。与Java比较它通常是用的Class文件(字节码)。
3、Linux下的so文件时不能直接运行的,一般来讲,.so文件称为共享库。
4、so文件使用方法
(1)动态库的编译。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。
命令:$gcctest_a.ctest_b.ctest_c.c-fPIC-shared-olibtest.so不用该标志外部程序无法连接。相当于一个可执行文件。
(2)动态库的链接
这里有个程序源文件test.c与动态库libtest.so链接生成执行文件test:
命令:$gcctest.c-L.-ltest-otest
命令:$lddtest执行test,可以看到它是如何调用动态库中的函数的。
so格式文件是什么文件?
SO文件格式即ELF文件格式,它是Linux下可执行文件,共享库文件和目标文件的统一格式。根据看待ELF文件的不同方式,ELF文件可以分为链接视图和装载视图。
链接视图是链接器从链接的角度看待静态的ELF文件。
从链接视图看ELF文件,ELF文件由多个section组成,不同的section拥有不同的名称,权限。
而装载视图是操作系统从加载ELF文件到内存的角度看待动态的ELF文件。
从装载视图看ELF文件,ELF文件由多个segment,每一个segment都拥有不同的权限,名称。实际上,一个segment是对多个具有相同权限的section的集合。
ubuntu下怎么打包写好的Qt程序?
你可以参考SQLiteStudio这个Qt写的跨平台SQLite管理工具,它自己打包了依赖的Qt库,可以做到解压即用,兼容不同Linux发行版.道理其实跟Windows版Qt程序自带Qt库差不多.
编译前给连接器传一个参数:
说明:
-Wl表示告诉编译器将后面的参数传递给链接器.
rpath是gcc的一个参数,当程序被加载时,会搜寻rpath目录,寻找共享库.
rpath添加的目录信息保存在可执行文件中.
$ORIGIN表示可执行文件所在的目录.
也就是运行时程序会先去自己所在的目录的lib里去加载依赖库,没有的话再去系统库里找.
如果你的程序在编译时没有传递rpath参数,那你也可以用patchelf来修改你程序的rpath:
注意:patchelf修改文件后再strip会导致文件损坏.
所以应该先用strip删除符号表缩小二进制文件,然后再用patchelf设置rpath.
题外话,Android上既没有glibc库,也没有库链接器ld-linux.so.3.
如果你要把DebianARM(如树莓派Raspbian)上的软件放到Android上跑,你一样可以打包程序依赖的共享库,让程序也能跑在Android上,比如PHP:
也就是你把库链接器ld-linux-armhf.so.3和PHP依赖的库都放到/data/local/tmp/web/lib里,然后设置个别名,就能在Android的adbshell里运行树莓派的PHP了.
当然,你也可以用patchelf设置PHP的interpreter和rpath,效果差不多:
linuxso是什么文件?
SO文件格式即ELF文件格式,它是Linux下可执行文件,共享库文件和目标文件的统一格式。
根据看待ELF文件的不同方式,ELF文件可以分为链接视图和装载视图。链接视图是链接器从链接的角度看待静态的ELF文件。
从链接视图看ELF文件,ELF文件由多个section组成,不同的section拥有不同的名称,权限。而装载视图是操作系统从加载ELF文件到内存的角度看待动态的ELF文件。
从装载视图看ELF文件,ELF文件由多个segment,每一个segment都拥有不同的权限,名称。实际上,一个segment是对多个具有相同权限的section的集合。
(2)反编译WindowsQt程序扩展阅读:
由于Android操作系统的底层基于Linux系统,所以SO文件可以运行在Android平台上。Android系统也同样开放了C/C++接口供开发者开发Native程序。
由于基于虚拟机的编程语言JAVA更容易被人反编译,因此越来越多的应用将其中的核心代码以C/C++为编程语言,并且以SO文件的形式供上层JAVA代码调用,以保证安全性。
而ELF头表记录了ELF文件的基本信息,包括魔数,目标文件类型(可执行文件,共享库文件或者目标文件),文件的目标体系结构,程序入口地址(共享库文件为此值为0),然后是section表大小和数目,程序头表的大小和数目,分别对应的是链接视图和装载视图。