修改源码实现全局(无需root)注入躲开注入检测
本帖最后由 大王叫我来挖坟 于 2016-12-15 22:36 编辑看这篇文章需要的技能1.会编译android源码(如果你不愿意编译源码,还有另外一种办法,下面我会提供)2.会使用substrate或者xposed以上2个网上资料很多我就不啰嗦了。这篇帖子将讲述什么内容1.修改源码或者不修改源码,实现全局注入,这样以后随便你怎么hook都行附加内容讲如何编译android源码和刷机android so hook的源代码一、市面上目前的hook和注入工具市面上目前的hook有substrate,xposed,或者一些开源的自己实现的hook和注入,但是会调用一些系统api或者自身一些特征,会被加固检测到,故提供以下文章
二、全局注入的三种思路首先我们注入的目的,就是让我们写的钩子代码xx.so可以注入到yyy程序里面去,这样我们的xx.so就可以调用诸如mprotect和mmap来修改内存属性,去修改目标程序的内存可以来实现got hook或者inline,异或修改机器码的跳转,异或修改数据实现内存修改器。
故实现全局注入有三种办法思路一:替换zygote, xposed那种,不多说由于其特征会被检测到,不啰嗦了网上资料很多 思路二:从so加载的过程看可以修改linker源码,在其加载程序so的时候,比如在do_dlopensoinfo*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 voidhandleBindApplication(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 -oclassout/ framework.jar找到ActivityThread.smali,把我提供的(我这里是android4.4)替换回去,再重新编译回去,java -jar D:\run_ProgramFile\baksmali_smali\smali.jarclassout/ -o framework_new.jar
如果你别的android系统,也可以自己写个demo把得到的smali自己加入ActivityThread.smalipush到设备就行了,记得重新设备生效
最后附加内容inline hook和got hook源代码(曾经拿保卫萝卜和我的世界测试成功)和我曾经编译android4.x+2.3x+5.1x源码+修改源码真机运行的详细笔记(网上编译android源码的文章多如牛毛啊,实际详细的却很少)我修改过的framework.jar,囧文件大小不能超过1MB,所以jar就不上传了,大家看smali吧
对于不想root的不能push到/data/local目录的可以先push到别的目录,然后cp过去
edust 发表于 2016-12-20 18:02
这个不支持你,真对不起我自己。
最后那个方法有点忽悠呀。 明明 push 上去要root权限。。
哈哈,我是指的不需要root是指,刷机这些代码是改在源码里面的,请编译源码然后刷机就不需要替换那个jar了,也就不需要root了,刷机和编译源码的详细过程我文档里面有,建议你还是刷机吧 本帖最后由 大王叫我来挖坟 于 2016-12-15 22:39 编辑
zeif 发表于 2016-12-15 13:47
说好的无需root呢?
替换framework.jar没root怎么做?
{:301_978:}谢谢回复,我的意思是指刷机之后的设备无需root,建议使用谷歌手机编译完毕源码然后刷机,手机自己用 大神,赞一个! 学习了!赞一个 不玩LINUX 但是分享精神值得支持 赞一个哦 感谢分享!!!!!!!!!! 顶,感谢,赞一个 赞,然而我不懂 赞一个哦
这个玩的6, 强烈支持一下哈