首页
论坛
课程
招聘
邓韬
雪    币: 49
活跃值: 活跃值 (11)
能力值: ( LV12,RANK:520 )
在线值:
发帖
280
回帖
1680
粉丝
0

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

2011-2-2 12:54 14144

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

2011-2-2 12:54
14144
学编程很久了,电脑也买了半个多月了,哎,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);
}


[公告]看雪论坛2020激励机制上线了!发帖不减雪币了!如何获得积分快速升级?

上传的附件:
最新回复 (27)
zapline
雪    币: 2362
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
68
回帖
2389
粉丝
0
zapline 活跃值 2011-2-2 14:09
2
0
打開文件不需要提權把
而且那一大堆頭文件都是什麼
FishSeeWater
雪    币: 687
活跃值: 活跃值 (11)
能力值: ( LV12,RANK:460 )
在线值:
发帖
60
回帖
845
粉丝
0
FishSeeWater 活跃值 11 2011-2-2 14:32
3
0
小邓不错,加油~
tornodo
雪    币: 248
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:70 )
在线值:
发帖
7
回帖
232
粉丝
0
tornodo 活跃值 1 2011-2-2 14:55
4
0
新年祝福
冷煞xiaosan
雪    币: 291
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
12
回帖
266
粉丝
0
冷煞xiaosan 活跃值 2011-2-2 15:25
5
0
支持~加油!不过头文件咋声明了那么多?
xianboabcd
雪    币: 469
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
16
回帖
125
粉丝
0
xianboabcd 活跃值 2011-2-2 15:39
6
0
喜欢楼主的代码风格!
邓韬
雪    币: 49
活跃值: 活跃值 (11)
能力值: ( LV12,RANK:520 )
在线值:
发帖
280
回帖
1680
粉丝
0
邓韬 活跃值 9 2011-2-2 20:28
7
0
代码很乱!头文件那么多是因为免得一个一个找了,直接用函数
邓韬
雪    币: 49
活跃值: 活跃值 (11)
能力值: ( LV12,RANK:520 )
在线值:
发帖
280
回帖
1680
粉丝
0
邓韬 活跃值 9 2011-2-2 20:30
8
0
呵呵,知道那函数是什么作用就行拉
邓韬
雪    币: 49
活跃值: 活跃值 (11)
能力值: ( LV12,RANK:520 )
在线值:
发帖
280
回帖
1680
粉丝
0
邓韬 活跃值 9 2011-2-2 20:48
9
0
谢谢鼓励哈,买电脑了,有自己的电脑了,以前一直网吧。
邓韬
雪    币: 49
活跃值: 活跃值 (11)
能力值: ( LV12,RANK:520 )
在线值:
发帖
280
回帖
1680
粉丝
0
邓韬 活跃值 9 2011-2-2 20:49
10
0
呵呵,能看懂是什么作用就行了,代码多了有好处,没坏处
kagayaki
雪    币: 308
活跃值: 活跃值 (31)
能力值: ( LV3,RANK:20 )
在线值:
发帖
164
回帖
1081
粉丝
0
kagayaki 活跃值 2011-2-2 21:03
11
0
小邓不错,加油~
xiilin
雪    币: 401
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
35
回帖
794
粉丝
0
xiilin 活跃值 2011-2-3 16:44
12
0
那一堆头文件恰恰说明你没看懂是什么作用……

代码太多了就会变丑,太少了就会让其他人看的蛋疼,建议还是好好先规范一下自己的代码风格吧。
邓韬
雪    币: 49
活跃值: 活跃值 (11)
能力值: ( LV12,RANK:520 )
在线值:
发帖
280
回帖
1680
粉丝
0
邓韬 活跃值 9 2011-2-3 17:42
13
0
呵呵,代码虽然很多,但是我相信大家还是看得懂吧,这个本来想写个反汇编工具的,由于反汇编引擎和编译器不兼容,所以把其他代码都删了,这里就懒得删了,我还有点浮躁
邓韬
雪    币: 49
活跃值: 活跃值 (11)
能力值: ( LV12,RANK:520 )
在线值:
发帖
280
回帖
1680
粉丝
0
邓韬 活跃值 9 2011-2-4 14:53
14
0
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);
}
上传的附件:
光棍节
雪    币: 84
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:140 )
在线值:
发帖
10
回帖
97
粉丝
0
光棍节 活跃值 2 2011-2-12 14:38
15
0
不错,值得学习
ufofind
雪    币: 145
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
8
回帖
109
粉丝
0
ufofind 活跃值 2011-2-13 23:21
16
0
初学者看一下罗云杉的可以
熊猫正正
雪    币: 1776
活跃值: 活跃值 (30)
能力值: ( LV12,RANK:480 )
在线值:
发帖
121
回帖
853
粉丝
5
熊猫正正 活跃值 9 2011-2-13 23:25
17
0
临渊羡渔,不如退而结网,慢慢来,送你一句话:路再长,一步一步也能走完,路再短,不迈开脚步永远无法达到,坚持走自己的路,一步一步慢慢来就行了~~加油,希望你能坚持下去~~
ddsoft
雪    币: 522
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
14
回帖
332
粉丝
0
ddsoft 活跃值 2011-2-22 00:08
18
0
这个精华的水平不高啊。。。
等闲下来也整一篇。呵呵。
comeon
雪    币: 314
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
9
回帖
212
粉丝
0
comeon 活跃值 2011-2-23 21:01
19
0
看来看雪的精品也不只是一水的驱动了啊。
不知道此文精在何处?何为亮点。
myicefox
雪    币: 233
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
1
回帖
48
粉丝
0
myicefox 活跃值 2011-2-24 19:20
20
0
这个代码跟网上一篇2008年的的blog的代码不论从变量名字还是函数代码结构都极度相似啊,
http://hi.baidu.com/hljleo/blog/item/c0f79f4ea092470fb2de0510.html
不知道是不是作者以前做的,或者是参考文献。。。。。。
本来我只是奇怪代码中的函数命名。。。IsPEFile(),很少有用这种函数名字的吧。。。就不小心google了一下。。。
ddsoft
雪    币: 522
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
14
回帖
332
粉丝
0
ddsoft 活跃值 2011-2-25 13:27
21
0
myicefox 真有闲情逸致啊。。。
myicefox
雪    币: 233
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
1
回帖
48
粉丝
0
myicefox 活跃值 2011-2-25 14:36
22
0
哈哈,只是看到IsPEFile这种奇怪函数名字的好奇心而已,然后google了一下。。。
bestshow
雪    币: 103
活跃值: 活跃值 (10)
能力值: ( LV10,RANK:170 )
在线值:
发帖
7
回帖
70
粉丝
0
bestshow 活跃值 4 2011-2-25 14:59
23
0
不错不错~,最近我也发现巩固基础的东西很重要,呵呵,共同进步吧
新手求
雪    币: 25
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
1
回帖
34
粉丝
0
新手求 活跃值 2011-2-25 19:34
24
0
留个记号等需要的时候来拿!
liuyinping
雪    币: 4
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
3
粉丝
0
liuyinping 活跃值 2011-2-25 21:11
25
0
还规范,很强,值得学习
xiaoxyz
雪    币: 71
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
10
回帖
183
粉丝
0
xiaoxyz 活跃值 2011-2-27 22:00
26
0

这样的工具再经过很多样本测试后会发现
PE条件判断不严格。。。
很容易崩溃
可参考PEID的判断条件
另外lz是初学这个 希望能持之以恒~
bushimajia
雪    币: 3
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
11
粉丝
0
bushimajia 活跃值 2011-2-28 02:24
27
0
才买电脑半个多月就这么牛了?强!向你学习!
lmhmylsq
雪    币: 210
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
0
回帖
49
粉丝
0
lmhmylsq 活跃值 2011-2-28 11:00
28
0
“巩固基础的东西很重要”
持之以恒!
游客
登录 | 注册 方可回帖
返回