• android注入之so注入


    android平台的so注入技术

    LD_PRELOAD注入

    LD_PRELOAD是linux的系统环境变量,因为android基于linux内核所以此环境变量依然存在。当android的linker程序在初始化时会先获取此环境变量并将其指向的so库加载到内存中,可以通过此变量通过强制加载和链接原本不会存在的库。

    所以LD_PRELOAD指向的so库是最先加载的,linker在对elf可执行文件进行重定位时会根据so库的加载顺序去寻找导出函数,所以利用LD_PRELOAD加载自定义的so库并实现特定函数可以拦截elf加载的其他库的特定函数的目的。同时也达到了so库注入的目的。

    查看进程的模块列表发现so库已经加载了。

    LD_LIBRARY_PATH注入

    进程在启动时linker程序会通过一定顺序搜索加载路径,首先会去LD_LIBRARY_PATH指定的路径搜索动态库。所以通过设置此环境变量来劫持指定的so库从而注入自定义的so库。

    查看进程的模块列表发现指定路径的so库已经加载了。

    LD_PRELOAD 与 LD_LIBRARY_PATH的区别在于:LD_PRELOAD是强制加载或链接目标可执行文件本不需要的so库,而LD_LIBRARY_PATH是改变目标可执行文件依赖的so库的搜索路径。

    ELF needed注入

    对于需要动态链接的elf文件而言其会有一些依赖库。linker程序会将这些依赖库事先加载到内存中在运行程序。可以通过修改elf文件来向.dynamic中增加DT_NEEDED类型的项,此项描述我们需要注入的so库。

    • 文件末尾进行对齐
    • 将.dynamic .dynstr .interp PT_NOTE依次移动到文件尾部
    • 在program header table末尾增加一个PT_LOAD类型的项,指向文件末尾新增加的数据
    • 修正ELF文件的字段。

    readelf -d 查看修改后的文件发现新增了一个依赖项

    ptrace 注入

    ptrace可以执行很多跨进程操作,通过ptrace远程调用dlopen注入so的大致流程如下

    还可以通过ptrace注入shellcode后,远程调用shellcode。然后shellcode中在调用dlopen注入目标so

    zygote 注入

    zygote进程是由用户层的一个进程init启动的,而android中所有app应用进程都是由zygote进程fork的。所以通过ptrace向zygote中注入so后,在这之后启动的app进程都会映射此so。

  • 相关阅读:
    字符串(url)拼接变量
    elementUI table数据显示效果(二)
    异常(转)
    PHP 的异常处理、错误的抛出及错误回调函数 (转)
    详细解读PHP类的封装 (转)
    什么是抽象类
    什么是类,什么是对象,类和对象之间的关系
    魔术方法
    类的声名
    self
  • 原文地址:https://www.cnblogs.com/revercc/p/16773944.html
Copyright © 2020-2023  润新知