native层hook---理解ELF文件java
java层---虚拟机特性和Java上的反射的做用android
存放在哪?框架
用mmap函数分配临时内存来完成代码存放,对于函数的寻找须要用到目标地址空间解析和ELF解析函数
如何注入?工具
用ptrace函数attach上目标进程插件
发现装载共享库so函数设计
装载指定的.soxml
让目标进程的执行流程跳转到注入的代码执行对象
使用ptrace函数的detach释放咪表进程继承
如何附着在目标进程?---内核函数ptrace可以动态attach、detach、peektext(获取内存字节)、poketext(向内存写入地址)
如何让目标进程调用动态连接库函数?---内核函数dlopen,可以以制定模式打开指定动态连接库文件。
对于android的so文件的hook根据ELF文件特性分为:Got表hook、Sym表hook和inline hook等
Xposed框架;
CydiaSubstrate框架;
ADBI/DDI框架。
这些工具使用流程:配置环境、安装本地服务、下载使用库。
handleLoadPackage获取包加载时的回调并拿到其对应的classLoader
findAndLoadHookMethod对指定类的方法进行hook
MS.hookClassLoad 拿到指定class载入时的通知
MS.hookMethod 使用一个Java方法去替换另外一个Java方法
MS.moveUnderClassLoader 使用不一样的ClassLoader重载对象
一、在AndroidManifest.xml文件中配置主入口
二、新建立主入口Main.Java类
三、hook系统的resources,hook对应的方法
四、安装、重启、验证
经过hook指定的Activity中的onCreate方法来启动一个广告的activity
在恶意设计中,能够将广告的activity设置成恶意的activity做为钓鱼activity。
一、在AndroidManifest.xml文件中配置插件名称与Api版本号
二、新建立一个入口类继承并实现IXposedHookLoadPackage接口
三、声明主入口路径
四、使用findAndLoadHookMethod方法hook劫持登陆信息
五、在XposedInstaller中启动自定义的模块
六、重启验证去
框架:Cydiasubstrate
函数:MSGetImageByName、MSFindSymbol、MSHookFunction
步骤:
一、在androidmanifest中声明权限和安装方式--安装方式internalOnly和hasCode=“false”
二、新建立项目的cpp文件,导入所需的库
三、载入配置文件和cydiasubtract入口
四、hook并替换其方法
五、编译、安装、重启验证
hook的本质:在一个目标进程中经过改变函数方法的指向地址,加入一段自定义的代码块
java层的hook检测:用ps命令查找进程id--用cat/proc……命令查找地址空间中对应的dex文件是否由对应进程(系统)提供。
原生层hook检测 :相似java层。对于应用程序自身检测,只须要读取对应进程的虚拟地址空间目录/proc/pid/maps文件, 判断当前进程空间中载入的代码库文件是否存在于本身的白名单中
hook过的程序修复:因为全部的第三方库都是经过dlopen注入的方式添加到进程中,因此咱们只须要经过dlclose把对应的第三方函数按个删除。
可是dlclose函数并不能把全部函数彻底删除,由于dlclose关闭指定句柄的动态连接库,只有当对应动态连接库使用次数为0时才能被系统卸载。
因为没法知晓hook的动态库用何种方式在什么时候注入,因此也须要采用实时监测。