修改源码实现全局(无需root)注入躲开注入检测

标签: Android xposed hook dynamic injection
1572人阅读 评论(0) 收藏 举报
分类:
看这篇文章需要的技能
1.会编译android源码(如果你不愿意编译源码,还有另外一种办法,下面我会提供)
2.会使用substrate或者xposed
以上2个网上资料很多我就不啰嗦了

一、市面上目前的hook和注入工具
市面上目前的hook有substrate,xposed,或者一些开源的自己实现的hook和注入,但是会调用一些系统api或者自身一些特征,会被加固检测到,故提供以下文章

二、全局注入的三种思路
首先我们注入的目的,就是让我们写的钩子代码xx.so可以注入到yyy程序里面去,这样我们的xx.so就可以调用诸如mprotect和mmap来修改内存属性,去修改目标程序的内存可以来实现got hook或者inline,异或修改机器码的跳转,异或修改数据实现内存修改器。

故实现全局注入有三种办法
思路一:替换zygote, xposed那种,不多说由于其特征会被检测到,不啰嗦了网上资料很多

思路二:从so加载的过程看
可以修改linker源码,在其加载程序so的时候,比如在do_dlopen
soinfo* do_dlopen(const char* name, int flags) 
{
    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函数插入如下代码
private void handleBindApplication(AppBindData data) 
{
        //snownote 2016/12/
        //=================全局注入之修改java层===================================================
        Log.e("snowchangeFrameworkInject","--processname="+data.processName);
        File ssfile=new File("/data/local/changeFrameWorkHookConfig.txt");
        if(ssfile.exists())
        {
            FileReader ssfr = null;
            try {
                ssfr = new FileReader(ssfile);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            BufferedReader ssbr=new BufferedReader(ssfr);
            String tagetPackage=null;
            String soPath=null;
            try {
                tagetPackage=ssbr.readLine();//得到进程名,一般就是包名
            } catch (IOException e) {
                e.printStackTrace();
            }
            if(tagetPackage!=null)
            {
                try {
                    soPath=ssbr.readLine();//得到要加载的so路径
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                ssfr.close();
                ssbr.close();
            } catch (IOException e) {
                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文件内容设置为
第一行,你要注入的程序的进程名,一般写包名就行了 com.carrot.carrotfantasy
第二行,你要注入的so路径 /data/local/libhooktest.so
把txt文件push到手机的/data/local/目录,即可不用实现注入而让我们的钩子代码进入程序进程
接下来就是怎么写libhooktest.so这个了
办法一:你可以使用substrate提供的hook api把你的hook代码编译成一个so
办法二:你可以不用别人的hook框架,自己写hook,这里我提供一份我以前整合修改好的hook代码,包括inline hook和got hook大家凑合着用吧(此ininline hook中指令重定位部分,参考网友ele7enxxh,感谢他解决了繁琐的指令重定位问题,有兴趣的可以看github上他的完整的他有对多进程进行处理哦!!)。


四、不想修改源码的请看这里 look me!!!!
Pull出你的设备/system/framework/framework.jar此文件,
用baksmali反编译出smali,java -jar D:\run_ProgramFile\baksmali_smali\baksmali.jar -o  classout/ framework.jar
找到ActivityThread.smali,把我提供的(我这里是android4.4)替换回去,再重新编译回去,
java -jar D:\run_ProgramFile\baksmali_smali\smali.jar classout/ -o framework_new.jar

如果你别的android系统,也可以自己写个demo把得到的smali自己加入ActivityThread.smali
push到设备就行了,记得重新设备生效

对于不想root的不能push到/data/local目录的可以先push到别的目录,然后cp过去,或者换别的目录,比如sdcard

最后附加内容
inline hook和got hook实现源代码(曾经拿保卫萝卜和我的世界测试成功)
和我曾经编译android4.x+2.3x+5.1x源码+修改源码真机运行的详细笔记(网上编译android源码的文章多如牛毛啊,实际详细的却很少)
我修改过的framework.jar
*转载请注明来自看雪论坛@PEdiy.com
查看评论

深入Android源码系列(二) HOOK技术大作战

漫天的标题党的口水文打赏爆表,冷落了一群默默输出高质量文章的人群。真正的技术文章能否得到认可?      本文讲解内容有     hook技术原理探究     hook本进程方法     ho...
  • a332324956
  • a332324956
  • 2017-07-03 14:05:38
  • 776

太激动!Android修改全局字体样式,替换整个APP字体

最近一直在如何全局修改app字体上困惑着,今天终于有了突破。我将搜集的资料进行了整理,现在提供给大家。参考链接: Android应用使用自定义字体 Android应用使用自定义字体的一些探究 A...
  • Gold_brick
  • Gold_brick
  • 2016-10-20 00:36:45
  • 13059

源码:我的关于NLP的博客(持续更新中...)

决定上传我平时写的部分源码,不过暂时只打算上传有关NLP的部分,之后随着博客的不断更新,我也会不断更新这篇博客,你可以将这片博客放在你的收藏夹里,这样方便你的浏览 1.关于NLPIR的部分 201...
  • FontThrone
  • FontThrone
  • 2017-06-06 17:13:55
  • 2208

Android系统定制源码修改 - MTK平台

Android系统定制源码修改 -  MTK平台  1.修改开机弹出欢迎使用SIM      \frameworks\base\packages\Keyguard\src\com\mediatek...
  • gjy_it
  • gjy_it
  • 2017-06-28 21:18:57
  • 1520

android 源码修改记录

1.长按power弹出三个选项,其中新增重启和飞行模式。  GlobalActions.java:  if(SystemProperties.getInt("ro.cenon_f27", 0)==1)...
  • cuckoochun
  • cuckoochun
  • 2017-06-07 12:01:48
  • 525

比较少见的一款日文内存修改器,也可修改模拟器内存地址

  • 2017年01月16日 21:38
  • 1.18MB
  • 下载

Android系统篇之----免root实现Hook系统服务拦截方法

在之前一篇文章中介绍了Android中的Binder机制和系统远程服务调用机制,本文将继续借助上一篇的内容来实现Hook系统服务拦截指定方法的逻辑,了解了上一篇文章之后,知道系统的服务其实都是一个远程...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2016-09-19 08:45:54
  • 10115

adb怎么判断是否有root权限,并更改system/app内容

一、首先判断root权限: adb root 结果: C:\signapp>adb root restarting adbd as root # 说明有root权限 ,若是adbd cannot...
  • dddxxxx
  • dddxxxx
  • 2016-07-08 10:08:31
  • 4533

NDK/Jni底层获取root权限的四种思路

很多时候对Android系统底层进行操作(如查看/data/data/下的数据)是没有权限的,但是有时候我们需要在Jni层进行类似的操作,那么我们如何获取root权限呢?这边提供四种思路供大家参考。...
  • JiezhiG
  • JiezhiG
  • 2015-01-05 16:45:56
  • 4986

Android系统权限和root权限

Android权限说明 Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, Android系统权限相关的内容, (一)linux文件系...
  • superkris
  • superkris
  • 2012-07-02 18:51:11
  • 108978
    个人资料
    等级:
    访问量: 70万+
    积分: 9580
    排名: 2362
    文章分类
    最新评论