蕉下客--)

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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文件

 



posted on 2017-07-26 17:15  蕉下客--)  阅读(1651)  评论(0编辑  收藏  举报