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

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,加载的, 所以我们的SO的JNI_OnLoad是没有机会被调用的,所以我们在SO的init_arry完成我们的HOOK 工作。所以我们需要一个 声明一个 void __attribute__((constructor)) enctry() 函数。

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

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

 

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

 
 

注入工具的界面的实现

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

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

So注入工具TsoInject开发文档的更多相关文章

  1. 工具(5): 极简开发文档编写(How-to)

    缘起 一个合格的可维护项目,必须要有足够的文档,因此一个项目开发到一定阶段后需要适当的编写文档.项目的类型多种多样,有许多项目属于内部项目,例如一个内部的开发引擎,或者一个本身就是面向开发者的项目. ...

  2. 【原创】Odoo开发文档学习之:构建接口扩展(Building Interface Extensions)(边Google翻译边学习)

    构建接口扩展(Building Interface Extensions) 本指南是关于为Odoo的web客户创建模块. 要创建有Odoo的网站,请参见建立网站;要添加业务功能或扩展Odoo的现有业务 ...

  3. ECMall模板开发文档

    ECMall 模板开发文档 前 言 欢迎阅读 ECMall 模板制作教程,通过阅读本教程可快速上手 ECMall 模板的使用和制作. ECMall 模板制 作要求用户具备 XML . XHTML 和 ...

  4. [技巧]使用Xcode集成的HeaderDoc自动生成注释和开发文档

    [技巧]使用Xcode集成的HeaderDoc自动生成注释和开发文档     Doxygen本来是一个很好的工具,可是我感觉在mac系统下,如果用doxygen最后生成的CHM文件感觉就不是那么恰当, ...

  5. 项目管理之 使用 appledoc 生成开发文档

    写项目时通常会遇到要求写开发文档的需求,但是就源代码来说,文档最好和源码在一起,这样更新起来更加方便和顺手.Objective-C 有一些文档管理工具,doxygen, headdoc 和 apple ...

  6. 微信-小程序-开发文档-服务端-模板消息:templateMessage.send

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.send 1.返回顶部 1. templateMessage.send 本接口应在服务器端调用,详细说明参见服 ...

  7. 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateList

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateList 1.返回顶部 1. templateMessage.getTemplateLi ...

  8. 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryList

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryList 1.返回顶部 1. templateMessage.getTem ...

  9. 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryById

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateLibraryById 1.返回顶部 1. templateMessage.getTem ...

随机推荐

  1. java基础编程——链表反转

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList.   题目代码 /** * @program: JavaCode * @description:输入一个链表,按链表值从尾到头 ...

  2. 2017年9月22日作业 c++算术运算符 自增 自减 逻辑运算符 位运算符 条件运算符(三元运算符)

    作业1: c++算术运算符试题,分析下面程序的输出结果是什么 //第一个: int x=8999;int value=x*1000/1000; //第二个 int x=8999;int value=x ...

  3. XML格式与实体类的转换

    背景 本人头一回写博客,请大家多多关照.通过读取XML文件获取用户管理权限,其中涉及三部分: 1.XML文件的生成: 2.XML文件的读取: 3.XML文件的保存: 如何做 第一步:自己先将XML文件 ...

  4. ASP.NET Core模块化前后端分离快速开发框架介绍之1、开篇

    源码地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin ...

  5. ATM-db-dnhandler

    import os,jsonfrom conf import settings def select(name): user_path = os.path.join(settings.BASE_DB, ...

  6. .net core IdentityServer4 使用query参数

    基本用法请参考官方文档:https://identityserver4.readthedocs.io/en/latest/index.html 这里不对具体用法进行说明,一般情况下,Startup添加 ...

  7. vue.js 二 路由懒加载

    当项目小的时候,我没考虑要去找这个得解决方案,也幸好现在几乎能迁移的项目都整合在了一个vue的项目里面 才发现编译后的vendor.js变得异常的大,而且几乎在项目每一个页面都需要加载这一个js,项目 ...

  8. java+Mysql大数据的一些优化技巧

    众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法; 例如,我们要将 ...

  9. Python的三种基本数据类型

    数字 int(整型) long(长整型),python对长整型没有限制,理论上可以无限大.python3后没有long了. float   字符串   加了引号的都是字符串.   单引号和双引号没有约 ...

  10. Eclipse快速输出System.out.println();

    借鉴网上大佬博客 刚开始还好好敲代码 后来看博客发现其实输入syso或sysout 再按alt+/就OK 开始学JAVA,好好干.