关键字:基础 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处的值。
因为这贴写的比较匆忙。但是应该不影响理解。 下贴写详细点。
学习这个东东刚开始的时候会比较头晕,习惯就好了。
有兴趣的朋友可以自己找资料详学。



 
											







 
	    

 
	
 
											 这是什么东西
这是什么东西 
										
					
	

 先接分。。
先接分。。										
					
	


 这些东东既不酷又不炫,
 这些东东既不酷又不炫, 你懂的
你懂的