⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dllex.c

📁 C写的小型操作系统源码
💻 C
字号:
#include "stdio.h"
#include "windows.h"
#include "stdlib.h"

DWORD g_dwFileHeader[1024] = {0}; //the PE file's header will be read into this buffer

typedef struct __tagFILE_HEADER
{
	unsigned char ucNop[4];
	DWORD dwJmpAddr;
}__FILE_HEADER;

__FILE_HEADER g_FileHeader = {0x90, 0x90, 0x90, 0xe9, 0x00000000}; //This structure will be written to target file.

char* g_lpszTargetPath = "D:\\ErinWorkspace\\lab\\master.dll";//targe file's path and name

void main()
{
	IMAGE_DOS_HEADER* ImageDosHeader = NULL;
	IMAGE_NT_HEADERS* ImageNtHeader = NULL;
	IMAGE_OPTIONAL_HEADER* ImageOptionalHeader = NULL;
	HANDLE hFile = INVALID_HANDLE_VALUE;
	DWORD dwReadBytes = 0L;
	BOOL bResult = FALSE;
	DWORD dwActualBytes = 0L;
	DWORD dwOffset = 0L;
	UCHAR* lpucSource = NULL;
	UCHAR* lpucDes = NULL;
	DWORD dwLoop = 0;

	hFile = CreateFile(            //Open the target file.
		g_lpszTargetPath,
		GENERIC_READ | GENERIC_WRITE,
		0L,
		NULL,
		OPEN_ALWAYS,
		0L,
		NULL);

	if(INVALID_HANDLE_VALUE == hFile)
	{
		printf("Can't open the target file to read.");
		goto __TERMINAL;
	}
		           
	dwReadBytes = 4096;  //Read 4k bytes from target file.

	bResult = ReadFile(hFile, g_dwFileHeader, dwReadBytes, &dwActualBytes, NULL);

	if(!bResult)
		goto __TERMINAL;

	CloseHandle(hFile);
	hFile = INVALID_HANDLE_VALUE;

	//The following code locates the entry point of the PE file, and modifies it.

	ImageDosHeader = (IMAGE_DOS_HEADER*)&g_dwFileHeader[0];
	dwOffset = ImageDosHeader->e_lfanew;

	ImageNtHeader = (IMAGE_NT_HEADERS*)((UCHAR*)&g_dwFileHeader[0] + dwOffset);

	ImageOptionalHeader = &(ImageNtHeader->OptionalHeader);

    g_FileHeader.dwJmpAddr = ImageOptionalHeader->AddressOfEntryPoint;

	printf("  Entry Point: %d\r\n", ImageOptionalHeader->AddressOfEntryPoint);
	
	g_FileHeader.dwJmpAddr -= sizeof(__FILE_HEADER); //Calculate the target address will jump to. 
	                                                 //Because we have added some nop instructions in front of the target file, 
	                                                 //so we must adjust it.
	lpucSource = (UCHAR*)&g_FileHeader.ucNop[0];
	lpucDes = (UCHAR*)&g_dwFileHeader[0];

    for(dwLoop = 0; dwLoop < sizeof(__FILE_HEADER); dwLoop++)  //Modify the target file's header.
	{
		*lpucDes = *lpucSource;
		lpucDes++;
		lpucSource++;
	}
	
	hFile = CreateFile(             //Open the target file to write
		g_lpszTargetPath,
		GENERIC_READ | GENERIC_WRITE,
		0L,
		NULL,
		OPEN_ALWAYS,
		0L,
		NULL);

	if(INVALID_HANDLE_VALUE == hFile)
	{
		printf("Can not open the target file to write.");
		goto __TERMINAL;
	}

	WriteFile(hFile, (LPVOID)&g_dwFileHeader[0], sizeof(__FILE_HEADER), &dwActualBytes, NULL);

	printf("SectionAligment: %d\r\n", ImageOptionalHeader->SectionAlignment);
	printf("FileAligment: %d\r\n", ImageOptionalHeader->FileAlignment);


__TERMINAL:

	if(INVALID_HANDLE_VALUE != hFile)
		CloseHandle(hFile);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -