Linux2.6用户态API HooK手动操作
来源:互联网 发布:农村淘宝考试题和答案 编辑:程序博客网 时间:2024/06/15 04:10
Linux2.6用户态API HooK入门
1. 概述
API Hook,传说中的API钩子,是指神不知鬼不觉地替换掉标准系统API的方法,Hook技术在Windows下面已经发展得登峰造极了(windows平台上常见的hook方式有导入导出表、vehseh、inline等等)。
1.1. 编写目的
本文编写目的是学习Linux下如何使用Ptrace动态注入进程入门,本文采用手动gdb的方式和修改运行指令,进行hook,控制进程的运行。本文以hook /bin/bash的chdir函数调用为切入点。包含objdump使用、gdb修改运行指令和进程文件ELF解析。
2.手工过程
1.
2.
2.1. 环境
[root@10 ~]# uname -a
Linux 10.12.198.932.6.32.57-tlinux_xenU-1.1.rc11-default #1 SMP Tue Jul 30 09:53:44 CST 2013x86_64 x86_64 x86_64 GNU/Linux
2.2. ELF简介
ELF(ExecutableLinkable Format)是Linux下的可执行格式,与windows下的PE(Portable Executable)格式一样,都是COFF(Common File Format)文件格式的变种。在Linux下除了可执行文件,编译过程中产生的目标文件(.o文件),动态链接文件(.so文件),静态链接库文件(.a文件),核心转储文件(Core Dump File)都按照ELF格式存储。“.got”(Global Offset Table)和“.plt”(Procedure Linkage Table)
2.3. Hook步骤
a.获得/bin/bash的.got和.got.plt地址
objdump -h/bin/bash查看bash的elf结构:
/bin/bash: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 0000000000400200 0000000000400200 00000200 2**0
CONTENTS, ALLOC, LOAD,READONLY, DATA
1 .note.ABI-tag 00000020 000000000040021c 000000000040021c 0000021c 2**2
CONTENTS, ALLOC, LOAD,READONLY, DATA
2 .note.gnu.build-id 00000024 000000000040023c 000000000040023c 0000023c 2**2
CONTENTS, ALLOC, LOAD,READONLY, DATA
3 .gnu.hash 00003678 0000000000400260 0000000000400260 00000260 2**3
CONTENTS, ALLOC, LOAD,READONLY, DATA
4 .dynsym 0000c948 00000000004038d8 00000000004038d8 000038d8 2**3
CONTENTS, ALLOC, LOAD,READONLY, DATA
5 .dynstr 0000821b 0000000000410220 0000000000410220 00010220 2**0
CONTENTS, ALLOC, LOAD, READONLY,DATA
6 .gnu.version 000010c6 000000000041843c 000000000041843c 0001843c 2**1
CONTENTS, ALLOC, LOAD,READONLY, DATA
7 .gnu.version_r 00000080 0000000000419508 0000000000419508 00019508 2**3
CONTENTS, ALLOC, LOAD,READONLY, DATA
8 .rela.dyn 000000c0 0000000000419588 0000000000419588 00019588 2**3
CONTENTS, ALLOC, LOAD,READONLY, DATA
9 .rela.plt 00001368 0000000000419648 0000000000419648 00019648 2**3
CONTENTS, ALLOC, LOAD,READONLY, DATA
10 .init 00000018 000000000041a9b0 000000000041a9b0 0001a9b0 2**2
CONTENTS, ALLOC, LOAD, READONLY,CODE
11 .plt 00000d00 000000000041a9c8 000000000041a9c8 0001a9c8 2**2
CONTENTS, ALLOC, LOAD,READONLY, CODE
12 .text 00086c38 000000000041b6d0 000000000041b6d0 0001b6d0 2**4
CONTENTS, ALLOC, LOAD,READONLY, CODE
13 .fini 0000000e 00000000004a2308 00000000004a2308 000a2308 2**2
CONTENTS, ALLOC, LOAD,READONLY, CODE
14 .rodata 0001c56a 00000000004a2320 00000000004a2320 000a2320 2**5
CONTENTS, ALLOC, LOAD, READONLY, DATA
15 .eh_frame_hdr 00003b14 00000000004be88c 00000000004be88c 000be88c 2**2
CONTENTS, ALLOC, LOAD,READONLY, DATA
16 .eh_frame 0001354c 00000000004c23a0 00000000004c23a0 000c23a0 2**3
CONTENTS, ALLOC, LOAD,READONLY, DATA
17 .ctors 00000010 00000000006d6000 00000000006d6000 000d6000 2**3
CONTENTS, ALLOC, LOAD, DATA
18 .dtors 00000010 00000000006d6010 00000000006d6010 000d6010 2**3
CONTENTS, ALLOC, LOAD, DATA
19 .jcr 00000008 00000000006d6020 00000000006d6020 000d6020 2**3
CONTENTS, ALLOC, LOAD, DATA
20 .dynamic 000001b0 00000000006d6028 00000000006d6028 000d6028 2**3
CONTENTS, ALLOC, LOAD, DATA
21 .got 00000008 00000000006d61d8 00000000006d61d8 000d61d8 2**3
CONTENTS, ALLOC, LOAD, DATA
22 .got.plt 00000690 00000000006d61e0 00000000006d61e0 000d61e0 2**3
CONTENTS, ALLOC, LOAD, DATA
23 .data 000083a0 00000000006d6880 00000000006d6880 000d6880 2**5
CONTENTS, ALLOC, LOAD, DATA
24 .bss 00008e88 00000000006dec20 00000000006dec20 000dec20 2**5
ALLOC
25 .gnu_debuglink 00000010 0000000000000000 0000000000000000 000dec20 2**2
CONTENTS, READONLY
b.获得ch对应的系统函数chdir的指令地址
[root@10 ~]# objdump -d /bin/bash|grep chdir
000000000041a9e8 <chdir@plt>:
468e23: e8 c0 1b fb ff callq 41a9e8 <chdir@plt>
468ea6: e8 3d 1b fb ff callq 41a9e8 <chdir@plt>
C.启动另外一个bash获得pid(19794)
ps aux|grep bash
d.gdb attach pid
1. 进入gdb
2. Attach 19794 #attach bash进程
3. x/xg 0x41a9e8 #b节中的chdir系统函数地址,找到chdir对应的plt条目
4. set (*0x41a9e8) = 0xcc #低半字改为0x000000CC,即是int3断点(这里“字长”指64位)
5. c #continue继续运行
6. 在hook进程(19794)的bash输入ch命令 #无法识别的命令
7. Gdb显示 Detaching after fork from child process
8. 在hook进程(19794)的bash输入cd命令,进入gdb的断点
9. x/10xg $rsp-72 #通过 %rsp 可以找到堆栈内容
10. set *(0x418548) = 0x0168002a1cb225ff # 恢复plt条目原来的内容
11. set $pc = $pc-1 #倒回触发断点的地址重新执行,int3的长度是一字节
12. c #Continuing.这时被调试的 bash 继续照常运行……
2.4. 总结
目前仅仅通过手动方式钩住了bash的cd命令,后续将继续研究下如何通过程序hook和android下arm指令的hook不同点。未完待续……
- Linux2.6用户态API HooK手动操作
- Linux 通过 ptrace 和 plt 实现用户态 API Hook
- LINUX2.6 内核API 改变
- 手动操作 Neutron REST API
- 通过API HOOK 创建SYSTEM用户进程
- 用户态hook
- linux2.6中的原子操作
- Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook
- Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook
- Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook
- Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook
- Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook
- linux2.6标准字符设备驱动模型(手动注册)
- 自实现API, 过所有用户层HOOK
- 自实现API, 过所有用户层HOOK
- C++ 用户层下的用Push+Ret API HOOK
- API HOOK
- Hook API
- java内存泄露
- #pragma pack(push,1)与#pragma pack(1)的区别
- python操作XML文件------elementtree
- 《数字图像处理》——图像的一阶微分之图像梯度
- Linux多线程中使用信号-1
- Linux2.6用户态API HooK手动操作
- C++ 三目运算符
- android平台上的json解析
- 《疯狂的号码》全网上线 揭“号码大战”内幕
- SIGPIPE信号处理
- hibernate4 spring3 整合
- 黑马程序员-Foundation的使用
- 随笔(2014.12)
- C++读取excel表格