关键字:基础 EXE PE C 复习 一
观看此贴需要基本的C知识---会写你好世界 会查MSDN 会谷歌百度需要稍微了解一点点的数据结构知识---不了解也问题不是很大
需要一点点的耐心
=================================================================
程序代码:
lkd> dt _IMAGE_DOS_HEADER nt!_IMAGE_DOS_HEADER +0x000 e_magic : Uint2B +0x002 e_cblp : Uint2B +0x004 e_cp : Uint2B +0x006 e_crlc : Uint2B +0x008 e_cparhdr : Uint2B +0x00a e_minalloc : Uint2B +0x00c e_maxalloc : Uint2B +0x00e e_ss : Uint2B +0x010 e_sp : Uint2B +0x012 e_csum : Uint2B +0x014 e_ip : Uint2B +0x016 e_cs : Uint2B +0x018 e_lfarlc : Uint2B +0x01a e_ovno : Uint2B +0x01c e_res : [4] Uint2B +0x024 e_oemid : Uint2B +0x026 e_oeminfo : Uint2B +0x028 e_res2 : [10] Uint2B +0x03c e_lfanew : Int4B
win32下的EXE DLL 文件都是PE结构,所以我们统称这些为PE文件。
学习PE文件结构,首先需要了解的就是 IMAGE_DOS_HEADER 结构
PE文件结构的第一个结构,就是 IMAGE_DOS_HEADER ,即DOS头,
这个是以前16位的遗留,虽然已经用处不大,但是在PE文件中还是必不可少
的部分,使用DOS头中的标志可以判断该文件是否是合法的EXE或者DLL。
上面是我在自己电脑上使用windbg查看的 IMAGE_DOS_HEADER 结构。
这个是不会变的。 你也可以在VC里直接查找该定义,好象在winnt.h中。
程序代码:
#include "stdafx.h" #include "windows.h" #include "stdio.h" int main(int argc, char* argv[]) { FILE *p; IMAGE_DOS_HEADER tou; unsigned long biaozhi; p = fopen("bccn.exe","r+b"); if(p == NULL) return -1; fread(&tou,sizeof(tou),1,p); fseek(p,tou.e_lfanew,SEEK_SET); fread(&biaozhi,4,1,p); fclose(p); printf("IMAGE_DOS_HEADER dump:\n"); printf("e_magic : %08x\n",tou.e_magic); printf("e_cblp : %08x\n",tou.e_cblp); printf("e_cp : %08x\n",tou.e_cp); printf("e_crlc : %08x\n",tou.e_crlc); printf("e_cparhdr : %08x\n",tou.e_cparhdr); printf("e_minalloc: %08x\n",tou.e_minalloc); printf("e_maxalloc: %08x\n",tou.e_maxalloc); printf("e_ss : %08x\n",tou.e_ss); printf("e_sp : %08x\n",tou.e_sp); printf("e_csum : %08x\n",tou.e_csum); printf("e_ip : %08x\n",tou.e_ip); printf("e_cs : %08x\n",tou.e_cs); printf("e_lfarlc : %08x\n",tou.e_lfarlc); printf("e_ovno : %08x\n",tou.e_ovno); printf("e_res[4] : %08x\n",tou.e_res[4]); printf("e_oemid : %08x\n",tou.e_oemid); printf("e_oeminfo : %08x\n",tou.e_oeminfo); printf("e_res2[10]: %08x\n",tou.e_res2[10]); printf("e_lfanew : %08x\n",tou.e_lfanew); if((tou.e_magic ==IMAGE_DOS_SIGNATURE) && (biaozhi == IMAGE_NT_SIGNATURE)) printf("PE文件\n"); else printf("不是PE文件\n"); return 0; }
上面代码很简单,就是打开一个文件,将它的IMAGE_DOS_HEADER结构输出,
并且判断其中2个位置是否符合PE文件规范,如果是,就可认为是PE文件。
IMAGE_DOS_HEADER结构在windows.h有声明,直接可以用。
建议安装VAX 即VC助手。很方便。
新建一个win32控制台项目,拷贝上面代码 生成EXE。
将任一文件比如 .txt .bmp .jpg .exe等等改名为 bccn.exe 和生成的EXE放同一文件夹里,然后开始--程序--附件--命令提示符 进入控制台窗口 CD命令 进入EXE目录,运行之,就会有信息输出了。
这个主要看代码
DOS头部分很简单,主要就是偏移0X00和0X3C处的值。
因为这贴写的比较匆忙。但是应该不影响理解。 下贴写详细点。
学习这个东东刚开始的时候会比较头晕,习惯就好了。
有兴趣的朋友可以自己找资料详学。