zoukankan      html  css  js  c++  java
  • So注入工具TsoInject开发文档

    So注入工具TsoInject开发文档

    导语:

    作为一个软件安全从业者而言,我们需要对某个App的关键函数就行Hook, 对于android而言,Smali层我们使用Xposed Hook框架,So层我们可以使用Cydia Substrate框架, Smali 层的Hook由于Xposed做的很好了, 但是关于Cydia Substrate对So的Hook使用期来很不好用,Cydia Substrate的对So的Hook,
    1. 会所有android 应用程序的进行Hook
    2. 很难实现对某个App 私有的so进行Hook
    3. Hook的事机 都是被动的,用户不能选择。
    基于此,笔者想弄一个So注入工具,解放我们分析Native 层代码
     

    原理:

    原理类似Windows 下的DLL 注入, 远程进程调用使用关键函数ptrace 函数实现, 具体实现步骤如下:

    1. 远程进程调用mmap 函数 在对方进程申请一块内存  

    2. 在这块内存中写上 so 的路径

    3.调用远程调用 dlopen 函数, dlopen就会调用so的所有void __attribute__((constructor))  属性的函数

    4.void __attribute__((constructor))  属性的函数中实现我们的hook函数

    5. hook 函数我们可以利用Cydia Substrat框架的MSFunctionHook函数量实现对某个函数进行Hook。

    模块:

    1.实现一个Linux下的ptrace注入器: Inject

    2.实现一个android APP 注入工具的界面

    3.实现一个注入目的进程的SO(通用版,专用版)

     

    ptrace注入器

    之所以我们的注入程序叫做ptrace注入器, 这是因为我们整个注入过程都在使用LinuxAPI --ptrace ptracelinux系统的一个编写调试器的api, api必须在root用户才能调用,所以此种注入方式只能在root用户下使用,这里需要利用ptrace读取和修改寄存器的值和读写内存,以完成类似windowsdll注入功能。 下面的关键函数,已有大神帮我们封装的好了。

     

    Ptrace 注入器基本原理:

    1. attach目标进程,保存寄存器环境,  关键函数:ptrace_attach , ptrace

    2.远程进程调用 mmap在目标进程内申请一块内存, 关键函数:ptrace_call_wrapper

    3. 把注入SO的路径写入上一步申请的地址空间, 关键函数:ptrace_writedata

     

    4. 远程进程调用函数dlopen,注意获取dlopen函数地址在linker模块中获取

    6. 恢复环境,detach 目标进程: 关键函数ptrace_detach

    就此一个Linux 下的ptrace注入器就完成了。由于笔者的代码是在android模拟上运行的, 代码是交叉编译,不便于调试,所以基本靠printf 完成代码的调试,但是这样效率比较低, 笔者建议看官朋友,可以在Linux系统完成这个注入程序的开发,这样不会笔者遇到一些问题,难以调试。 另外上面代码很多函数已经进行过封装了。

    另外:ptrace:还可以用于反调试ptrace (TRACEME)

     

     

     

    实现hook目标进程的字节码SO 通用版

    由于注入的SO不是由java System.loadlibary 加载的, 而是由目标程序调用dlopen,加载的, 所以我们的SOJNI_OnLoad是没有机会被调用的,所以我们在SOinit_arry完成我们的HOOK 工作。所以我们需要一个 声明一个 void __attribute__((constructor)) enctry() 函数。

     

    1.enctry() 函数的实现不能太耗时,否者dlopen会堵塞。所以我们最好启动一个线程来实现我们hook 功能。 实现如下

    2.线程回调函数,Hook的实现,需要根据不同的指令集实现,和需要修改进程指令。实现起来比较复杂,为了简单, 我们使用Cydia Substrat框架的MSFunctionHook函数实现Hook。实现如下:

     

    3. 里面的关键函数InitSubstrate实现如下:

     
     

     注入工具的界面的实现

    1.  按进程ID , 按包名注入

    2.  在指定的目录下, 遍历so文件

     



  • 相关阅读:
    CCS的一些问题
    SignalTapII新特性Storage Qualification
    信号发生器输出幅值与输出阻抗的关系
    关于print函数的一些细节问题探讨
    hp3020 打印机驱动完全卸载方法
    【转】Ruby Selenium 测试
    [nodejs]CoffeeScript里实现Mixin
    [Ruby]ARGF的使用
    【Groovy】使用Maven集成Groovy代码
    [nodejs]optimist库
  • 原文地址:https://www.cnblogs.com/jiaoxiake/p/7240775.html
Copyright © 2011-2022 走看看