C++ 如何将资源的所有字节嵌入到可执行文件中?

C++ 如何将资源的所有字节嵌入到可执行文件中?,c++,visual-c++,visual-studio-2015,embedded-resource,C++,Visual C++,Visual Studio 2015,Embedded Resource,我有一个通过手动映射注入DLL的代码,可以很好地工作(读取磁盘中文件的所有字节),现在我想直接从资源中读取所有这些字节,我已经尝试了以下调整,但直到现在都没有成功 下面是如何直接从磁盘读取文件: bool MapRemoteModule(unsigned long pId, char *module) { IMAGE_DOS_HEADER *dosHd; IMAGE_NT_HEADERS *ntHd; HANDLE hFile = CreateFile(module,

我有一个通过手动映射注入DLL的代码,可以很好地工作(读取磁盘中文件的所有字节),现在我想直接从资源中读取所有这些字节,我已经尝试了以下调整,但直到现在都没有成功

下面是如何直接从磁盘读取文件:

bool MapRemoteModule(unsigned long pId, char *module)
{
   IMAGE_DOS_HEADER *dosHd;
   IMAGE_NT_HEADERS *ntHd;

   HANDLE hFile = CreateFile(module,
      GENERIC_READ,
      FILE_SHARE_READ | FILE_SHARE_WRITE,
      NULL,
      OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      NULL);

   if(hFile == INVALID_HANDLE_VALUE)
      return false;

   unsigned int fSize;

   if(GetFileAttributes(module) & FILE_ATTRIBUTE_COMPRESSED)
      fSize = GetCompressedFileSize(module, NULL);
   else
      fSize = GetFileSize(hFile, NULL);

   unsigned char *dllBin = new unsigned char[fSize];
   unsigned int nBytes;

   ReadFile(hFile, dllBin, fSize, (LPDWORD)&nBytes, FALSE);
   CloseHandle(hFile);

...
下面是我尝试的适应工作,从资源中读取这些字节:

// Mapping.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "resource.h"
#include <windows.h>
#include <tlhelp32.h>
#include <shlwapi.h>
#include <string>

using namespace std;

#pragma comment(lib, "shlwapi.lib")

#define ID_LOADER_DLL   MAKEINTRESOURCE(IDR_DLL1)

#define IMAGE_DIRECTORY_ENTRY_IMPORT 1
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5

#define MakePtr( cast, ptr, addValue ) (cast)( (DWORD_PTR)(ptr) + (DWORD_PTR)(addValue))
#define MakeDelta(cast, x, y) (cast) ( (DWORD_PTR)(x) - (DWORD_PTR)(y))

bool MapRemoteModule(unsigned long pId, LPCSTR ResName);
unsigned long GetProcessIdByName(char *);
HMODULE GetRemoteModuleHandle(unsigned long, char *);
FARPROC GetRemoteProcAddress(unsigned long, char *, char *);

bool FixImports(unsigned long, void *, IMAGE_NT_HEADERS *, IMAGE_IMPORT_DESCRIPTOR *);
bool FixRelocs(void *, void *, IMAGE_NT_HEADERS *, IMAGE_BASE_RELOCATION *, unsigned int);
bool MapSections(HANDLE, void *, void *, IMAGE_NT_HEADERS *);

PIMAGE_SECTION_HEADER GetEnclosingSectionHeader(DWORD, PIMAGE_NT_HEADERS);
LPVOID GetPtrFromRVA(DWORD, PIMAGE_NT_HEADERS, PBYTE);

__declspec(naked) void DllCall_stub(HMODULE hMod)
{
   _asm
   {
      push 0
      push 1
      push [esp+0Ch]        
      mov eax, 0xDEADBEEF   
      call eax                          
      ret                                       
   }
}

__declspec(naked) void DC_stubend(void) { }   

bool MapRemoteModule(unsigned long pId, LPCSTR ResName)
{
   IMAGE_DOS_HEADER *dosHd;
   IMAGE_NT_HEADERS *ntHd;

   HRSRC hResource; 
   HGLOBAL hResourceLoaded; 
   LPBYTE lpBuffer; 

   hResource = FindResource(NULL, ResName, RT_RCDATA);
   if (NULL != hResource) 
  { 
      hResourceLoaded = LoadResource(NULL, hResource); 
      if (NULL != hResourceLoaded)         
      { 
          lpBuffer = (LPBYTE) LockResource(hResourceLoaded);             
          if (NULL != lpBuffer)             
          {        
              unsigned int fSize = 0;

              fSize = SizeofResource(NULL, hResource);

              if (fSize > 0) 
              {

                  unsigned char *dllBin = lpBuffer;
                  unsigned int nBytes = fSize;

   dosHd = MakePtr(IMAGE_DOS_HEADER *, dllBin, 0);

   if(dosHd->e_magic != IMAGE_DOS_SIGNATURE)
   {
      delete dllBin;
      return false;
   }

   ntHd = MakePtr(IMAGE_NT_HEADERS *, dllBin, dosHd->e_lfanew);

   if(ntHd->Signature != IMAGE_NT_SIGNATURE)
   {
      delete dllBin;
      return false;
   }

   HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);

   if(!hProcess)
      return false;

   void *moduleBase = VirtualAllocEx(hProcess,
      NULL,
      ntHd->OptionalHeader.SizeOfImage,
      MEM_COMMIT | MEM_RESERVE,
      PAGE_EXECUTE_READWRITE);

   if(!moduleBase)
      return false;

   void *stubBase = VirtualAllocEx(hProcess,
      NULL,
      MakeDelta(SIZE_T, DC_stubend, DllCall_stub),
      MEM_COMMIT | MEM_RESERVE,
      PAGE_EXECUTE_READWRITE);

   if(!stubBase)
      return false;

   IMAGE_IMPORT_DESCRIPTOR *impDesc = (IMAGE_IMPORT_DESCRIPTOR *)GetPtrFromRVA(
      (DWORD)(ntHd->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress),
      ntHd,
      (PBYTE)dllBin);

   if(ntHd->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size)
   {
       if(!FixImports(pId,
         (unsigned char *)dllBin,
         ntHd,
         impDesc)) return FALSE;

   };

   IMAGE_BASE_RELOCATION *reloc = (IMAGE_BASE_RELOCATION *)GetPtrFromRVA(
      (DWORD)(ntHd->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress),
      ntHd,
      (PBYTE)dllBin);

   if(ntHd->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size)
   {

       FixRelocs(dllBin,
           moduleBase,
           ntHd,
           reloc,
           ntHd->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size);
   }
   else
   {
       return false;
   };

   WriteProcessMemory(hProcess,
      moduleBase,
      dllBin,
      ntHd->FileHeader.SizeOfOptionalHeader + sizeof(ntHd->FileHeader) + sizeof(ntHd->Signature),
      (SIZE_T *)&nBytes);

   MapSections(hProcess, moduleBase, dllBin, ntHd);

   VirtualProtect((LPVOID)DllCall_stub,
      MakeDelta(SIZE_T, DC_stubend, DllCall_stub),
      PAGE_EXECUTE_READWRITE,
      (DWORD *)&nBytes);

   *MakePtr(unsigned long *, DllCall_stub, 9) =
      MakePtr(unsigned long, moduleBase, ntHd->OptionalHeader.AddressOfEntryPoint);

   WriteProcessMemory(hProcess,
      stubBase,
      (LPVOID)DllCall_stub,
      MakeDelta(SIZE_T, DC_stubend, DllCall_stub),
      (SIZE_T *)&nBytes);

   CreateRemoteThread(hProcess,
      NULL,
      0,
      (LPTHREAD_START_ROUTINE)stubBase,
      moduleBase, 
      0,
      NULL);

   delete dllBin;
   return true;

              }
          }
      }
   }
   return false;
}

bool MapSections(HANDLE hProcess, void *moduleBase, void *dllBin, IMAGE_NT_HEADERS *ntHd)
{
   IMAGE_SECTION_HEADER *header = IMAGE_FIRST_SECTION(ntHd);
   unsigned int nBytes = 0;
   unsigned int virtualSize = 0;
   unsigned int n = 0;

   for(unsigned int i = 0; ntHd->FileHeader.NumberOfSections; i++)
   {

      if(nBytes >= ntHd->OptionalHeader.SizeOfImage)
         break;

      WriteProcessMemory(hProcess,
         MakePtr(LPVOID, moduleBase, header->VirtualAddress),
         MakePtr(LPCVOID, dllBin, header->PointerToRawData),
         header->SizeOfRawData,
         (LPDWORD)&n);

      virtualSize = header->VirtualAddress;
      header++;
      virtualSize = header->VirtualAddress - virtualSize;
      nBytes += virtualSize;

      VirtualProtectEx(hProcess,
         MakePtr(LPVOID, moduleBase, header->VirtualAddress),
         virtualSize,
         header->Characteristics & 0x00FFFFFF,
         NULL);
   }

   return true;
}

bool FixImports(unsigned long pId, void *base, IMAGE_NT_HEADERS *ntHd, IMAGE_IMPORT_DESCRIPTOR *impDesc)
{
   char *module;
   bool retfix=1;
   char tempstr[MAX_PATH]="";

   while((module = (char *)GetPtrFromRVA((DWORD)(impDesc->Name), ntHd, (PBYTE)base)))
   {

      if(!GetRemoteModuleHandle(pId, module))
      {
         retfix=0;
         break;
      };

      IMAGE_THUNK_DATA *itd =
         (IMAGE_THUNK_DATA *)GetPtrFromRVA((DWORD)(impDesc->FirstThunk), ntHd, (PBYTE)base);

      while(itd->u1.AddressOfData)
      {
         IMAGE_IMPORT_BY_NAME *iibn;
         iibn = (IMAGE_IMPORT_BY_NAME *)GetPtrFromRVA((DWORD)(itd->u1.AddressOfData), ntHd, (PBYTE)base);

             itd->u1.Function = MakePtr(DWORD, GetRemoteProcAddress(pId,
            module,
            (char *)iibn->Name), 0);

         itd++;
      }       
      impDesc++;
   }

   return retfix;
}

bool FixRelocs(void *base, void *rBase, IMAGE_NT_HEADERS *ntHd, IMAGE_BASE_RELOCATION *reloc, unsigned int size)
{
   unsigned long ImageBase = ntHd->OptionalHeader.ImageBase;
   unsigned int nBytes = 0;

   unsigned long delta = MakeDelta(unsigned long, rBase, ImageBase);

   while(1)
   {
      unsigned long *locBase =
         (unsigned long *)GetPtrFromRVA((DWORD)(reloc->VirtualAddress), ntHd, (PBYTE)base);
      unsigned int numRelocs = (reloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD);

      if(nBytes >= size) break;

      unsigned short *locData = MakePtr(unsigned short *, reloc, sizeof(IMAGE_BASE_RELOCATION));
      for(unsigned int i = 0; i < numRelocs; i++)
      {       
         if(((*locData >> 12) & IMAGE_REL_BASED_HIGHLOW))
             *MakePtr(unsigned long *, locBase, (*locData & 0x0FFF)) += delta;

         locData++;
      }

      nBytes += reloc->SizeOfBlock;
      reloc = (IMAGE_BASE_RELOCATION *)locData;
   }

   return true;
}

FARPROC GetRemoteProcAddress(unsigned long pId, char *module, char *func)
{
   HMODULE remoteMod = GetRemoteModuleHandle(pId, module);
   HMODULE localMod = GetModuleHandle(module);

   unsigned long delta = MakeDelta(unsigned long, remoteMod, localMod);
   return MakePtr(FARPROC, GetProcAddress(localMod, func), delta);
}

HMODULE GetRemoteModuleHandle(unsigned long pId, char *module)
{
   MODULEENTRY32 modEntry;
   HANDLE tlh = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pId);

   modEntry.dwSize = sizeof(MODULEENTRY32);
    Module32First(tlh, &modEntry);

   do
   {
      if(!_stricmp(modEntry.szModule, module))
         return modEntry.hModule;
      modEntry.dwSize = sizeof(MODULEENTRY32);
   }
   while(Module32Next(tlh, &modEntry));

   return NULL;
}

PIMAGE_SECTION_HEADER GetEnclosingSectionHeader(DWORD rva, PIMAGE_NT_HEADERS pNTHeader)
{
    PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(pNTHeader);
    unsigned int i;

    for ( i = 0; i < pNTHeader->FileHeader.NumberOfSections; i++, section++ )
    {

      DWORD size = section->Misc.VirtualSize;
      if ( 0 == size )
         size = section->SizeOfRawData;

        if ( (rva >= section->VirtualAddress) &&
             (rva < (section->VirtualAddress + size)))
            return section;
    }

    return 0;
}

LPVOID GetPtrFromRVA( DWORD rva, IMAGE_NT_HEADERS *pNTHeader, PBYTE imageBase )
{
   PIMAGE_SECTION_HEADER pSectionHdr;
   INT delta;

   pSectionHdr = GetEnclosingSectionHeader( rva, pNTHeader );
   if ( !pSectionHdr )
      return 0;

   delta = (INT)(pSectionHdr->VirtualAddress-pSectionHdr->PointerToRawData);
   return (PVOID) ( imageBase + rva - delta );
}

int _tmain(int argc, _TCHAR* argv[])
{
    ULONG rc;

    STARTUPINFO StartupInfo;
    PROCESS_INFORMATION ProcessInfo;

    memset(&StartupInfo, 0, sizeof(StartupInfo));
    StartupInfo.cb = sizeof(STARTUPINFO);
    StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow = SW_HIDE;

    if (!CreateProcess( NULL, "c:\\windows\\system32\\notepad.exe", NULL, NULL, FALSE,
        CREATE_NEW_CONSOLE, 
        NULL, 
        NULL,
        &StartupInfo,
        &ProcessInfo))
    {
        return 0;      
    }

    WaitForSingleObject(ProcessInfo.hProcess, 5000);
    if(!GetExitCodeProcess(ProcessInfo.hProcess, &rc))
        rc = 0;

    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);

    MapRemoteModule(ProcessInfo.dwProcessId, ID_LOADER_DLL);

   return 0;
}
//Mapping.cpp:定义控制台应用程序的入口点。
//
#包括“stdafx.h”
#包括“resource.h”
#包括
#包括
#包括
#包括
使用名称空间std;
#pragma注释(lib,“shlwapi.lib”)
#定义ID\u加载程序\u DLL MAKEINTRESOURCE(IDR\u DLL1)
#定义图像\u目录\u条目\u导入1
#定义图像\u目录\u条目\u BASERELOC 5
#定义MakePtr(cast,ptr,addValue)(cast)((DWORD_ptr)(ptr)+(DWORD_ptr)(addValue))
#定义MakeDelta(cast,x,y)(cast)((DWORD_PTR)(x)-(DWORD_PTR)(y))
布尔MapRemoteModule(无符号长pId,LPCSTR重新命名);
无符号长getProcessIDyname(char*);
HMODULE GetRemoteModuleHandle(无符号长,字符*);
FARPROC GetRemoteProcAddress(无符号长,字符*,字符*);
bool FixImports(无符号长、无效*、图像\u NT\u标题*、图像\u导入\u描述符*);
bool FixRelocs(void*、void*、图像头*、图像基重定位*、无符号整数);
布尔映射节(句柄、void*、void*、图像标题*);
PIMAGE_SECTION_HEADER GetEnclosuringSECTIONHEADER(DWORD、PIMAGE_NT_HEADER);
LPVOID GetPtrFromRVA(DWORD、PIMAGE\u NT\u头、PBYTE);
__declspec(裸)空DllCall_存根(HMODULE hMod)
{
_asm
{
推0
推1
按[esp+0Ch]
mov-eax,0xDEADBEEF
呼叫eax
ret
}
}
__declspec(裸)void DC_stubend(void){}
布尔MapRemoteModule(无符号长pId,LPCSTR重新命名)
{
图像_DOS_头*dosHd;
图像\u NT\u标题*ntHd;
HRSRC-hResource;
HGLOBAL-hresourceload;
LPBYTE-lpBuffer;
hResource=FindResource(NULL,ResName,RT_RCDATA);
if(NULL!=hResource)
{ 
hResourceLoaded=LoadResource(NULL,hResource);
如果(NULL!=hResourceLoaded)
{ 
lpBuffer=(LPBYTE)锁资源(hResourceLoaded);
if(NULL!=lpBuffer)
{        
无符号整数fSize=0;
fSize=SizeofResource(NULL,hResource);
如果(fSize>0)
{
无符号字符*dllBin=lpBuffer;
无符号整数n字节=fSize;
dosHd=MakePtr(图像头*,dllBin,0);
如果(dosHd->e_magic!=图像\u DOS\u签名)
{
删除dllBin;
返回false;
}
ntHd=MakePtr(图像头*,dllBin,dosHd->e\u lfanew);
如果(第n个->签名!=图像\u NT\u签名)
{
删除dllBin;
返回false;
}
HANDLE hProcess=OpenProcess(PROCESS\u ALL\u ACCESS,FALSE,pId);
如果(!hProcess)
返回false;
void*moduleBase=VirtualAllocEx(hProcess,
无效的
ntHd->OptionalHeader.SizeOfImage,
记住承诺,记住保留,
页面(执行、读写);
if(!moduleBase)
返回false;
void*stubBase=VirtualAllocEx(hProcess,
无效的
MakedDelta(尺寸、DC存根、DllCall存根),
记住承诺,记住保留,
页面(执行、读写);
如果(!stubBase)
返回false;
图像导入描述符*impDesc=(图像导入描述符*)GetPtrFromRVA(
(DWORD)(ntHd->OptionalHeader.DataDirectory[IMAGE\u DIRECTORY\u ENTRY\u IMPORT].VirtualAddress),
第n天,
(PBYTE)dllBin);
if(ntHd->OptionalHeader.DataDirectory[IMAGE\u DIRECTORY\u ENTRY\u IMPORT].Size)
{
如果(!FixImports(pId,
(未签名字符*)dllBin,
第n天,
impDesc)返回FALSE;
};
IMAGE\u BASE\u RELOCATION*reloc=(IMAGE\u BASE\u RELOCATION*)GetPtrFromRVA(
(DWORD)(ntHd->OptionalHeader.DataDirectory[IMAGE\u DIRECTORY\u ENTRY\u BASERELOC].VirtualAddress),
第n天,
(PBYTE)dllBin);
if(ntHd->OptionalHeader.DataDirectory[IMAGE\u DIRECTORY\u ENTRY\u BASERELOC].Size)
{
FixRelocs(dllBin,
模块基,
第n天,
雷洛克,
ntHd->OptionalHeader.DataDirectory[IMAGE\u DIRECTORY\u ENTRY\u BASERELOC].Size);
}
其他的
{
返回false;
};
WriteProcessMemory(hProcess,
模块基,
德尔宾,
ntHd->FileHeader.SizeOfOptionalHeader+sizeof(ntHd->FileHeader)+sizeof(ntHd->Signature),
(大小*)&N字节);
映射部分(HPProcess、moduleBase、dllBin、ntHd);
虚拟保护((LPVOID)DllCall_存根,
MakedDelta(尺寸、DC存根、DllCall存根),
页面_执行_读写,
(DWORD*)和N字节);
*MakePtr(无符号长*,DllCall_存根,9)=
MakePtr(无符号长,模块基,第n个->可选标头。入口点地址);
WriteProcessMemory(hProcess,
斯塔贝斯,
(LPVOID)DllCall_存根,
MakedDelta(尺寸、DC存根、DllCall存根),
(大小*)&N字节);
CreateRemoteThread(HPProcess,
无效的
0,
(LPTHREAD_START_例程)stubBase,
模块基,
0,
无效);
删除dllBin;
返回true;
}
}
}
}
返回false;
}
bool映射节(句柄hProcess、void*moduleBase、void*dllBin、图像头*ntHd)
{
图像\u节\u头*头=图像\u第一节(ntHd);
无符号整数n字节=0;
无符号int-virtualSize=0;
无符号整数n=0;
对于(unsigned int i=0;ntHd->FileHeader.NumberOfSections;i++)
{
如果(n字节>=nTD->OptionalHeader.SizeOfImage)
打破
WriteProcessMemory(hProcess,
MakePtr(LPVOID、moduleBase、header->VirtualAddress),
MakePtr(LPCVOID、dllBin、header->pointer或wdata),
标题->SizeOfRawData,
(德沃德港)及北区;
virtualSize=标题->VirtualAddress;
header++;
virtualSize=标题->VirtualAddress-virtualSize;
n字节+=虚拟化;
VirtualProtectEx(hProcess,
MakePtr(LPVOID,