头文件globle.h
// globle.h: interface for the globle class.
//
//
#if !defined(AFX_GLOBLE_H__3D77A66B_EE77_4B6B_997F_15924F62332B__INCLUDED_)
#define AFX_GLOBLE_H__3D77A66B_EE77_4B6B_997F_15924F62332B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <windows.h>
#include <stdio.h>
//#define FILEPATH_IN "C:\\WINDOWS\\system32\\kernel32.dll"
#define FilePath_In "C:\\cntflx\\notepad.exe"
//#define FilePath_In "C:\\cntflx\\ipmsg.exe"
#define FilePath_Out "C:\\cntflx\\notepadnewpes.exe"
//#define FilePath_Out "C:\\cntflx\\ipmsgnewpes.exe"
#define MessageBoxAddr 0x77E5425F
#define ShellCodeLength 0x12
extern BYTE ShellCode[];
DWORD ReadPEFile(IN LPSTR lpszFile,OUT LPVOID* pFileBuffer);
DWORD CopyFileBufferToImageBuffer(IN LPVOID pFileBuffer,OUT LPVOID* pImageBuffer);
DWORD CopyImageBufferToNewBuffer(IN LPVOID pImageBuffer,OUT LPVOID* pNewBuffer);
BOOL MemeryTOFile(IN LPVOID pMemBuffer,IN size_t size,OUT LPSTR lpszFile);
//DWORD RvaToFileOffset(IN LPVOID pFileBuffer,IN DWORD dwRva);
void Fun();
#endif // !defined(AFX_GLOBLE_H__3D77A66B_EE77_4B6B_997F_15924F62332B__INCLUDED_)
核心代码globle.cpp
globle.cpp 对应文件头globle.h的核心代码部分
// globle.cpp: implementation of the globle class.
//
//
#include "stdafx.h"
#include "globle.h"
#include <string.h>
#include <windows.h>
#include <stdlib.h>
/*#include <tchar.h>
#include <iostream>
#include <stdio.h>
*/
//
// Construction/Destruction
//
// globle.cpp: implementation of the globle class.
//
//
//定义一个全局变量
BYTE ShellCode[] =
{
0x6A,00,0x6A,00,0x6A,00,0x6A,00,
0xE8,00,00,00,00,
0xE9,00,00,00,00
};
//
// Construction/Destruction
//
//ExeFile->FileBuffer 返回值为计算所得文件大小
DWORD ReadPEFile(IN LPSTR lpszFile, OUT LPVOID* pFileBuffer)
{
//下面有个IN和OUT,大致意思就是参数的类型传入进来之后不进行宏扩展;
//啥也不干,即使理解成干,也是扩展成空白,这个是C++语法中允许的;
//LPSTR ----> typedef CHAR *LPSTR, *PSTR; 意思就是char* 指针;在WINNT.H头文件里面
FILE* pFile = NULL;
//定义一个FILE结构体指针,在标准的Stdio.h文件头里面
//可参考:https://blog.csdn.net/qq_15821725/article/details/78929344
DWORD fileSize = 0;
// typedef unsigned long DWORD; DWORD是无符号4个字节的整型
LPVOID pTempFileBuffer = NULL;
//LPVOID ----> typedef void far *LPVOID;在WINDEF.H头文件里面;别名的void指针类型
//打开文件
pFile = fopen(lpszFile,"rb"); //lpszFile是当作参数传递进来
if (!pFile)
{
printf("打开文件失败!\r\n");
return 0;
}
/*
关于在指针类型中进行判断的操作,下面代码出现的情况和此一样,这里解释下:
1.因为指针判断都要跟NULL比较,相当于0,假值,其余都是真值
2.if(!pFile)和if(pFile == NULL), ----> 为空,就执行语句;这里是两个等于号不是一个等于号
3.if(pFile)就是if(pFile != NULL), 不为空,就执行语句;
*/
//读取文件内容后,获取文件的大小
fseek(pFile,0,SEEK_END);
fileSize = ftell(pFile);
fseek(pFile,0,