文档章节

android hook api

LiSteven
 LiSteven
发布于 2012/12/21 09:22
字数 939
阅读 755
收藏 4

android安全可以从三个层面考虑,一次是java虚拟机层,nativec层,还有linux kernel层,本次hook api是属于nativec层的。
hook api之后就可以使得程序对原有系统函数的调用改为对我们自己编写的函数的调用,这既可以作为一种攻击手段,又可以在维持程序运行的情况下更新程序等等。 下面谈谈思路以及实例(以打电话进程com.android.phone为例,项目保密起见,我修改了相关函数的名称,但是思路绝对不假,这事我验证过 的)
           1.向目标进程注入代码(注入so,并调用该so里的一个函数)。首先调用ptrace函数,调试com.android.browser进程,在这里我 们需要遍历该进程加载的libc.so,这里有我们需要的dlopen,dlsym等函数的地址,我们先中断com.android.phone,修改其 寄存器,压入参数如我们的so路径,并将之前找到的dlopen地址压入寄存器,直接操作blx,就可以让目标进程调用dlopen加载我们的so,同理 dlsym调用我们的so里的函数。这个已经有大牛写出来了,
           下面就是我做的工作,重定向函数实现hook
2.com.android.phone程序打电话等网络连接时调用了xxx.so,该so维护了一个got表和rel.plt表。其中rel.plt表 存放了外部依赖函数的地址,而got表里存放的就是本so定义的函数的地址。在上文被注入的so已经和com.android.phone处于一个进程空 间,并且可以执行一段我们设定的代码。我们的代码应该这么做。我们也加载xxx.so,这里不会真正的加载,应该已经加载过了,但是我们可以获得 xxx.so的句柄,然后查找到rel.plt表中的dial函数表项。然后加载我们写的一个myxxx.so,该so里有我们自己定义的mydial函 数,注意两个函数的签名必须一致。同理我们找到mydial函数加载后的地址,然后将之前xxx.so的dial表项的函数地址替换为我们的mydial 函数的地址。注意在地址替换时需要先调用mprotect函数来突破so内存空间的写保护。        在mydial函数里,我们copy了dial函数的全部代码,但是有一个改变。就是将目标电话号码修改为我们指定的号码。
        查找函数地址表项代码为
//handle为目标so的句柄,name为目标函数名
void* getaddr(void *handle,const char *name)

{

if(!handle)
 

return; 

Soinfo *si = (Soinfo*)handle;

Elf32_Sym *symtab = si->symtab; 

const char *strtab = si->strtab; 

Elf32_Rel *rel = si->plt_rel; 

unsigned count = si->plt_rel_count; 

unsigned idx;

 

 

for(idx=0; idx<count; idx++) //外部依赖函数在rel_plt中

       unsigned type = ELF32_R_TYPE(rel->r_info); 

       unsigned sym = ELF32_R_SYM(rel->r_info); 

       unsigned reloc = (unsigned)(rel->r_offset + si->base); 

       char *sym_name = (char *)(strtab + symtab[sym].st_name);

 

 

if(strcmp(sym_name, name)==0)

{

printf("\"plt_rel\" idx:%2d type:%2d sym:%2d sym_name:%-30s addr:%0x\n",idx,type,sym,sym_name,*((unsigned*)reloc));

return (void *)*((unsigned*)reloc);

}

       rel++; 

}

 

 

for(idx=0;idx<si->nchain;idx++) //自定义函数在symtab中

{

unsigned type = ELF32_R_TYPE(symtab[idx].st_info); 

       unsigned sym = ELF32_R_SYM(symtab[idx].st_info);

char *sym_name = (char *)(strtab + symtab[idx].st_name);

 

 

if(strcmp(sym_name, name)==0)

{

printf("\"got\"                idx:%2d sym_name:%-30s st_value:%0x base: %0x\n",idx,sym_name,symtab[idx].st_value,si->base);

return (void *)(symtab[idx].st_value+si->base);

}

};

return NULL;  //not found


至于替换函数执行地址,就是将目标函数地址修改为之前找到的用于代替目标函数执行的函数地址。注意got表中时相对so的base的值,需要加减两个so的base差值。而rel.plt表中则是绝对地址。
从安全的角度入手,我们可以hook关键函数,实现权限操作限制。

本文转载自:http://www.2cto.com/kf/201210/163524.html

LiSteven

LiSteven

粉丝 38
博文 268
码字总数 11616
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

domybest26
domybest26
楼主我想请教一下,你有没有hook过java层的方法?,我现在只能做到hook C语言那一层的函数,交流一下 谢谢。
yueqiumao
yueqiumao
牛逼啊
Android Hook Activity 的几种姿势

这篇博客已 API 27 的源码为基础分析 前言 在上一篇文章 Android Hook 机制之简单实战 中,我们介绍了 Hook 的要点 Hook 的选择点:静态变量和单例,因为一旦创建对象,它们不容易变化,非常...

xujun9411
2018/09/05
0
0
理解 Android Hook 技术以及简单实战

什么是 Hook Hook 英文翻译过来就是「钩子」的意思,那我们在什么时候使用这个「钩子」呢?在 Android 操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用触发事件和后台逻辑处...

猴亮屏
2018/04/17
75
0
Android Hook 机制之简单实战

简介 什么是 Hook Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面向切...

xujun9411
2018/09/05
0
0
爱奇艺 xhook 1.1.5 发布,产品级的安卓 PLT hook 库

介绍 xhook 是一个针对 Android 平台 ELF (可执行文件和动态库) 的 PLT (Procedure Linkage Table) hook。 xhook 一直在稳定性和兼容性方面做着持续的优化。 特征 支持 Android 4.0 (含) 以上...

nomagic
2018/05/03
3.9K
2
ART hook 框架 - EdXposed

EdXposed 是一个 Riru 模块,它提供了一个 ART hook 框架(最初用于 Android Pie),利用 OG Xposed 提供一致的 API。EdXposed 基于 YAHFA(或 SandHook)hook 框架。 支持的版本 Android Or...

匿名
06/18
828
0

没有更多内容

加载失败,请刷新页面

加载更多

Vue warn]: Computed property "activeNames" was assigned to but it has no setter.

在使用 vue,element-ui时,如下代码 <template> <el-form :model="numberValidateForm" ref="numberValidateForm"> <el-form-item> <el-tabs v-model="activeNames" @tab-cl......

牧云橙
11分钟前
2
0
重构-改善既有代码的设计-6.2内联函数

6.2内联函数 动机 本书经常以简短的函数表现动作意图,这样会使代码更清晰易读。但有时候你会遇到某些函数,其内部代码和函数名称同样清晰易读。也可能你充够了该函数的内部实现,使其内容和...

还仙
12分钟前
2
0
Less 混入

混合类似于编程语言中的函数。 Mixins 是一组CSS属性,允许我们将一个类的属性嵌套于另一个类,被嵌入的类可以看作是变量,并且包含类名作为其属性,也就是说我们可以用一个类定义样式然后把...

凌兮洛
15分钟前
3
0
频繁FGC的真凶原来是它

频繁FGC的真凶原来是它 上周排查了一个线上问题,主要现象是CPU占用过高,jvm old区占用过高,同时频繁fgc,我简单排查了下就草草收场了,但是过后我对这个问题又进行了复查,发现问题没有那...

每天晒白牙
16分钟前
3
0
简单的树形菜单如何写

业务需求 数据结构中含有图片、名称、children的树形结构,需要展示出每一级的图片名称和图片,找了些树形图的插件,都没有展示大的图片的,一般都是小图标,就自己试着写一个包含图的简单的...

tianyawhl
17分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部