设为首页 加入收藏

TOP

一步一步走进Linux HOOK API
2014-11-24 13:15:13 来源: 作者: 【 】 浏览:0
Tags:步一步 走进 Linux HOOK API

最近我查阅很多参考资料.发现对于讲述Linux HOOK API的资料是很少,让我们这些新人难以去走进Linux HOOK大门.在这里我将全面的讲述Linux HOOK API的全部实现过程,这个过程中我也遇到很多坎坷,所以在这么写下这份教程.让大家都来进入HOOK的神秘世界.


不要认为HOOK API是windows的专利(PS.其实我以前就是这么认为的.哈哈....),其实在Linux中也有HOOK API这样的技术,只是实现起来相对比较麻烦,首先今天主要带大家认识的是ELF文件,在Linux中,ELF文件主要是应用在可执行文件,重定位文件,可执行文件动态连接库。首先来看一下ELF Head的定义:


PS.我们这里主要针对的是32位平台.有关64位平台相关定义请参阅/usr/include/elf.h


e_ident: 这个成员,ELF文件的第一个成员,该成员是个数字,根据上面的宏可以看出,这个程序是个16字节的数据.该成员的前4个字节依次是 0x7F,0x45,0x4c,0x46,也 就是"\177ELF"。这是ELF文件的标志,任何一个ELF文件这四个字节都完全相同。


为了让我们更方便的使用ELF数据在elf.h中对上述数据进行了宏定义.如下:


第四个字节表示ELF格式,1:322:64


第五个字节表示数据编码格式,1:小端模式 2:大端模式


第六个字节表示文件版本,该值目前必须为1


第七个字节表示操作系统标识:


第八个字节表示ABI版本


第九个字节表示e_ident中从哪开始之后未使用.


e_type: 这个成员是ELF文件的类型:


1:表示此文件是重定位文件.


2:表示可执行文件.


3:表示此文件是一个动态连接库。



e_machine: 这个成员表示机器版本.具体定义参与elf.h (篇幅问题,太长了)


e_version: 这个成员表示ELF文件版本,1


e_entry: 这个成员表示可执行文件的入口虚拟地址。此字段指出了该文件中第一条可执 行机器指令在进程被正确加载后的内存地址!ELF可执行文件只能被加载到固定位 置.


e_phoff: 这个成员表示程序头(Program Headers)在ELF文件中的偏移量。如果程序头 不存在此值为0


e_shoff: 这个成员表示节头(Section Headers:)在ELF文件中的偏移量。如果节头不存 在此值为0


e_flags: 这个成员表示处理器标志.


e_ehsize: 这个成员描述了“ELF自身占用的字节数。


e_phentsize: 该成员表示程序头中的每一个结构占用的字节数。程序头也叫程序头表,可以 被看做一个在文件中连续存储的结构数组,数组中每一项是一个结构,此字段 给出了这个结构占用的字节大小。


e_phoff: 指出程序头在ELF文件中的起始偏移。


e_phnum: 此字段给出了程序头中保存了多少个结构。如果程序头中有3个结构则程序头 在文件中占用了3×e_phentsize个字节的大小。


e_shentsize: 节头中每个结构占用的字节大小。节头与程序头类似也是一个结构数组,关于 这两个结构的定义将分别在讲述程序头和节头的时候给出。


e_shnum: 节头中保存了多少个结构。


e_shstrndx: 这是一个整数索引值。节头可以看作是一个结构数组,用这个索引值做为此数 组的下标,它在节头中指定的一个结构进一步给出了一个字符串表的信息,而这 个字符串表保存着节头中描述的每一个节的名称,包括字符串表自己也是其中的一 个节。


示例代码:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java中的字符串(String)的秘密 下一篇一个通用的Trie树,标准C++实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: