首页
社区
课程
招聘
[原创]修改源码实现全局(无需root)注入躲开注入检测
发表于: 2016-12-14 11:13 25171

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

2016-12-14 11:13
25171
看这篇文章需要的技能
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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 1
支持
分享
最新回复 (58)
雪    币: 240
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
附件无效~~
2016-12-14 11:49
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
已经更新你看看
2016-12-14 12:02
0
雪    币: 240
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2016-12-14 12:05
0
雪    币: 967
活跃值: (1138)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
MARK 一下 不错
2016-12-14 13:02
0
雪    币: 76
活跃值: (114)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
给大牛点赞。
2016-12-14 14:17
0
雪    币: 163
活跃值: (1538)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
android.app.ActivityThread.handleBindApplication阶段是apk的权限,有可能没有权限访问/data/local/tmp吧
2016-12-14 15:23
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
你好没问题的,你可以cp过去
2016-12-14 15:34
0
雪    币: 163
活跃值: (1538)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
我的手机是

-rw-r--r-- root     root        35947 2014-11-09 09:43 framework.jar
-rw-r--r-- root     root     10004976 2014-11-09 09:43 framework.odex

framework.jar包里面只有
preloaded-classes,preloaded-classes0,preloaded-classes1,preloaded-classes2文件。
如附件:
framework.zip
这种情况如何处理
上传的附件:
2016-12-14 15:36
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
没碰到过这种情况哦,没法回答你哦,我要去安心搬我的砖去啦,抱歉啊!
2016-12-14 15:53
0
雪    币: 163
活跃值: (1538)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
Android 4.4的系统
2016-12-14 21:44
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
哈哈恭喜你,你修改那个jar文件就行啦,但是你这个很奇怪哦,我的设备也是4.4但是jar有几MB才对,而你那个怎么只有几十K呢,
2016-12-14 21:54
0
雪    币: 44
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
好东西啊谢谢分享,赞赞赞!
2016-12-14 22:35
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不错,MARK!
2016-12-14 22:50
0
雪    币: 198
活跃值: (581)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
15
围观
2016-12-15 09:40
0
雪    币: 107
活跃值: (1628)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
16
没做到躲开注入检测吧?
2016-12-15 10:18
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
顶一个 Mark
2016-12-15 10:23
0
雪    币: 6
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
赞赞赞,思路好~
2016-12-15 10:58
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
19
这个太麻烦了,直接把so插入zygote,在zygote fork的时候把so带过去就行了,还可过ant-ant-debug。防止检测可以hook dladdr,hook open fopen重定向对/proc/x/maps的读取。妥妥的,兼容性还很好。
2016-12-15 11:04
0
雪    币: 506
活跃值: (185)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
20
6666
2016-12-15 11:45
0
雪    币: 506
活跃值: (185)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
21
嗯,这个得看程序对.so注入到底检测到了哪一步了那,如果是检测的注入框架就可以,如果通过进程加载的.so来判断,那就不得行。还需要额外工作。
2016-12-15 11:55
0
雪    币: 21
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
22
mark
2016-12-15 12:05
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
23
嗯谢谢分享啦,我只是提供三个方面的思路,zygote,so的载入过程和apk启动的java层,可以修改的地方是很多的,根据个人爱好吧
2016-12-15 12:33
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
24
哈哈,谢谢提意见啦,我觉得这样修改已经足够对付市面上那些加固了,这个函数是在程序的so启动之前做的事情,加固产品要检测也只能检测maps文件里面有哪些so,或者检测framework.jar文件是否改变,或者蜜罐函数,或者libc或者linker里面的一些关键api等,但是加固产品不可能做这些事情。设备和系统和被加固产品的多样性,还有崩溃率的存在,他们不可能去做检测那些东西。如果硬要去检测,那也没办法,没有无敌的矛,你怎么改都会被检测到,但是那不是产品,加固公司平时也纠结各种兼容的问题
2016-12-15 12:38
0
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
25
做加固的同学们心中都有一个痛吧,围墙修的再好再漂亮,各方面都想到了,但是为了兼容让一些地方薄弱存在,然后被人打个小洞全部都毁了。个人认为做加固的比破解的要难,不容易啊,给加固的同学点个赞。
2016-12-15 12:57
0
游客
登录 | 注册 方可回帖
返回
//