源码阅读笔记

来源:互联网 发布:搜狗浏览器打开淘宝卡 编辑:程序博客网 时间:2024/06/05 10:53

2005.11.23

阅读源码

nativeAPI:百度百科
原生API:wiki

eli’s docs翻译的wiki:http://www.cnblogs.com/exclm/p/4080630.html

大牛的博客:待会儿再看吧

#define ALIGN_DOWN(x, align) (x &~ (align - 1))//对齐代码用的?#define ALIGN_UP(x, align) ((x & (align - 1)) ? ALIGN_DOWN(x, align) + align:x)

博客1
知道
相关阅读

PE文件之IMAGE_SECTION_HEADER

//// Section header format.//#define IMAGE_SIZEOF_SHORT_NAME              8typedef struct _IMAGE_SECTION_HEADER {    BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];//节区名,8字节,不足补0,否组充满8    union {            DWORD   PhysicalAddress;//文件地址            DWORD   VirtualSize;//进入内存的文件大小    } Misc;    DWORD   VirtualAddress;//加入内存的区段的首地址RVA    DWORD   SizeOfRawData;//物理长度    DWORD   PointerToRawData;//区段在PE文件中的偏移    DWORD   PointerToRelocations;//重定位的偏移    DWORD   PointerToLinenumbers;//行号表的偏移    WORD    NumberOfRelocations;//重定位的项数目    WORD    NumberOfLinenumbers;//行号表的数目    DWORD   Characteristics;//区段属性,可读,可写,可执行等} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;#define IMAGE_SIZEOF_SECTION_HEADER          40#define IMAGE_SCN_LNK_NRELOC_OVFL            0x01000000  // Section contains extended relocations.#define IMAGE_SCN_MEM_DISCARDABLE            0x02000000  // Section can be discarded.#define IMAGE_SCN_MEM_NOT_CACHED             0x04000000  // Section is not cachable.#define IMAGE_SCN_MEM_NOT_PAGED              0x08000000  // Section is not pageable.#define IMAGE_SCN_MEM_SHARED                 0x10000000  // Section is shareable.#define IMAGE_SCN_MEM_EXECUTE                0x20000000  // Section is executable.#define IMAGE_SCN_MEM_READ                   0x40000000  // Section is readable.#define IMAGE_SCN_MEM_WRITE                  0x80000000  // Section is writeable.

参考文章:文章1,,,文章2

PE文件头之IMAGE_NT_HEADERS

typedef struct _IMAGE_NT_HEADERS { +00h DWORD Signature +04h IMAGE_FILE_HEADER FileHeader +18h IMAGE_OPTIONAL_HEADER32 OptionalHeader } IMAGE_NT_HEADERS ENDS, *PIMAGE_NT_HEADERS32;

这里就不抄别人的博文了,请参考这篇博文
MSDN解释

偶发现一本好书,关于NTAPI的,不过是英文版,先记录在这里

RtlImageNtHeader(IN PVOID ModuleAddress )),返回值是一个指向IMAGE_NT_HEADERS结构体的指针,ModuleAddress Is module base address in process virtual memory, known as HMODULE.

看到这里已经看不下去了,PE文件头的几个结构体根本就不会,先去刷书了,哎,今天就到这里吧

11.24

几个比较重要的概念:

1、虚拟内存地址(VA):
PE文件被操作系统加载进内存以后,PE的对应的进程支配了自己独立的4G虚拟空间,在这个空间中定位的地址称为虚拟内存地址,其范围是00000000h~0fffffffh。其公式解释:进程的基地址+相对虚拟内存地址。

2、模块:
一个进程被操作系统加载到虚拟内存空间后,其相关的动态链接库也会被加载,这些同时被加载到进程地址空间的文件称为模块。(这里应该指一整个的dll文件)。每一个模块在加载时都会有一个基地址(dll的首地址),也就是预先告诉操作系统:它会占用4G空间的哪个部分(即从哪里开始存储该模块)。不同的模块的基地址一般是不同的,如果两个模块的基地址相同,就由操作系统来决定这两个模块在虚拟空间中的具体位置。

3、相对虚拟内存地址(RVA):
是相对于基地址的偏移,即RVA是虚拟内存中用来定位某个特定位置的地址。该地址的值是是这个特定位置距离某个模块基地址的偏移量,所以说,RVA是针对某个模块(如dll)而存在的
这里写图片描述

4、文件偏移地址(FOA):
和内存无关,指文件中的某个位置到文件头的偏移。

5、数据目录:
它是PE中的一个数据结构,其中记录了所有可能的数据类型。是PE文件中除了包含代码及数据段的相关数据以外的其他数据(比如引用的外部函数的信息,PE程序的图标、内部导出函数等,这些数据会随着操作系统的新特性的出现而增加)。目前已定义15种数据类型:导出表,导入表,资源表,属性证书表,重定位表,调试数据,Architecture,Global Ptr,线程局部存储,加载配置表,绑定调入表,IAT,延迟导入表,CLR运行时头部。

6、节(sesssion):
存放不同类型数据的地方,不同的节有不同的属性。节是PE文件中存放代码或数据的基本单元。属性有只读,只写,可读,可写等

7、三种对齐方式:内存对齐、文件对齐、资源数据对齐
内存对齐:
节在内存中的对齐单位必须至少是一个页的大小。32位操作系统是4KB(1000h),64位操作系统是8KB(2000h)
文件对齐:
通常会以一个物理扇区的大小作为对齐粒度的值(512字节,即200h)
资源数据对齐:资源文件中,资源字节码部分一般要求以双字(4个字节)方式对齐。

2015-11-27

PE文件结构

1、16位系统下的PE文件结构
在16位的系统中,PE结构可以分为两部分,DOS头和冗余数据
DOS MZ头、DOS Stub组成DOS头,PE头和PE数据区组成冗余数据

2015-11-29
2、32位系统下的PE文件结构
32位系统下的PE文件被划分为5部分:DOS MZ头(IMAGE_DOS_HEADER)、DOS Stub、PE头、节表和节内容。
标准PE头的位置:PE_start = DOS MZ基地址 (PE文件的起始地址)+ IMAGE_DOS_HEADER.e_lfanew(相对PE文件的偏移)
DOS MZ头一般为64字节,PE头的大小一般是456字节(受字段IMAGE_FILE_HEADER.NubberOfSections影响)

PE文件头部解析

1、DOS MZ头: IMAGE_DOS_HEADER
64字节
其中最重要的就是e.lfanew(PE头相对于文件的偏移地址)
2、DOS Stub:大小不定,但是一般又是固定的,随编译器不同而不同
3、PE头标识:Signature
4字节
该标识是e.lfanew知识的位置,内容固定为“PE\0\0”
4、标准PE头:IMAGE_FILE_HEADER
20个字节
该结构常用于判断PE文件是EXE类型还是DLL类型,不但可以通过该结构得到PE文件中节的总量,还可以当成对节区信息进行遍历操作时的循环次数。
IMAGE_FILE_HEADER.NumberOfSection:文件中存在的节的总数
IMAGE_FILE_HEADER.SizeOfOptionalHeader:默认情况下这个值等于00e0h,如果是64位PE文件,默认大小为00f0h
5、扩展PE头:IMAGE_OPTIONAL_HEADER32
6、PE头:IMAGE_NT_HEADERS
456字节
广义的PE头,是上文3、4、5的合集
7、数据目录项:IMAGE_DATA_DIRECTORY
IMAGE_OPTIONAL_HEADER32结构的最后一个字段为DataDirectory,该字段定义了PE文件中出现的所有不同类型的数据的目录信息,该结构是用来描述这些不同类别的数据在文件(和内存)中的位置和大小的,该结构一共包含两项VirtualAddress和isize,(一共有16项)

1 0
原创粉丝点击