android hook方法收集及选择优化


android有些东西需要收集下应用app的运行情况,比如网络请求等;这些工作在底层执行比较好,这样java层不需要动;根据这些需要收集了下当前网络上已有的方法:


1.android hook 框架 ADBI ,需要ptrace ,root权限执行;
2.android hook 框架 libinject2 ,需要ptrace ,root权限执行;
3.Android dalvik挂钩-Xposed框架如何实现注入,xposed 替换的就是这个  /system/bin/app_process ,需要root权限;

4.CydiaHook,需要root&安装Cydia Substrate.apk。

以上这些都需要root来执行;

下面收集的是不需要root权限:

1.基于segment的elf hook ,例子如下:

http://blog.csdn.net/L173864930/article/details/40507359

2.对1进行优化的

https://github.com/asLody/ElfHook。


通过以上比较,因为是我们需要分析自己的app,不需要收集别人应用以致系统的,因此可以选择不需要root的2进行;

对ElfHook进行分析,发现还有些问题:

1.hook so的问题,因为有些机子的so,如htc机子的so大部分的权限为p即私有;因此需要去掉只有s即分享才hook的判断;

2.解析加载进程的设备版本有点问题;原来写死了大小版本都是两位,而实际上有可能存在3位的版本号,如htc,因此这块的分析设备版本的根据符号“:”分割即可;

3.arm64-v8a编译会有些符号没有定义,找下bionic/libc/include/elf.h,把缺失不全基本上能正常编译,同时注意编译ndk的版本;

4.通过分析,java层的api调用后,相关底层的基本上是通过libjavacore.so来做jni调用,因此大部分的需要hook的方法可以到这so去查找;

5.对于某些机子如联想的个别,用android_getaddrinfofornet替换了getaddrinfo调用,但是他们的android_getaddrinfofornet的参数又跟标准的不一致,因此在hook真正调用到android_getaddrinfofornet就会崩溃了;查找libjavacore.so后,其实可以通过hook另外一个方法freeaddrinfo 来获取解析后的ip,getaddrinfo和freeaddrinfo 通过打印log来看下是配对使用的,因此用这个来hook拿到java的网络调用的ip;

6.最后补充,这个demon其实真正修改的本so引用外部实现的函数,代码修改的是rel.plt及rel.dyn跳转地址;即,枚举修改所有本应用所有加载的so多调用的外部特定函数,因此注意这个玩意是修改外部引用的函数而不是实现的这个函数的地方地址。



你可能感兴趣的:(android)