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不同点。未完待续……

0 0
原创粉丝点击