本文主要介绍Android动态加载jar的技术,如何开发一个可以自定义控件的Android应用?就像eclipse一样,可以动态加载插件;如何让Android应用执行服务器上的不可预知的代码?如何对Android应用加密,而只在执行时自解密,从而防止被破解?这篇文章是一个基础,后面的一些文章会以此继续深入。
算法-排序
运行时间
评估算法的性能
。首先,要计算各个排序算法在不同的随机输入下的基本操作的次数(包括比较和交换,或者是读写数组的次数)。然后,我们用这些数据估计算法的相对性能。
额外的内存使用
排序算法的额外内存开销和运行时间是同样重要的。排序算法可分为两类:除了函数调用所需的栈和固定数目的实例变量之外无需额外内存的原地排序算法,以及需要额外内存空间来存储另一份数组副本的其他排序算法。
基于线程的并发编程
Android Hooking
Radare2使用说明
radare2
1 | $ radare2 -h # 查看帮助 |
Android Debug
Android代码调试
与Java一样,Dalvik实现了一个标准的调试接口,称为Java调试线协议
(Java Debug Wire Protocol, JDWP
)。所有用来调试Dalvik和Java上的程序的工具都是基于此协议开发的。 深入Java调试体系
Android设备监视器(Monitor)和Dalvik调试监视服务器(DDMS)都采用了JDWP标准协议,它们用JDWP访问指定应用的信息(线程、堆使用情况、正在进行的方法调用)
ARM基础
Register
from r0
to r15
r0
is used as a return value of functionsr11
is used like EBP (called FP)r12
intra-procedure-call scratch register (called IP)r13
is used like ESP (called SP)r14
is Link-Register (called LR)r15
is used like EIP (called PC)
all register are completely general, you can set a value to r15
directlyldr r1, [pc]
;(pc point to ‘.long 0x00001337’)b go_next
.long 0x00001337
freenote_x64堆漏洞double free利用
漏洞程序freenote_x64下载
运行程序,这是一个note笔记本程序:
1 | ➜ ./freenote_x64 |
Heap Overflow Using Unlink
gcc手动编译Android原生程序
编译原生程序:
- 使用gcc编译器写makefile文件手动编译
- 使用ndk-build工具自动编译
工具
path_to/android-ndk-r10c/toolchains/arm-linux-androideabi-4.9/prebuilt/ darwin-x86_64/bin
目录下保存着完整的工具链:
arm-linux-androideabi-g++ C++编译工具
arm-linux-androideabi-gcc C编译工具
arm-linux-androideabi-gdb 调试工具
arm-linux-androideabi-ld 链接器,用于生成可执行程序
arm-linux-androideabi-nm 列出目标文件中的符号
arm-linux-androideabi-objdump 输出目标文件的信息
arm-linux-androideabi-readelf 显示elf格式可执行文件信息
arm-linux-androideabi-size 列出目标文件每一段的大小
arm-linux-androideabi-strings 列出目标文件的可打印字符串
arm-linux-androideabi-strip 去除目标文件中的符号信息