分类: |
  • 1

api hook和pe格式的关系

api hook技术的难点,并不在于hook技术,初学者借助于资料“照葫芦画瓢”能够很容易就掌握hook的基本使用技术。但是如何修改api函数的入口地址?这就需要学习pe可执行文件(.exe,.dll等)如何被系统映射到进程空间中,这就需要学习pe格式的基本知识。windows已经提供了很多数据结构struct帮助我们访问pe格式,借助它们,我们就不要自己计算格式的具体字节位置这些繁琐的细节。但是从api hook的实现来看,pe格式的访问部分仍然是整个编程实现中最复杂的一部分,对于经常crack的朋友不在此列。
假设我们已经了解了pe格式,那么我们在哪里修改api的函数入口点比较合适呢?这个就是输入符号表imported symbols table(间接)指向的输入符号地址。
   下面对于pe格式的介绍这一部分,对于没有接触过pe格式学习的朋友应该是看不太明白的,但我已经把精华部分提取出来了,学习了pe格式后再看这些就很容易了。

pe格式的基本组成
+-------------------+
    | DOS-stub          |    --DOS-头
    +-------------------+
    | file-header       |    --文件头
    +-------------------+
    | optional header   |    --可选头
    |- - - - - - - - - -|
    |                   |
    | data directories |    --(可选头尾的)数据目录
    |                   |
    +-------------------+
    |                   |
    | section headers   |     --节头
    |                   |
    +-------------------+
    |                   |
    | section 1        |     --节1
    |                   |
    +-------------------+
    |                   |
    | section 2        |     --节2
    |                   |
    +-------------------+
    |                   |
    | ...               |
    |                   |
    +-------------------+
    |                   |
    | section n        |     --节n
    |                   |
    +-------------------+
    在上图中,我们需要从“可选头”尾的“数据目录”数组中的第二个元素——输入符号表的位置,它是一个IMAGE_DATA_DIRECTORY结构,从它中的VirtualAddress地址,“顺藤摸瓜”找到api函数的入口地点。
    下图的简单说明如下:
OriginalFirstThunk 指向IMAGE_THUNK_DATA结构数组,为方便只画了数组的一个元素,AddressOfData 指向IMAGE_IMPORT_BY_NAME结构。
IMAGE_IMPORT_DESCRIPTOR数组:每个引入的dll文件都对应数组中的一个元素,以全0的元素(20个bytes的0)表示数组的结束
IMAGE_THUNK_DATA32数组:同一组的以全0的元素(4个bytes的0)表示数组的结束,每个元素对应一个 IMAGE_IMPORT_BY_NAME结构
IMAGE_IMPORT_BY_NAME:如..@Consts@initialization$qqrv. 表示
Unmangled Borland C++ Function: qualified function __fastcall Consts::initialization() 
 
    为了减少这个图的大小,不得已将汇编和c++的结构都用上了。这个图是输入符号表初始化的情形,此时两个IMAGE_THUNK_DATA结构数组的对应元素都指向同一个IMAGE_IMPORT_BY_NAME结构。
    程序加载到进程空间后,两个IMAGE_THUNK_DATA结构数组指向有所不同了。看下图: 


// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=1036&d=cf6de2
始化的,“两个结构都指向同一个IMAGE_IMPORT_BY_NAME”,此时还没有api函数地址 


当PE文件准备执行时,前图已转换成上图。一个结构指向不变,另一个出现api函数地址

    如果PE文件从kernel32.dll中引入10个函数,那么IMAGE_IMPORT_DESCRIPTOR 结构的 Name1域包含指向字符串"kernel32.dll"的RVA,同时每个IMAGE_THUNK_DATA 数组有10个元素。(RVA是指相对地址,每一个可执行文件在加载到内存空间前,都以一个基址作为起点,其他地址以基址为准,均以相对地址表示。这样系统加载程序到不同的内存空间时,都可以方便的算出地址)
    上述这些结构可以在winnt.h头文件里查到。

查看更多...

Tags: pe 格式 汇编 导入表 api 原理 hook

分类:c/c++ | 固定链接 | 评论: 0 | 查看次数: 9583

PE文件的装载过程(4)

上周毕业答辩,没完成任务,惭愧惭愧。。。。

可选头的最后一部分是DataDirectory字段,这个字段包含了16个IMAGE_DATA_DIRECTORY结构,结构的定义如下:

IMAGE_DATA_DIRECTORY STRUCT

查看更多...

Tags: 文件 pe 格式 资源 汇编

分类:破解调试 | 固定链接 | 评论: 0 | 查看次数: 7851

PE文件的装载过程(3)

紧接着IMAGE_FILE_HEADER结构的是IMAGE_OPTIONAL_HEADER32结构,这个结构称为可选头, 其中定义了很多重要的信息,可选头的结构如下所示:

 

Code

查看更多...

Tags: 文件 pe 格式 资源 汇编

分类:破解调试 | 固定链接 | 评论: 0 | 查看次数: 7908

PE文件的装载过程(2)

上一篇讲到PE load程序已经找到了PE文件头,PE文件头的定义如下所示:

 

IMAGE_NT_HEADERS STRUCT

查看更多...

Tags: 文件 pe 格式 资源 汇编

分类:破解调试 | 固定链接 | 评论: 0 | 查看次数: 8667

PE文件的装载过程(1)

Windows下的可执行文件为PE(Portable Executable File Format/可移植的执行体)格式,文件的组织形式还是比较复杂的,花了大概一个星期的时间终于稍微弄懂了PE文件的装载过程。

PE文件最开始的部分称为DOS头,存在的作用是为了兼容DOS下的可执行程序,DOS头的结构如下:

 

查看更多...

Tags: 文件 pe 格式 资源 汇编

分类:破解调试 | 固定链接 | 评论: 0 | 查看次数: 9751

手工加载exe到内存(loadEXE.cpp)

//*******************************************************************************************************
// [b]loadEXE[/b].cpp : Defines the entry point for the console application.
//
// Proof-Of-Concept Code
// Copyright (c) 2004

查看更多...

Tags: 代码 文件 pe 格式 添加

分类:破解调试 | 固定链接 | 评论: 0 | 查看次数: 9286

向PE头的缝隙中插入代码

      有些人感觉[b]pe[/b]文件很复杂,其实呢只要学懂了你就会觉得[b]pe[/b]还是很简单的。上次写过一个往pe的第一个节里面写代码的东西,其实跟这个差不多,换汤不换药。这个可能会更简单,HOHO,废话不说了,直接进入正题。

先说一下往pe头缝隙里面写代码的原理

我们这次说的是windows平台下的感染(姑且成为感染吧),pe文件有一个dos头,其实说实话是几乎没什么用,就是用来跳到真正的[b]pe[/b]头,里面的一部分代码是可以覆盖的。但是为了简单我们今天就不用这一部分空间了。其实还有一个更好的空隙就是解表到第一个节直接的空隙。大家都知道可执行文件在磁盘中是按照特定方式对齐的。比如文件对齐粒是1000的话,第一节开始的位置就是1000,应为所有[b]pe[/b]头加起来不可能超过1000,而且远小于这个值,约为250.所以还有一大片空间来写我们的代码。

查看更多...

Tags: pe

分类:破解调试 | 固定链接 | 评论: 0 | 查看次数: 7566

pe文件中的资源

程序所用到的各种资源,比如 bmp,cursor,menu,对话框等都存在PE文件中。
    我们将详细介绍关于资源的各种结构,通过一个例子来说明资源及其相关结构是怎么放在PE文件中的。以及如何在遍历PE文件中的所有资源。我们只最终找到这些资源在文件中的位置和长度。而不具体分析某种资源的格式,比如有个BMP的资源,我们不分析BMP格式。 
一 找到资源在文件中位置。

    资源都放在PE文件的某个节中,该节的节表项中的PointerToRawData,就是资源节在文件中的位置。

查看更多...

Tags: pe 资源

分类:破解调试 | 固定链接 | 评论: 0 | 查看次数: 5968

PE文件格式

(翻译:QduWg,原作LUEVELSMEYER)
说明:希望本文能够对初级入门CRACKER有一定帮助,翻译存在疏漏或者不准确,希望来信
指出。感谢您的指导!感谢看雪为我们提供这个交流平台,让我们技术与时俱进!!
前言:
PE("portable executable")文件格式是针对MS windows NT, windows 95 and
win32s的可执行二进制代码(DLLs and programs) 。在windows NT内, 驱动程序也是这个
格式。也可以用于对象文件和库。

查看更多...

Tags: pe 格式

分类:破解调试 | 固定链接 | 评论: 0 | 查看次数: 7805
  • 1