HOOK编程app(hook 编程)

2023-11-28 08:39:46 数码极客 bianji01

 

android常见hook框架有哪些

1、Xposed:Java层的HOOK框架,由于要修改Zgote进程,需要Root;

2、CydiaSubstrator:本地层的HOOK框架,本质上是一个inlineHook;

3、dexposed框架

4、AndFix框架;

5、Sophix框架;

6、AndroidMethodHook框架;

7、Legend框架:在AndFix框架的基础上,在方法进行替换前进行了方法的备份;

8、YAHFA框架;

9、EPIC框架;

10、VirtualXposed:VirtualAPP与Xposed的一个结合。

使用框架的原因

因为软件系统很复杂,特别是服务器端软件,涉及到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮助完成一些基础工作,只需要集精力完成系统的业务逻辑设计。

而且框架一般是成熟,稳健的,可以处理系统很多细节问题,比如,事务处理,安全性,数据流控制等问题。

还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,可以直接享受别人升级代码带来的好处。框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。

框架的最大好处就是重用。面向对象系统获得的最大的复用方式就是框架,一个大的应用系统往往可能由多层互相协作的框架组成。

由于框架能重用代码,因此从一已有构件库中建立应用变得非常容易,因为构件都采用框架统一定义的接口,从而使构件间的通信简单。

框架能重用设计。它提供可重用的抽象算法及高层设计,并能将大系统分解成更小的构件,而且能描述构件间的内部接口。

这些标准接口使在已有的构件基础上通过组装建立各种各样的系统成为可能。只要符合接口定义,新的构件就能插入框架中,构件设计者就能重用构架的设计。

框架还能重用分析。所有的人员若按照框架的思想来分析事务,那么就能将它划分为同样的构件,采用相似的解决方法,从而使采用同一框架的分析人员之间能进行沟通。

参考资料来源:

百度百科-框架

android插件化(四)Hook加载插件APK(ClassLoader方式)

前面插件化一和二说了下插桩式加载未安装的APK,主要是重写了getResource和getClassloader两个方法来实现的。以及每个组件要实现一个接口,通过接口注入上下文来达到它的生命周期。那么插桩式和hook式的实现方式有什么不同呢?插桩式是怎么加载到插件中的class文件呢,是通过将将APK转化成插件的Classloader,然后想要加载插件的class文件,我们的去拿这个插件的classloader去loadClass。所以是有一个中间者的。hook式呢是将插件apk融入到了我们的宿主apk,那直接在里面就可以直接loadClass了,在不用这个插件的ClassLoader了,这样的话对于插件和宿主就没什么区别了,不像插桩式有一个中间者。那么要实现hook式 就要知道android中一个class文件式怎样被加载到内存中去的。其实就是通过PathClassLoader来加载的。那么我们先看下ClassLoader任何一个java程序都是由一个或者多个class组成的,在程序运行时,需要将class文件加载到JVM中才可以使用,负责加载这些class文件的就是java的类加载机制。CLassLoader的作用就是加载class文件提供给程序运行时使用,每个Class对象内部都有一个ClassLoader来标示自己是有那个classLoade加载的。Android app的所有的java文件都是通过PathClassLoader来加载的,那么它的父类是BaseDexClassLoader,还有一个兄弟类是DexClassLoader,那么他们有什么区别呢。从上面可以看出这两个类的构造函数不同。(在26的源码中DexClassLoader中的optimizedDirectory也废弃了)PathClassLoader:用于Android应用程序类加载器。可以加载指定的dex,以及jar、zip、apk中的classes.dexDexClassLoader:加载指定的dex以及jar、zip、apk中的classes.dex。可以看到创建ClassLoader的时候需要接收一个CLassLoader parent的参数,这个parent的目的就在于实现类加载的委托。某个类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,一次递归,如果父加载器可以完成加载任务,那么就返回,只有当父加载器无法完成加载任务时,才自己去加载。因此我们自己创建的ClassLoader:newPathClassLoader("/sdcard/xx.dex",getClassLoader()),并不仅仅只能加载我们的xx.dex中的class。需要注意的是,findBootstrapClassOrNull 这个方法,当parent为null的时候,去这个BootCLassLoader进行加载,但是在Android当中的实现:所以new PathClassLoader("/sdcard/xx.dex",null),是不能加载Activity.class的。上面分析了加载了一个class,是利用了双亲委托机制,那么要是都找不到那就开始调用自己的findCLass方法在ClassLoader类中findClass:任何ClassLoader的子类,都可以重写loadClass和findClass。如果你不想使用双亲委托,就重写loadClas修改实现,重写findClass则表示在双亲委托机制下,父ClassLoader都找不到class的情况下,定义自己去查找一个class。而我们的PathClassLoader会自己负责加载Activity这样的类,利用双亲委托父类去加载activity,而我们的PathClassLoader没有重写findClass,是在它的父类里面。因此我们可以看看父类的findClass是如何实现的。可以看到加载PathClassLoader加载class,转化为从DexPathList中加载class了,那么我们看看DexPathList中的findClass那么从上面分析得到到这里我们想要加载一个插件的apk ,其实最终加载的是一个dex文件(先说class文件,加载资源后面说),有没有办法吧这个dex文件给转化成一个ElementElemeng数组当中,这样直接就可以加载我们插件中的类了。1、首先我们肯定是要得到插件APK的的中DexPathList对象中的dexElement数组2、插件的dexElements数组我们拿到了,那么是不是要开始拿我们系统里面的 ,我们反射获取,和上面的一样。3、上面我们获取到了系统和我们插件的dexElement数组,然后我们将这个数组合并到一个新的数组里面去,并且给注入到系统里面至此,加载插件的一个流程基本就完成了。但是上面只是处理了class文件,没有处理资源。资源的话我们也是采用hook的方式去实现在宿主的Application中hook这个方法,然后去重写getAsserts和getResources两个方法:然后在插件的BaseActivity中继续重写getAssets和getResources两个方法这样就可以完成hook式加载一个未安装的APK了。至此基本就完成了插桩式和Hook式插件化的基本实现。(后面几篇是优化)。

如何检测自己程序的API被HOOK了

检查调用堆栈吧,如果调用当前方法的不是已知的或期望的则是被hook了。比如javascript语言的:var?test=function(){console.log(test.caller);//打印是谁调用当前方法的};var?calltest=function(){test();//调用test方法,test方法内部可以得到是calltest方法调用的};calltest();//正常调用;//接下为演示hookvar?_baktest=test;var?test=function(){//hook?test方法_baktest();//调用原来的test方法};calltest();//此时原来test方法内部的test.caller并不是calltest方法

windows编程 hook api

声明:易趣百科所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系315127732@qq.com
广告位招租
横幅广告