看这篇文章需要的技能
1.会编译android源码(如果你不愿意编译源码,还有另外一种办法,下面我会提供)
2.会使用substrate或者xposed
以上2个网上资料很多我就不啰嗦了。
这篇帖子将讲述什么内容
1.修改源码或者不修改源码,实现全局注入,这样以后随便你怎么hook都行
附加内容
讲如何编译android源码和刷机
androidsohook的源代码
一、市面上目前的hook和注入工具
市面上目前的hook有substrate,xposed,或者一些开源的自己实现的hook和注入,但是会调用一些系统api或者自身一些特征,会被加固检测到,故提供以下文章
二、全局注入的三种思路
首先我们注入的目的,就是让我们写的钩子代码xx.so可以注入到yyy程序里面去,这样我们的xx.so就可以调用诸如mprotect和mmap来修改内存属性,去修改目标程序的内存可以来实现gothook或者inline,异或修改机器码的跳转,异或修改数据实现内存修改器。
故实现全局注入有三种办法
思路一:替换zygote,xposed那种,不多说由于其特征会被检测到,不啰嗦了网上资料很多
思路二:从so加载的过程看
可以修改linker源码,在其加载程序so的时候,比如在do_dlopen
soinfo*do_dlopen(constchar*name,intflags)
{
soinfo*si=find_library(name);//查找动态链接库
if(si!=NULL)
{
//加载我们的so
}
}
dlopen我们的so(试过失败告终,linker不允许使用malloc函数等基础函数,而一些libc的一些基本函数,如fgets依赖于malloc的实现)
思路三:从apk启动java层的代码看
(成功这也是我要介绍的)
三、根据思路三
修改frameworks/base/core/java/android/app/ActivityThread.java文件
在handleBindApplication函数插入如下代码
privatevoidhandleBindApplication(AppBindDatadata)
{
//snownote/12/
//=================全局注入之修改java层===================================================
Log.e("snowchangeFrameworkInject","--processname="+data.processName);
Filessfile=newFile("/data/local/changeFrameWorkHookConfig.txt");
if(ssfile.exists())
{
FileReaderssfr=null;
try{
ssfr=newFileReader(ssfile);
}catch(FileNotFoundExceptione){
e.printStackTrace();
}
BufferedReaderssbr=newBufferedReader(ssfr);
StringtagetPackage=null;
StringsoPath=null;
try{
tagetPackage=ssbr.readLine();//得到进程名一般为包名
}catch(IOExceptione){
e.printStackTrace();
}
if(tagetPackage!=null)
{
try{
soPath=ssbr.readLine();//得到要加载的so路径
}catch(IOExceptione){
e.printStackTrace();
}
}
try{
ssfr.close();
ssbr.close();
}catch(IOExceptione){
e.printStackTrace();
}
if(data.processName.equals(tagetPackage))
{
Log.e("snowchangeFrameworkInject","----tagetPackage"+tagetPackage);
if(soPath!=null)
{
Log.e("snowchangeFrameworkInject","---start-load-soPath"+soPath);
System.load(soPath);
}
}
}
//=============================================================================
然后编译源码,将changeFrameWorkHookConfig.txt文件内容设置为