搞了好几个星期,终于有点头绪,欢迎交流。转载请注明出处http://blog.csdn.net/lingfong_cool/article/details/8109290。

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里的函数。这个已经有大牛写出来了,地址为 http://www.pudn.com/downloads467/sourcecode/comm/android/detail1958833.html
下面就是我做的工作,重定向函数实现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关键函数,实现权限操作限制。
--------------------------------------------------------------------------------------------------------
防止注入的思路:
1.设置android:debuggable为false,禁止被ptrace;
2.修改mmap、dlopen等函数的地址,防止被其他进程调用;
3.动态监测有无加载其他so,有的话就卸载它

android hook api相关推荐

  1. 浅谈android hook技术

    前言 在测试android过程中,能对函数进行hook能帮助更加深入的进行测试,本文简单介绍了hook框架xposed和frida,从简单的小例子做了简单的演示,算是自己的学习的过程,是个入门的过程. ...

  2. android hook截取其他程序的按钮事件_Hook技术

    概述 Hook,英文直译是"钩子"的意思.在程序中将其理解为"劫持"可能会更好理解,我们可以通过hook技术来劫持某个对象,从而控制它与其他对象的交互. Hoo ...

  3. android hook方法替换,Android Hook入门教程

    原创,首先国内各种rom版本不一,对官方教程中clock的hook很难做到,其次中文教程太少..楼主也是刚接触Android hook,如有错误请多多指正 首先配置Xposed框架,这一步因机而异,网 ...

  4. android hook 第三方app_基于 VirtualApp 结合 whale hook框架实现hook第三方应用

    要点 1. whale hook framework 使用示例: 2. 参考项目:VirtualHook: 3. 按照 VirtualHook 修改 VirtualApp: 4. 编写 hook pl ...

  5. Android Hook框架Xposed进阶

    上一篇<Android Hook框架Xposed入门>,我们对xposed进行简单的介绍并hook自己写的登录app.这次我们对xposed进行深入的了解并hook系统应用和第三方应用. ...

  6. Android Hook Activity 的几种姿势

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

  7. Android Hook技术

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

  8. Android Hook 简介

    1.Hook基本概述 Hook翻译过来是钩子的意思,我们都知道无论是手机还是电脑运行的时候都依赖系统各种各样的API,当某些API不能满足我们的要求时,我们就得去修改某些api,使之能满足我们的要求. ...

  9. 手把手教你当微信运动第一名 – 利用Android Hook进行微信运动作弊

    蒸米 · 2015/09/06 10:29 0x00 序 随着带协处理器和买手环的人越来越多,微信运动一下子火了,只要你在微信关注微信运动,手机就能自动记录你每天行走的步数,还可以跟朋友圈里的好友PK ...

最新文章

  1. java中读取properties文件内容五种方式
  2. python如何调用参数配置文件_python参数设置
  3. 架构师之路 — 部署架构 — 集群部署
  4. goodFeaturesToTrack函数
  5. 异步通信在生活中的例子_聊聊工作中经常遇到的“异步”,你掌握了多少
  6. 微软水下数据中心“浮出水面”、GitHub代码保存在北极,数据黑科技贮藏方式大曝光!...
  7. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_6 mybatis中的事务原理和自动提交设置
  8. 基于机器视觉的苹果大小自动分级方法
  9. 洛谷 p2387 [noi2014] 膜fa♂森林 lct维护最小生成树
  10. Filter 过滤器和 Listener 监听器,java面试必问底层
  11. python 过滤掉字符串中的回车符与换行符(\t\n)
  12. 09-17 流量分析
  13. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于客户时间窗变化的物流配送管理系统设计ro75j
  14. 互联网小拼,这一生的故事,你要看看吗《打工人的那些事》
  15. 百度前端学院---耀耀学院---任务1
  16. 妙赞大讲糖:糖友食谱的三宜
  17. 蓝桥算法训练之素因子去重
  18. springMVC+poi导出excel
  19. linux如何查看wifi信号强弱
  20. 【Linux驱动】认识驱动(驱动的概念、驱动分类)

热门文章

  1. IDEA配置xml文件头报错:URI is not registered (Settings | Languages Frameworks | Schemas and DTDs) 亲测有效!!!
  2. uView JS工具库
  3. 思科曹图强:勒索软件将打破安全防御平衡
  4. 学会后不用担心不会剪辑了,手把手教你视频剪辑,不用真人露脸
  5. 共振峰检测matlab,基于 LPC 系数的共振峰估计
  6. 家居:在线云设计与图纸转工厂生产数据建模数据
  7. Vue项目实战:接口错误拦截与环境设置
  8. 服务器H330阵列卡不建议做Raid5
  9. 返回html404字符串,post提交数据后,返回的网页错误404怎么回事。
  10. 如何绘制甘特图?这些软件来帮你