首页
社区
课程
招聘
[推荐]一起学习PE格式之一判断PE文件格式(一)(二)
发表于: 2011-2-2 12:54 16150

[推荐]一起学习PE格式之一判断PE文件格式(一)(二)

2011-2-2 12:54
16150
学编程很久了,电脑也买了半个多月了,哎,API基础好烂,决心慢慢来了,这是PE格式菜鸟第一篇,很简单,代码很乱,什么都有,可以拍砖
首先判断PE文件格式,代码附上
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include <commdlg.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <process.h>
#include <shlwapi.h>
#include <winnt.h>
#include "1.h"
BOOL SetPrivilege(void)
{
TOKEN_PRIVILEGES tp;
LUID luid;
HANDLE hToken;
BOOL result= FALSE;
DWORD rl;
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken))
{
if(LookupPrivilegeValue(NULL,"SeDebugPrivilege",&luid))
{
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid=luid;
result = AdjustTokenPrivileges(hToken,FALSE, &tp, sizeof(tp), NULL, &rl);
}
}
return result;
}
BOOL IsPeFile(LPVOID ImageBase) //判断是否是PE文件结构

{
PIMAGE_DOS_HEADER pDosHeader = NULL; //定义IMAGE_DOS_HEADER结构变量
PIMAGE_NT_HEADERS pNtHeader = NULL; //定义IMAGE_NT_HEADERS结构变量
if(!ImageBase) //判断映像基址,映像基址由下面的MapViewOfFile函数传入进来
return FALSE;
pDosHeader = (PIMAGE_DOS_HEADER) ImageBase; //转换ImageBase为PIMAGE_DOS_HEADER结构变量类型
if(pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) //指向IMAGE_DOS_HEADER结构变量中的e_magic成员,e_magic是0x5A4D,名为IMAGE_DOS_SIGNATURE
return FALSE;
pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew); //从IMAGE_DOS_HEADER结构变量中找到e_lfanew成员里面的起始偏移量和加上映像基址得到PE文件头的指针
if(pNtHeader->Signature != IMAGE_NT_SIGNATURE ) //指向IMAGE_NT_HEADERS结构变量中的Signature成员,Signature是0x4550,名为IMAGE_NT_SIGNATURE
return FALSE;
return TRUE;
}

void OpenFileA(HWND hwnd)
{ HANDLE hFile;
HANDLE hMapping;
LPVOID ImageBase;
char szFileName[MAX_PATH] = {0};
OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = "Exe Files(*.exe)\0*.exe\0All Files(*.*)\0*.*\0\0";
ofn.nFilterIndex = 1;
if( !GetOpenFileName(&ofn) )
{
Sleep(1000);
}
hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);//创建文件
if (!hFile){;}
hMapping=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL); //创建文件映像
if(!hMapping)
{
CloseHandle(hFile);
}
ImageBase=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0); //映射文件基址
if(!ImageBase)
{
CloseHandle(hMapping);
CloseHandle(hFile);
}
if(!IsPeFile(ImageBase))
{
MessageBox(hwnd,"不是PE文件!","提示信息",MB_OK);
}
else
MessageBox(hwnd,"是PE文件","提示信息",MB_OK);
}
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
return TRUE;

case WM_CLOSE:
DestroyWindow(hwndDlg);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case 4003:
SetPrivilege();
OpenFileA(hwndDlg);
return FALSE;
case 4005:
return FALSE;


}
}

return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX wcx;
wcx.cbSize = sizeof(wcx);
wcx.hInstance = hInstance;
wcx.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
wcx.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
// The user interface is a modal dialog box
return DialogBox(hInstance, MAKEINTRESOURCE(1001), NULL, DialogProc);
}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (27)
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
打開文件不需要提權把
而且那一大堆頭文件都是什麼
2011-2-2 14:09
0
雪    币: 768
活跃值: (515)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
3
小邓不错,加油~
2011-2-2 14:32
0
雪    币: 437
活跃值: (110)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
新年祝福
2011-2-2 14:55
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
支持~加油!不过头文件咋声明了那么多?
2011-2-2 15:25
0
雪    币: 474
活跃值: (91)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
喜欢楼主的代码风格!
2011-2-2 15:39
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
7
代码很乱!头文件那么多是因为免得一个一个找了,直接用函数
2011-2-2 20:28
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
8
呵呵,知道那函数是什么作用就行拉
2011-2-2 20:30
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
9
谢谢鼓励哈,买电脑了,有自己的电脑了,以前一直网吧。
2011-2-2 20:48
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
10
呵呵,能看懂是什么作用就行了,代码多了有好处,没坏处
2011-2-2 20:49
0
雪    币: 189
活跃值: (4810)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
小邓不错,加油~
2011-2-2 21:03
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
那一堆头文件恰恰说明你没看懂是什么作用……

代码太多了就会变丑,太少了就会让其他人看的蛋疼,建议还是好好先规范一下自己的代码风格吧。
2011-2-3 16:44
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
13
呵呵,代码虽然很多,但是我相信大家还是看得懂吧,这个本来想写个反汇编工具的,由于反汇编引擎和编译器不兼容,所以把其他代码都删了,这里就懒得删了,我还有点浮躁
2011-2-3 17:42
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
14
PE菜鸟第二篇,希望大家不了解PE格式的一起学习,代码很乱,多谢拍砖,具体参考看雪精华10和加密解密第3本,自己搜索下和看下书,
#define WIN32_LEAN_AND_MEAN
[ATTACH]53940[/ATTACH]
#include <windows.h>
#include <commdlg.h>
#include "1.h"
PIMAGE_FILE_HEADER	pFileHeadera = NULL;
PIMAGE_OPTIONAL_HEADER	pOptionHeader = NULL;
BOOL  IsPeFile(LPVOID  ImageBase)   //判断是否是PE文件结构

{
  PIMAGE_DOS_HEADER  pDosHeader = NULL;  //定义IMAGE_DOS_HEADER结构变量
  PIMAGE_NT_HEADERS  pNtHeader  = NULL;  //定义IMAGE_NT_HEADERS结构变量
  if(!ImageBase)    //判断映像基址,映像基址由下面的MapViewOfFile函数传入进来
    return FALSE;
  pDosHeader = (PIMAGE_DOS_HEADER) ImageBase; //转换ImageBase为PIMAGE_DOS_HEADER结构变量类型
  if(pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)  //指向IMAGE_DOS_HEADER结构变量中的e_magic成员,e_magic是0x5A4D,名为IMAGE_DOS_SIGNATURE
    return FALSE;
  pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew); //从IMAGE_DOS_HEADER结构变量中找到e_lfanew成员里面的起始偏移量和加上映像基址得到PE文件头的指针
  if(pNtHeader->Signature != IMAGE_NT_SIGNATURE ) //指向IMAGE_NT_HEADERS结构变量中的Signature成员,Signature是0x4550,名为IMAGE_NT_SIGNATURE
    return  FALSE;
  return    TRUE;
}
PIMAGE_NT_HEADERS	GetNtHeader(LPVOID	ImageBase) //PE头由3部分组成,IMAGE_NT_HEADERS,IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER组成。
{
	PIMAGE_DOS_HEADER	pDosHeader = NULL;
	PIMAGE_NT_HEADERS	pNtHeader  = NULL;

	if(!IsPeFile(ImageBase))
		return	NULL;
	pDosHeader = (PIMAGE_DOS_HEADER)ImageBase;                                 //上面有注释,自己观看
	pNtHeader = (PIMAGE_NT_HEADERS32)((DWORD)pDosHeader+pDosHeader->e_lfanew);     //上面有注释,自己观看
	return		pNtHeader;
}

PIMAGE_FILE_HEADER	WINAPI	GetFileHeader(LPVOID	Imagebase)
{
	PIMAGE_FILE_HEADER	pFileHeader;   //PIMAGE_FILE_HEADER类型同下面注释的IMAGE_FILE_HEADER结构类型
	PIMAGE_NT_HEADERS	pNtHeader = NULL;
	pNtHeader = GetNtHeader(Imagebase);
	if(!pNtHeader)
		return	NULL;
	pFileHeader = & pNtHeader->FileHeader; 
	return	pFileHeader;
}
//参见这个结构
// typedef struct _IMAGE_NT_HEADERS {
    // DWORD Signature;
    // IMAGE_FILE_HEADER FileHeader;
    // IMAGE_OPTIONAL_HEADER32 OptionalHeader;
// } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;这两个FileHeader和OptionalHeader成员都被定义了类型,所以返回的类型为就是这个定义的类型
PIMAGE_OPTIONAL_HEADER	GetOptionalHeader(LPVOID	ImageBase)
{
	PIMAGE_OPTIONAL_HEADER	pOptionHeader = NULL;  // PIMAGE_OPTIONAL_HEADER32 类型同上面注释中的类型,这里名字不一样是因为有一个typedef,typedef PIMAGE_OPTIONAL_HEADER32  PIMAGE_OPTIONAL_HEADER;
	PIMAGE_NT_HEADERS	pNtHeader = NULL;
	pNtHeader = GetNtHeader(ImageBase);
	if(!pNtHeader)
		return	NULL;
	pOptionHeader = & pNtHeader->OptionalHeader;
	return	pOptionHeader;
}
void OpenFileA(HWND hwnd)
{   HANDLE hFile;
	HANDLE hMapping;
	LPVOID ImageBase;
	char         szFileName[MAX_PATH] = {0};
    TCHAR	     Buff[100];
	OPENFILENAME ofn;
    ZeroMemory(&ofn, sizeof(OPENFILENAME));	                    
	ofn.lStructSize  = sizeof(OPENFILENAME);
	ofn.lpstrFile	 = szFileName;
	ofn.nMaxFile     = MAX_PATH;
	ofn.lpstrFilter  = "Exe Files(*.exe)\0*.exe\0All Files(*.*)\0*.*\0\0";
	ofn.nFilterIndex = 1;
	if( !GetOpenFileName(&ofn) )
	{ 
		Sleep(1000);
	}
	wsprintf(Buff,"%s",ofn.lpstrFile);
	SetDlgItemText(hwnd,IDE_Edit,Buff);
    hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);//创建文件
	if (!hFile){;}
    hMapping=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL); //创建文件映像
	if(!hMapping)
	{									
		CloseHandle(hFile);
	}
	ImageBase=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0); //映射文件基址
    if(!ImageBase)
	{									
		CloseHandle(hMapping);
		CloseHandle(hFile);
	}
	if(!IsPeFile(ImageBase))
	{
		MessageBox(hwnd,"不是PE文件!","提示信息",MB_ICONERROR);
		return ;
	}
	else
	pFileHeadera = GetFileHeader(ImageBase);
	pOptionHeader = GetOptionalHeader(ImageBase);
	if(!(pFileHeadera&&pOptionHeader))
	{
	    MessageBox(hwnd,"获取文件头失败","PEINFO",MB_ICONERROR);
		return ;
	}
	wsprintf(Buff,"%08lX",pFileHeadera->Machine);  //IMAGE_FILE_HEADER结构内容读取,下面一样,具体观看http://bbs.pediy.com/showthread.php?t=100823 
	SetDlgItemText(hwnd,IDE_Machine,Buff);
	wsprintf(Buff,"%08lX",pFileHeadera->NumberOfSections);
	SetDlgItemText(hwnd,IDE_NumberOfSections,Buff);
	wsprintf(Buff,"%08lX",pFileHeadera->TimeDateStamp);
	SetDlgItemText(hwnd,IDE_TimeDateStamp,Buff);
	wsprintf(Buff,"%08lX",pFileHeadera->PointerToSymbolTable);
	SetDlgItemText(hwnd,IDE_PointerToSymbolTable,Buff);
	wsprintf(Buff,"%08lX",pFileHeadera->NumberOfSymbols);
	SetDlgItemText(hwnd,IDE_NumberOfSymbols,Buff);
	wsprintf(Buff,"%08lX",pFileHeadera->SizeOfOptionalHeader);
	SetDlgItemText(hwnd,IDE_SizeOfOptionalHeader,Buff);
	wsprintf(Buff,"%08lX",pFileHeadera->Characteristics);
	SetDlgItemText(hwnd,IDE_Characteristics,Buff);
}
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_INITDIALOG:
            return TRUE;

        case WM_CLOSE:
            DestroyWindow(hwndDlg);
            return TRUE;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case 4003:
                    OpenFileA(hwndDlg);
                    return FALSE;
				case 4005:
					return FALSE;


            }
    }

    return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	WNDCLASSEX wcx;
    wcx.cbSize = sizeof(wcx);
	wcx.hInstance = hInstance;
    wcx.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
	wcx.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));
    // The user interface is a modal dialog box
    return DialogBox(hInstance, MAKEINTRESOURCE(1001), NULL, DialogProc);
}
上传的附件:
2011-2-4 14:53
0
雪    币: 92
活跃值: (154)
能力值: ( LV8,RANK:135 )
在线值:
发帖
回帖
粉丝
15
不错,值得学习
2011-2-12 14:38
0
雪    币: 145
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
初学者看一下罗云杉的可以
2011-2-13 23:21
0
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
17
临渊羡渔,不如退而结网,慢慢来,送你一句话:路再长,一步一步也能走完,路再短,不迈开脚步永远无法达到,坚持走自己的路,一步一步慢慢来就行了~~加油,希望你能坚持下去~~
2011-2-13 23:25
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
这个精华的水平不高啊。。。
等闲下来也整一篇。呵呵。
2011-2-22 00:08
0
雪    币: 326
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
看来看雪的精品也不只是一水的驱动了啊。
不知道此文精在何处?何为亮点。
2011-2-23 21:01
0
雪    币: 233
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
这个代码跟网上一篇2008年的的blog的代码不论从变量名字还是函数代码结构都极度相似啊,
http://hi.baidu.com/hljleo/blog/item/c0f79f4ea092470fb2de0510.html
不知道是不是作者以前做的,或者是参考文献。。。。。。
本来我只是奇怪代码中的函数命名。。。IsPEFile(),很少有用这种函数名字的吧。。。就不小心google了一下。。。
2011-2-24 19:20
0
雪    币: 544
活跃值: (55)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
myicefox 真有闲情逸致啊。。。
2011-2-25 13:27
0
雪    币: 233
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
哈哈,只是看到IsPEFile这种奇怪函数名字的好奇心而已,然后google了一下。。。
2011-2-25 14:36
0
雪    币: 116
活跃值: (70)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
23
不错不错~,最近我也发现巩固基础的东西很重要,呵呵,共同进步吧
2011-2-25 14:59
0
雪    币: 35
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
留个记号等需要的时候来拿!
2011-2-25 19:34
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
还规范,很强,值得学习
2011-2-25 21:11
0
游客
登录 | 注册 方可回帖
返回
//