PE-EXE-FileBuffer-ImageBuffer-NewFile-(解释版-非常详细)

头文件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,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值