Android免Root权限Hook系统函数修改程序运行时内存指令逻辑

一、知识回顾

在之前一篇文章中,已经介绍了Android中如何修改内存指令改变方法执行逻辑,当时那篇文章的大致流程很简单,在程序运行起来,dex文件被加载到内存中之后,通过读取maps文件,获取到dex文件的内存起始地址,然后通过文件头信息找到指定dex在内存中的数据结构,这里还需要详细了解dex文件的格式,不了解的同学可以点击看这篇文章:Android中Dex文件格式解析,然后使用系统函数修改内存读写属性,在通过指定方法名找到该方法在内存的指令地址,然后替换即可。我们可以简单看一下dex文件被映射到内存之后的地址:



二、免root进行native层hook

上面的这种方案有一点不好就是,需要熟悉dex文件格式,然后通过方法名通过地址转化获取其内存对应的指令,操作有点繁琐,而本文将介绍一种简便的方式,修改起来非常简单。就是通过hook系统函数来做到这一点。而这种hook功能是免root的,所以只能hook应用内部逻辑。对其他应用程序没有任何效果,不过这个就已经满足本文操作的需求了,关于hook系统函数网上已经有现成的框架:Android-Inline-Hook;这个框架用法也非常简单。自己下载之后导入工程即可。下面来看看它的具体用法:


新建一个NDK工程,这个不多说了,然后把这几个框架中的文件拷贝到jni目录下,hook代码主要在InlineHook.cpp中:


这里看到我们会用到两个函数进行hook:

第一个是注册函数:registerInlineHook

参数:

    1、原始函数地址

    2、hook的新函数地址

    3、原始函数的二级指针

第二个是hook函数:inlineHook

参数:

    1、原始函数地址

这里为了演示效果,我们先Hook系统函数puts,需要在hook之前定义新函数以及旧函数的函数指针类型,这里一定要注意,新函数定义类型要和原始函数保持一致。不然hook失败的:


接下来,我们需要出发这个hook操作,我们可以在java层定义一个native方法,然后加载出发即可:


这里定义一个native方法了,然后用javah命令生成指定的头文件即可:


在native方法中开始进行hook操作,运行程序看日志信息即可:


看到了我们成功的hook了系统函数puts。接下来我们开始进入本文的正题了,如何hook系统函数来修改程序运行时态指令。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值