您的位置:首页 > 编程语言

PE文件相关代码

2012-11-08 18:53 281 查看
;WIN32汇编无输入表调用API
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include		windows.inc

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.const

szCaption	db	'恭喜',0
szText		db	'非导入表调用成功!',0
szLoadLibrary	db	'LoadLibraryA',0
szGetProcAddress db	'GetProcAddress',0
szUser32	db	'user32',0
szMessageBox	db	'MessageBoxA',0

.data?
ALoadLibrary	dd	?
AGetProcAddress dd      ?
AMessageBox	dd	?
dwKernel32Base	dd	?

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
_Handler proc _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatchertext
pushad
mov	esi,_lpExceptionRecord
assume	esi:ptr EXCEPTIONRECORD
mov	edi,_lpContext
assume	edi:ptr CONTEXT
mov	eax,_lpSEH
push	[eax+0ch]
pop	[edi].regEbp
push	[eax+08]
pop	[edi].regEip
push	eax
pop	[edi].regEsp
assume	edi:nothing,esi:nothing
popad
mov	eax,ExceptionContinueExecution
ret
_Handler endp

_GetKernel32Base proc uses edi esi ebx dwEsp
call	@F
@@:
pop	ebx
sub	ebx,offset @B

;安装SEH
assume	fs:nothing
push	ebp
lea	eax, [ebx+offset _safeplace]
push	eax
lea	eax,[ebx + offset _Handler]
push	eax
push	fs:[0]
mov	fs:[0],esp

mov	eax,dwEsp
and	eax,0ffff0000h

.while	eax>=70000000h
.if word ptr [eax] == IMAGE_DOS_SIGNATURE
mov	edi,eax
add	edi,[eax+03ch]
.if word ptr [edi] == IMAGE_NT_SIGNATURE
jmp	find
.endif
.endif
_safeplace:
sub	eax,10000h
.endw
mov	eax,0
find:
pop	fs:[0]
add	esp,0ch
ret
_GetKernel32Base endp

_GetApi	proc	_hModule,_lpszApi
local	@dwReturn,@dwSize
pushad

call	@F
@@:
pop	ebx
sub	ebx,@B

assume	fs:nothing
push	ebp
push	[ebx+offset error]
push	[ebx+offset _Handler]
push	fs:[0]
mov	fs:[0],esp

mov	edi,_lpszApi
mov	ecx,-1
xor	eax,eax
cld
repnz	scasb
sub	edi,_lpszApi
mov	@dwSize,edi

mov	esi,_hModule
add	esi,[esi+3ch]
assume	esi:ptr IMAGE_NT_HEADERS
mov	esi,[esi].OptionalHeader.DataDirectory.VirtualAddress
add	esi,_hModule
assume	esi:ptr IMAGE_EXPORT_DIRECTORY

mov	ebx,[esi].AddressOfNames
add	ebx,_hModule
xor	edx,edx
.while  edx <	[esi].NumberOfNames
push	esi
mov	edi,[ebx]
add	edi,_hModule
mov	esi,_lpszApi
mov	ecx,@dwSize
cld
repz	cmpsb
.if	!ecx
pop	esi
jmp	@F
.endif
next:
pop	esi
inc	edx
add	ebx,4
.endw
jmp	error
@@:
sub	ebx,[esi].AddressOfNames
sub	ebx,_hModule
shr	ebx,1
add	ebx,[esi].AddressOfNameOrdinals
add	ebx,_hModule
movzx	eax,word ptr [ebx]
shl	eax,2
add	eax,[esi].AddressOfFunctions
add	eax,_hModule

mov	eax,[eax]
add	eax,_hModule
mov	@dwReturn,eax
error:
pop	fs:[0]
add	esp,0ch
assume	esi:nothing
popad
mov	eax,@dwReturn
ret
_GetApi endp

start:
mov	eax,[esp]
invoke	_GetKernel32Base,eax
.if	eax
mov	dwKernel32Base,eax
invoke	_GetApi,eax, offset szGetProcAddress
mov	AGetProcAddress,eax
.endif
.if	AGetProcAddress
push	offset szLoadLibrary
push	dwKernel32Base
call	AGetProcAddress
.if	eax
mov	ALoadLibrary,eax
push	offset szUser32
call	eax
.if	eax
push	offset szMessageBox
push	eax
call	AGetProcAddress
.if	eax
mov	AMessageBox,eax
.endif
.endif
.endif
.endif
.if	AMessageBox
push	MB_YESNO
push	offset szCaption
push	offset szText
push	NULL
call	AMessageBox
.endif
ret;invoke	ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end	start


 

可以嵌入PE文件执行的WIN32汇编代码

.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include		windows.inc

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code

jmp	_NewEntry

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;重要的函数名,为兼容WIN7 kernelbase.dll,增加LoadLibraryA函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
szLoadLibraryA db	'LoadLibraryA',0
;szLoadLibraryA   db	'LoadLibraryA',0
szGetProcAddress db	'GetProcAddress',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;补丁功能代码需要的DLL,函数名,字符串等全局变量定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
szUser32	 db	'user32',0

szMessageBoxA	 db	'MessageBoxA',0

szCaption	db	'恭喜',0
szText		db	'非导入表调用成功!',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;SEH错误Handler
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SEHHandler proc _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatchertext
pushad
mov	esi,_lpExceptionRecord
assume	esi:ptr EXCEPTIONRECORD
mov	edi,_lpContext
assume	edi:ptr CONTEXT
mov	eax,_lpSEH
push	[eax+0ch]
pop	[edi].regEbp
push	[eax+08]
pop	[edi].regEip
push	eax
pop	[edi].regEsp
assume	edi:nothing,esi:nothing
popad
mov	eax,ExceptionContinueExecution
ret
_SEHHandler endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;获取kernel32.dll基地址,2种获取方法自行选择
;PS:用PEB获取最好使用LoadLibraryExA函数以兼容WIN7
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetKernel32Base proc uses edi esi ebx _dwEsp
call	@F
@@:
pop	ebx
sub	ebx,offset @B

;安装SEH
assume	fs:nothing
push	ebp
lea	eax, [ebx+offset _safeplace]
push	eax
lea	eax,[ebx + offset _SEHHandler]
push	eax
push	fs:[0]
mov	fs:[0],esp

mov	eax,_dwEsp
and	eax,0ffff0000h

.while	eax>=70000000h
.if word ptr [eax] == IMAGE_DOS_SIGNATURE
mov	edi,eax
add	edi,[eax+03ch]
.if word ptr [edi] == IMAGE_NT_SIGNATURE
jmp	find
.endif
.endif
_safeplace:
sub	eax,10000h
.endw
mov	eax,0
find:
pop	fs:[0]
add	esp,0ch
ret
_GetKernel32Base endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;用PEB获取基址的方法
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;_GetKernel32Base proc
;	local	@dwRet

;	pushad
;
;	assume fs:nothing
;	mov eax,fs:[30h]	;获取PEB所在地址
;	mov eax,[eax+0ch]	;获取PEB_LDR_DATA 结构指针
;	mov esi,[eax+1ch]	;获取InInitializationOrderModuleList 链表头
;				;第一个LDR_MODULE节点InInitializationOrderModuleList成员的指针
;	lodsd			;获取双向链表当前节点后继的指针
;	mov eax,[eax+8]		;获取kernel32.dll的基地址
;	mov @dwRet,eax
;	popad
;
;	mov eax,@dwRet
;	ret
;_GetKernel32Base endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;查找导出表获取制定API地址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetApi	proc	_hModule,_lpszApi
local	@dwReturn,@dwSize
pushad

call	@F
@@:
pop	ebx
sub	ebx,@B

assume	fs:nothing
push	ebp
push	[ebx+offset error]
push	[ebx+offset _SEHHandler]
push	fs:[0]
mov	fs:[0],esp

mov	edi,_lpszApi
mov	ecx,-1
xor	eax,eax
cld
repnz	scasb
sub	edi,_lpszApi
mov	@dwSize,edi

mov	esi,_hModule
add	esi,[esi+3ch]
assume	esi:ptr IMAGE_NT_HEADERS
mov	esi,[esi].OptionalHeader.DataDirectory.VirtualAddress
add	esi,_hModule
assume	esi:ptr IMAGE_EXPORT_DIRECTORY

mov	ebx,[esi].AddressOfNames
add	ebx,_hModule
xor	edx,edx
.while  edx <	[esi].NumberOfNames
push	esi
mov	edi,[ebx]
add	edi,_hModule
mov	esi,_lpszApi
mov	ecx,@dwSize
cld
repz	cmpsb
.if	!ecx
pop	esi
jmp	@F
.endif
next:
pop	esi
inc	edx
add	ebx,4
.endw
jmp	error
@@:
sub	ebx,[esi].AddressOfNames
sub	ebx,_hModule
shr	ebx,1
add	ebx,[esi].AddressOfNameOrdinals
add	ebx,_hModule
movzx	eax,word ptr [ebx]
shl	eax,2
add	eax,[esi].AddressOfFunctions
add	eax,_hModule

mov	eax,[eax]
add	eax,_hModule
mov	@dwReturn,eax
error:
pop	fs:[0]
add	esp,0ch
assume	esi:nothing
popad
mov	eax,@dwReturn
ret
_GetApi endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;补丁功能部分
;_dwKernelBase:		kernel32.dll基址
;_lpGetProcAddress:	GetProcAddress地址
;_lpLoadLibraryA	LoadLibraryA或LoadLibraryA地址
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Patch	proc	_dwKernelBase,_lpGetProcAddress,_lpLoadLibraryA
local	@hUser32,@lpMessageBoxA

pushad
lea	edx,dword ptr [ebx+offset szUser32]
push	0
push	0
push	edx
call	_lpLoadLibraryA
.if	eax
mov	@hUser32,eax
lea	edx,dword ptr [ebx+offset szMessageBoxA]
push	edx
push	eax
call	_lpGetProcAddress
.if	eax
mov	@lpMessageBoxA,eax
.endif
.endif
.if	@lpMessageBoxA
push	MB_YESNO
lea	edx,dword ptr [ebx+offset szCaption]
push	edx
lea	edx,dword ptr [ebx+offset szText]
push	edx
push	NULL
call	@lpMessageBoxA
.endif
popad
ret
_Patch	endp

_start	proc
local	@dwKernel32Base
local	@lpGetProcAddress,@lpLoadLibraryA

pushad
push	edx
call	_GetKernel32Base
.if	eax
mov	@dwKernel32Base,eax
lea	edx,dword ptr [ebx+offset szGetProcAddress]
push	edx
push	eax
call	_GetApi
mov	@lpGetProcAddress,eax
.endif
.if	@lpGetProcAddress
lea	edx,dword ptr [ebx+offset szLoadLibraryA]
push	edx
push	@dwKernel32Base
call	@lpGetProcAddress
.if	eax
mov	@lpLoadLibraryA,eax
push	eax
push	@lpGetProcAddress
push	@dwKernel32Base
call	_Patch
.endif
.endif

popad
xor	eax,eax
ret
_start	endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;PE文件新入口
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_NewEntry:
mov	edx,[esp]
call	@F
@@:
pop	ebx
sub	ebx,@B
call	_start
;ret
jmpToStart db 0E9h,0F0h,0FFh,0ffh,0ffh	;需要修正
ret
end	_NewEntry

 

 

 

 

PE加载器(仅提供个思路..实际中无法使用)

#include <windows.h>
#include <commdlg.h>
#include "resource.h"

#pragma comment(linker,"/BASE:0x70000000")

void PopFileInitialize (HWND hwnd);
BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName);

BOOL FixReloc(BYTE *lpImage, DWORD OldImage, PIMAGE_BASE_RELOCATION pRelocData);
BOOL FixIAT(BYTE *lpImage, PIMAGE_IMPORT_DESCRIPTOR pImportDescriptor);
BOOL LoadPE(TCHAR	szFileName[]);
void SetProtect(BYTE *lpImage, PIMAGE_SECTION_HEADER pFirstSection,DWORD dwSectionNum);

//载入PE用到的参数
HINSTANCE	arg1, arg2;
PSTR		arg3;
int			arg4;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
TCHAR	szFileName[MAX_PATH] ={0};
arg1	= hInstance;
arg2	= hPrevInstance;
arg3	= szCmdLine;
arg4	= iCmdShow;
PopFileInitialize(NULL);
PopFileOpenDlg(NULL, szFileName, TEXT("选择要载入的PE文件") );
if (!LoadPE(szFileName) )
;//MessageBox(NULL, TEXT("载入PE文件失败"), NULL, NULL);
return 0;
}

BOOL LoadPE(TCHAR	szFileName[])
{
//::PIMAGE_DATA_DIRECTORY		pDataDirectory;
::PIMAGE_BASE_RELOCATION	pRelocData;
::PIMAGE_IMPORT_DESCRIPTOR	pImportDescriptor;
::PIMAGE_NT_HEADERS			pNtHeaders;

HANDLE	hFile;
HANDLE	hMap;
BYTE	*lpMemory;
BYTE	*lpImage;

DWORD	dwImageBase;	//文件头基地址
DWORD	dwEntryAddress;	//入口地址
DWORD	dwImageSize;

if (INVALID_HANDLE_VALUE == ( hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL) ) )
{
MessageBox(NULL, L"打开文件失败", NULL, NULL);
return FALSE;
}

hMap	= CreateFileMapping(hFile,  NULL, PAGE_READONLY, 0, 0, NULL);
if (hMap)
{
lpMemory	= (BYTE*)MapViewOfFile (hMap, FILE_MAP_READ, 0, 0, 0);
if (lpMemory)
{

if ( *((WORD*)lpMemory) == 0x5A4D)
{
pNtHeaders	= (PIMAGE_NT_HEADERS)(lpMemory + ((PIMAGE_DOS_HEADER)lpMemory)->e_lfanew);
if (pNtHeaders->Signature == 0x4550)
{
dwImageSize	= pNtHeaders->OptionalHeader.SizeOfImage;
dwImageBase	= pNtHeaders->OptionalHeader.ImageBase;
dwEntryAddress	= pNtHeaders->OptionalHeader.AddressOfEntryPoint;

lpImage		= (PBYTE)VirtualAlloc((LPVOID)dwImageBase, dwImageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (!lpImage)
{
lpImage	= (PBYTE)VirtualAlloc(NULL, dwImageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
}

//文件头读入
memset(lpImage, 0, dwImageSize);
memcpy(lpImage, lpMemory, pNtHeaders->OptionalHeader.SizeOfHeaders);

//区段读入
PIMAGE_SECTION_HEADER	pSectionHeader, pFirstSection;
DWORD	dwSectionSize;
DWORD	dwSectionAddr,dwFileAddr;
DWORD	dwSectionNum	= pNtHeaders->FileHeader.NumberOfSections;
pSectionHeader	= pFirstSection = (PIMAGE_SECTION_HEADER)(pNtHeaders+1);

for (DWORD i=0; i < dwSectionNum; i++, pSectionHeader++)
{
dwSectionAddr	= pSectionHeader->VirtualAddress;
dwFileAddr		= pSectionHeader->PointerToRawData;
dwSectionSize	= pSectionHeader->Misc.VirtualSize;
memcpy(lpImage + dwSectionAddr, lpMemory + dwFileAddr, pSectionHeader->SizeOfRawData);
}

//修复IAT
pImportDescriptor	= (PIMAGE_IMPORT_DESCRIPTOR)(lpImage + pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
FixIAT(lpImage, pImportDescriptor);

//重定位修复
if (pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress)
{
pRelocData			= (PIMAGE_BASE_RELOCATION)(lpImage + pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);
FixReloc(lpImage, dwImageBase, pRelocData);
}

SetProtect(lpImage, pFirstSection, dwSectionNum);
//准备跳入PE
DWORD addr = dwEntryAddress + (DWORD)lpImage;
_asm
{
push	arg4
push	arg3
push	arg2
push	lpImage
call	addr
}

}
else
MessageBox(NULL, L"不是PE文件", NULL, NULL);
}
else
MessageBox(NULL, L"不是PE文件", NULL, NULL);
}
}

if (lpMemory)
UnmapViewOfFile (lpMemory);
CloseHandle(hMap);
CloseHandle(hFile);
return FALSE;
}

BOOL FixReloc(BYTE *lpImage, DWORD OldImage, PIMAGE_BASE_RELOCATION pRelocData)
{
DWORD	dwOffset;  //修正用
DWORD	dwBase;		//修正基地址
DWORD	*dwAddress; //需要修正的地址
DWORD	dwNum;	//修正项数
WORD	*wValue;//修正偏移
PIMAGE_BASE_RELOCATION	pReloc;

dwOffset	= (DWORD)(lpImage - OldImage);
pReloc		= pRelocData;
for (; pReloc->VirtualAddress; pReloc++)
{
dwBase	= pReloc->VirtualAddress;
dwNum	= (pReloc->SizeOfBlock - 8) / 2;
wValue	= (WORD*)((DWORD)pReloc + 8);
while(dwNum--)
{
dwAddress	= (DWORD*)(lpImage + dwBase + *wValue);
(*dwAddress)+= dwOffset;
wValue++;
}
}

return TRUE;
}

BOOL FixIAT(BYTE *lpImage, PIMAGE_IMPORT_DESCRIPTOR pImportDescriptor)
{
PIMAGE_IMPORT_DESCRIPTOR	pDllImport;
PIMAGE_THUNK_DATA			pOrignalThunk, pFirstThunk;
PIMAGE_IMPORT_BY_NAME		pImportByName;
HMODULE	hModule;
DWORD	dwAddress,dwFunc;
char	szDllName[MAX_PATH];

for (pDllImport = pImportDescriptor; pDllImport->Name ; pDllImport++)
{
lstrcpyA(szDllName, (char*)(lpImage + pDllImport->Name));
if (!(hModule = GetModuleHandleA(szDllName)) )
hModule	= LoadLibraryA (szDllName);
if (pDllImport->OriginalFirstThunk)
pOrignalThunk	= (PIMAGE_THUNK_DATA)(lpImage + pDllImport->OriginalFirstThunk);
else
pOrignalThunk	= (PIMAGE_THUNK_DATA)(lpImage + pDllImport->FirstThunk);
pFirstThunk	= (PIMAGE_THUNK_DATA)(lpImage + pDllImport->FirstThunk);
for (; pOrignalThunk->u1.Function; pOrignalThunk++, pFirstThunk++)
{
if ( (pOrignalThunk->u1.Ordinal) & 0x80000000) //序号导入
{
dwFunc	= pOrignalThunk->u1.Ordinal;
dwFunc	&= 0x7fffffff;
}
else    //名称导入
{
pImportByName	= (PIMAGE_IMPORT_BY_NAME)(lpImage + pOrignalThunk->u1.Function);
dwFunc	= (DWORD)pImportByName->Name;
}
dwAddress	= (DWORD)GetProcAddress (hModule, (LPCSTR)dwFunc);
pFirstThunk->u1.Function	= dwAddress;
}
}

return TRUE;
}

void SetProtect(BYTE *lpImage, PIMAGE_SECTION_HEADER pFirstSection,DWORD dwSectionNum)
{
PIMAGE_SECTION_HEADER	pSectionHeader = pFirstSection;
DWORD	dwProtect;
DWORD	dwSectionSize, dwSectionAddr;
for (DWORD i=0; i < dwSectionNum; i++, pSectionHeader++)
{
dwSectionSize	= pSectionHeader->Misc.VirtualSize;
dwSectionAddr	= pSectionHeader->VirtualAddress;
if (pSectionHeader->Characteristics & IMAGE_SCN_MEM_READ)
dwProtect	= PAGE_READONLY;
if (pSectionHeader->Characteristics & IMAGE_SCN_MEM_WRITE)
dwProtect	= PAGE_READWRITE;
if (pSectionHeader->Characteristics & IMAGE_SCN_MEM_EXECUTE)
{
if (pSectionHeader->Characteristics & IMAGE_SCN_MEM_READ)
dwProtect	= PAGE_EXECUTE_READ;
else if (pSectionHeader->Characteristics & IMAGE_SCN_MEM_WRITE)
dwProtect	= PAGE_EXECUTE_READWRITE;
else
dwProtect	= PAGE_EXECUTE;
}
DWORD	OldProtect;
if (!VirtualProtect(lpImage+dwSectionAddr, dwSectionSize, dwProtect, &OldProtect) )
MessageBox(NULL,L"页面属性设置失败", NULL, 0);

}
}

///////////////////////////////////打开文件对话框/////////////////////////////////////////////////////////
static OPENFILENAME ofn ;

void PopFileInitialize (HWND hwnd)
{
static TCHAR szFilter[] = TEXT ("PE Files \0*.exe;*.dll\0")  \
TEXT ("All Files (*.*)\0*.*\0\0") ;

ofn.lStructSize       = sizeof (OPENFILENAME) ;
ofn.hwndOwner         = hwnd ;
ofn.hInstance         = NULL ;
ofn.lpstrFilter       = szFilter ;
ofn.lpstrCustomFilter = NULL ;
ofn.nMaxCustFilter    = 0 ;
ofn.nFilterIndex      = 0 ;
ofn.lpstrFile         = NULL ;          // Set in Open and Close functions
ofn.nMaxFile          = MAX_PATH ;
ofn.lpstrFileTitle    = NULL ;          // Set in Open and Close functions
ofn.nMaxFileTitle     = MAX_PATH ;
ofn.lpstrInitialDir   = NULL ;
ofn.lpstrTitle        = NULL ;
ofn.Flags             = 0 ;             // Set in Open and Close functions
ofn.nFileOffset       = 0 ;
ofn.nFileExtension    = 0 ;
ofn.lpstrDefExt       = TEXT ("txt") ;
ofn.lCustData         = 0L ;
ofn.lpfnHook          = NULL ;
ofn.lpTemplateName    = NULL ;
}

BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
{
ofn.hwndOwner         = hwnd ;
ofn.lpstrFile         = pstrFileName ;
ofn.lpstrTitle		   = pstrTitleName ;
ofn.Flags             = OFN_HIDEREADONLY | OFN_CREATEPROMPT ;

return GetOpenFileName (&ofn) ;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: