没有合适的资源?快使用搜索试试~ 我知道了~
今天周日,昨天花了一天的时间总算是搞定了,问题还是想对应用程序的行为进行拦截的操作,就是像小米手机一样,哪些应用在获取你什么权限的信息。在之前写过对应用程序的行为进行拦截的方式(C层)实现的博客,在写完这篇之后,本来想是尽快的把Java层拦截的文章结束的,但是由于各种原因吧,所以一直没有时间去弄这些了。今天算是有空,就总结一下吧。下面进入正题:我们知道现在一些安全软件都会有一个功能就是能够拦截应用的行为(比如地理位置信息,通讯录等),所以这里就来实现以下这样的功能,当然实现这样的功能有两种方式,一种是从底层进行拦截,这个我在之前的博客中已经讲解过了。还有一种方式就是从上层进行拦截,也就是我们今
资源推荐
资源详情
资源评论
从从Java层进行拦截层进行拦截Andrdoid中对应用程序的行为中对应用程序的行为
今天周日,昨天花了一天的时间总算是搞定了,问题还是想对应用程序的行为进行拦截的操作,就是像小米手机一
样,哪些应用在获取你什么权限的信息。在之前写过对应用程序的行为进行拦截的方式(C层)实现的博客,在写完这篇
之后,本来想是尽快的把Java层拦截的文章结束的,但是由于各种原因吧,所以一直没有时间去弄这些了。今天算是
有空,就总结一下吧。下面进入正题:
一、摘要
我们知道现在一些安全软件都会有一个功能就是能够拦截应用的行为(比如地理位置信息,通讯录等),所以这里就来实
现以下这样的功能,当然实现这样的功能有两种方式,一种是从底层进行拦截,这个我在之前的博客中已经讲解过
了。
还有一种方式就是从上层进行拦截,也就是我们今天所要说的内容,这种方式都是可以的,当然很多人更多的偏向上
层,因为底层拦截需要熟知Binder协议和Binder的数据格式的。上层拦截就简单点了。
二、知识点概要
首先我们需要了解一点知识就是不管是底层拦截还是上层拦截,都需要一个技术支持:进程注入,关于这个知识点,
这里就不作解释了。
了解了进程注入之后,这篇文章主要讲解三点知识:
1、如何动态加载so,并且执行其中的函数
2、如何在C层执行Java方法(NDK一般是指Java中调用C层函数)
3、如何修改系统服务(Context.getSystemService(String...)其实返回来的就是Binder对象)对象
当然我们还需要一些预备知识:知道如何使用NDK进行编译项目。
这篇文章编译环境是Window下的,个人感觉还是不方便,还是在Ubuntu环境下操作比较方便
还有一点需要声明:就是拦截行为是需要root权限的
三、例子
第一个例子:简单的进程注入功能
目的:希望将我们自己的功能模块(so文件)注入到目标进程中,然后修改目标进程中的某个函数的执行过程
文件:注入功能可执行文件poison、目标进程可执行文件demo1、需要注入的模块libmyso.so
注入功能的可执行文件核心代码poison.c,这个功能模块在后面讲到的例子中也会用到,所以他是公用的
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <sys/mman.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include "ptrace_utils.h"
#include "elf_utils.h"
#include "log.h"
#include "tools.h"
struct process_hook {
pid_t pid;
char *dso;
} process_hook = {0, ""};
int main(int argc, char* argv[]) {
LOGI("argv len:"+argc);
if(argc < 2)
exit(0);
struct pt_regs regs;
process_hook.dso = strdup(argv[1]);
process_hook.pid = atoi(argv[2]);
if (access(process_hook.dso, R_OK|X_OK) < 0) {
LOGE("[-] so file must chmod rx\n");
return 1;
}
const char* process_name = get_process_name(process_hook.pid);
ptrace_attach(process_hook.pid, strstr(process_name,"zygote"));
LOGI("[+] ptrace attach to [%d] %s\n", process_hook.pid, get_process_name(process_hook.pid));
if (ptrace_getregs(process_hook.pid, ®s) < 0) {
LOGE("[-] Can't get regs %d\n", errno);
goto DETACH;
}
LOGI("[+] pc: %x, r7: %d", regs.ARM_pc, regs.ARM_r7);
void* remote_dlsym_addr = get_remote_address(process_hook.pid, (void *)dlsym);
void* remote_dlopen_addr = get_remote_address(process_hook.pid, (void *)dlopen);
LOGI("[+] remote_dlopen address %p\n", remote_dlopen_addr);
LOGI("[+] remote_dlsym address %p\n", remote_dlsym_addr);
if(ptrace_dlopen(process_hook.pid, remote_dlopen_addr, process_hook.dso) == NULL){
LOGE("[-] Ptrace dlopen fail. %s\n", dlerror());
}
if (regs.ARM_pc & 1 ) {
regs.ARM_pc &= (~1u);
regs.ARM_cpsr |= CPSR_T_MASK;
} else {
regs.ARM_cpsr &= ~CPSR_T_MASK;
}
if (ptrace_setregs(process_hook.pid, ®s) == -1) {
LOGE("[-] Set regs fail. %s\n", strerror(errno));
goto DETACH;
}
LOGI("[+] Inject success!\n");
DETACH:
ptrace_detach(process_hook.pid);
LOGI("[+] Inject done!\n");
return 0;
}
我们看到,这个注入功能的代码和我们之前说的从底层进行拦截的那篇文章中的注入代码(inject.c)不太一样呀?这个是
有人在网上从新改写了一下,其实功能上没什么区别的,我们从main函数可以看到,有两个入口参数:
第一个是:需要注入so文件的全路径
第二个是:需要注入进程的pid
也就是说,我们在执行poison程序的时候需要传递这两个值。在之前说道的注入代码(inject.c)中,其实这两个参数是在
代码中写死的,如果忘记的同学可以回去看一下,就是前面提到的从底层进行拦截的那篇文章。
那么这样修改之后,貌似灵活性更高了。
当然注入功能的代码不止这一个,其实是一个工程,这里由于篇幅的原因就不做介绍了。
使用NDK编译一下,生成可执行文件就OK了。
第一部分:代码实现
1)目标进程依赖的so文件inso.h和inso.c
__attribute__ ((visibility ("default"))) void setA(int i);
__attribute__ ((visibility ("default"))) int getA();
inso.c代码
#include <stdio.h>
#include "inso.h"
static int gA = 1;
void setA(int i){
gA = i;
}
int getA(){
return gA;
}
编译成so文件即可,项目下载:http://download.csdn.net/detail/jiangwei0910410003/8138107
2)目标进程的可执行文件demo1.c
这个就简单了,就是非常简单的代码,起一个循环每个一段时间打印数值,这个项目需要引用上面编译的inso.so文件
头文件inso.h(和上面的头文件是一样的)
__attribute__ ((visibility ("default"))) void setA(int i);
__attribute__ ((visibility ("default"))) int getA();
demo1.c文件
#include <stdio.h>
#include <unistd.h>
#include "inso.h"
#include "log.h"
int main(){
LOGI("DEMO1 start.");
while(1){
LOGI("%d", getA());
setA(getA() + 1);
sleep(2);
}
return 0;
}
代码简单吧,就是执行循环打印数值,这里使用的是底层的log方法,在log.h文件中定义了,篇幅原因。
3)注入的模块功能源文件myso.c
剩余15页未读,继续阅读
资源评论
weixin_38674627
- 粉丝: 2
- 资源: 925
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 技术资料分享uCOS-II信号量集很好的技术资料.zip
- 技术资料分享ucOS-II入门教程(任哲)很好的技术资料.zip
- 技术资料分享UCOSII 2.90 ReleaseNotes很好的技术资料.zip
- 技术资料分享Ucos-II-中文注释版很好的技术资料.zip
- 技术资料分享uCGUI的性能与资源占用很好的技术资料.zip
- 技术资料分享uCGUI 简介很好的技术资料.zip
- 技术资料分享TJA1050很好的技术资料.zip
- 技术资料分享TF应用很好的技术资料.zip
- CourseDesign_Graph-数据结构课程设计
- AndroidStudio Demo-android studio计算器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功