BruceFan's Blog

Stay hungry, stay foolish

0%

ptrace on Android

无论是hook还是调试都离不开ptrace这个system call,ptrace可以跟踪目标进程,并且在目标进程暂停的时候对目标进程的内存进行读写。
首先看一下要ptrace的目标程序,用来一直循环输出一句话”Hello, Hooking!”

阅读全文 »

radare2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ radare2 -h # 查看帮助
$ r2 -d file # 调试一个文件
> d? #显示调试命令
|Usage: d # Debug commands
| db[?] Breakpoints commands
| dc[?] Continue execution
| dm[?] Show memory maps
| dr[?] Cpu registers
...
> v # 进入visual mode,q退出;
# c可以显示一个游标;
# 按shift加hjkl可以选中;
# visual mode中可以用i来overwrite字节;
# p/P切换其他visual mode view;
# s - step into,S - step over当前指令;
# b下断点;
# : 可以在visual mode中输入常规的radare命令
阅读全文 »

Android代码调试

与Java一样,Dalvik实现了一个标准的调试接口,称为Java调试线协议(Java Debug Wire Protocol, JDWP)。所有用来调试Dalvik和Java上的程序的工具都是基于此协议开发的。 深入Java调试体系
Android设备监视器(Monitor)和Dalvik调试监视服务器(DDMS)都采用了JDWP标准协议,它们用JDWP访问指定应用的信息(线程、堆使用情况、正在进行的方法调用)

阅读全文 »

Register
from r0 to r15
r0 is used as a return value of functions
r11 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 directly
ldr r1, [pc] ;(pc point to ‘.long 0x00001337’)
b go_next
.long 0x00001337

阅读全文 »

编译原生程序:

  • 使用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 去除目标文件中的符号信息

阅读全文 »

反射机制

反射是Java语言的一个特性,是Java被视为动态语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括modifiers(如public,static等)、superclass(如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。Java可以加载一个运行时才得知名称的class,获得其完整结构。
A Simple Example

阅读全文 »

类加载机制

Dalvik虚拟机中,类加载机制的主要功能就是将应用程序中Dalvik操作码以及程序数据提取并加载到虚拟机内部。Dex文件是类加载机制的输入文件,输出是一个名为ClassObject的数据结构实例对象。

工作流程

类加载机制的主要内容及工作流程主要分三点:
(1) 对Dex文件进行验证并优化。
(2) 对优化后的Dex文件进行解析。
(3) 对指定类进行实际加载。

阅读全文 »

glibc中的内存分配是由ptmalloc2实现的,ptmalloc2是dlmalloc(General purpose allocator)的分支,并加入了线程支持。
System Calls malloc内部会调用brkmmap系统调用。
Threading ptmalloc2中,当两个线程同时调用malloc,内存会立即得到分配,因为每个线程有一个单独的堆段,因此free list数据结构中保存的这些堆也是分开的。这种为每个线程分配一个单独的堆和free list数据结构的行为称为per thread arena

阅读全文 »