From 48f97a29deb67ccf38a79efa60a7f4c97fc7aaad Mon Sep 17 00:00:00 2001 From: Xjun <812054707@qq.com> Date: Thu, 8 Feb 2018 23:51:33 +0800 Subject: [PATCH] Initial commit --- .gitattributes | 2 + Example.sln | 38 + Example.v12.suo | Bin 0 -> 33280 bytes Example.vcxproj | 163 ++++ Example.vcxproj.filters | 42 + MemoryModulePP.c | 1344 +++++++++++++++++++++++++++ MemoryModulePP.h | 181 ++++ Release/TargetDll_x64.dll | Bin 0 -> 81408 bytes Release/TargetDll_x86.dll | Bin 0 -> 69632 bytes Resource.aps | Bin 0 -> 153288 bytes Resource.rc | Bin 0 -> 3406 bytes TargetDll/TargetDll.vcxproj | 161 ++++ TargetDll/TargetDll.vcxproj.filters | 22 + TargetDll/dllmain.cpp | 38 + main.cpp | 45 + resource.h | Bin 0 -> 958 bytes 16 files changed, 2036 insertions(+) create mode 100644 .gitattributes create mode 100644 Example.sln create mode 100644 Example.v12.suo create mode 100644 Example.vcxproj create mode 100644 Example.vcxproj.filters create mode 100644 MemoryModulePP.c create mode 100644 MemoryModulePP.h create mode 100644 Release/TargetDll_x64.dll create mode 100644 Release/TargetDll_x86.dll create mode 100644 Resource.aps create mode 100644 Resource.rc create mode 100644 TargetDll/TargetDll.vcxproj create mode 100644 TargetDll/TargetDll.vcxproj.filters create mode 100644 TargetDll/dllmain.cpp create mode 100644 main.cpp create mode 100644 resource.h diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/Example.sln b/Example.sln new file mode 100644 index 0000000..74fcfb9 --- /dev/null +++ b/Example.sln @@ -0,0 +1,38 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Example", "Example.vcxproj", "{1E64CFDA-45B1-4A7B-A458-EB308A96DB92}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TargetDll", "TargetDll\TargetDll.vcxproj", "{34EF36DC-75BA-4FF2-83B1-A17E0DF448C1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1E64CFDA-45B1-4A7B-A458-EB308A96DB92}.Debug|Win32.ActiveCfg = Debug|Win32 + {1E64CFDA-45B1-4A7B-A458-EB308A96DB92}.Debug|Win32.Build.0 = Debug|Win32 + {1E64CFDA-45B1-4A7B-A458-EB308A96DB92}.Debug|x64.ActiveCfg = Debug|x64 + {1E64CFDA-45B1-4A7B-A458-EB308A96DB92}.Debug|x64.Build.0 = Debug|x64 + {1E64CFDA-45B1-4A7B-A458-EB308A96DB92}.Release|Win32.ActiveCfg = Release|Win32 + {1E64CFDA-45B1-4A7B-A458-EB308A96DB92}.Release|Win32.Build.0 = Release|Win32 + {1E64CFDA-45B1-4A7B-A458-EB308A96DB92}.Release|x64.ActiveCfg = Release|x64 + {1E64CFDA-45B1-4A7B-A458-EB308A96DB92}.Release|x64.Build.0 = Release|x64 + {34EF36DC-75BA-4FF2-83B1-A17E0DF448C1}.Debug|Win32.ActiveCfg = Release|Win32 + {34EF36DC-75BA-4FF2-83B1-A17E0DF448C1}.Debug|Win32.Build.0 = Release|Win32 + {34EF36DC-75BA-4FF2-83B1-A17E0DF448C1}.Debug|x64.ActiveCfg = Release|x64 + {34EF36DC-75BA-4FF2-83B1-A17E0DF448C1}.Debug|x64.Build.0 = Release|x64 + {34EF36DC-75BA-4FF2-83B1-A17E0DF448C1}.Release|Win32.ActiveCfg = Release|Win32 + {34EF36DC-75BA-4FF2-83B1-A17E0DF448C1}.Release|Win32.Build.0 = Release|Win32 + {34EF36DC-75BA-4FF2-83B1-A17E0DF448C1}.Release|x64.ActiveCfg = Release|x64 + {34EF36DC-75BA-4FF2-83B1-A17E0DF448C1}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Example.v12.suo b/Example.v12.suo new file mode 100644 index 0000000000000000000000000000000000000000..d96c11f22ebf93eed86ba0a9fe43e3b068a919d2 GIT binary patch literal 33280 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 literal 0 HcmV?d00001 diff --git a/Example.vcxproj b/Example.vcxproj new file mode 100644 index 0000000..c3659c5 --- /dev/null +++ b/Example.vcxproj @@ -0,0 +1,163 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {1E64CFDA-45B1-4A7B-A458-EB308A96DB92} + Win32Proj + Example + + + + Application + true + v120 + Unicode + + + Application + true + v120 + Unicode + + + Application + false + v120 + true + Unicode + + + Application + false + v120 + true + Unicode + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Console + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + MultiThreaded + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + MultiThreaded + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Example.vcxproj.filters b/Example.vcxproj.filters new file mode 100644 index 0000000..c00c84d --- /dev/null +++ b/Example.vcxproj.filters @@ -0,0 +1,42 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + 源文件 + + + + + 头文件 + + + 头文件 + + + + + 资源文件 + + + + + + + \ No newline at end of file diff --git a/MemoryModulePP.c b/MemoryModulePP.c new file mode 100644 index 0000000..a79a90e --- /dev/null +++ b/MemoryModulePP.c @@ -0,0 +1,1344 @@ +/* + * modify by xjun + */ + +/* + +WIN7 x86 and x64 (Build 7601) + +int __stdcall RtlInsertInvertedFunctionTable(PVOID Pointer, PVOID BaseAddress, ULONG uImageSize) +Pointer == LdrpInvertedFunctionTable; + +89 48 04 89 01 A3 ?? ?? ?? ?? FF 76 20 + +.text:7DEBA8E6 89 48 04 mov [eax+4], ecx +.text:7DEBA8E9 89 01 mov [ecx], eax +.text:7DEBA8EB A3 18 02 F7 7D mov dword_7DF70218, eax +.text:7DEBA8F0 FF 76 20 push dword ptr [esi+20h] ; int +.text:7DEBA8F3 FF 76 18 push dword ptr [esi+18h] ; BaseAddress +.text:7DEBA8F6 68 00 22 F7 7D push offset _LdrpInvertedFunctionTable ; Pointer +.text:7DEBA8FB E8 B2 5B FF FF call _RtlInsertInvertedFunctionTable@12 ; RtlInsertInvertedFunctionTable(x,x,x) + +///////////////////////////////////////////////////////////////////////////////////////////////////////// + +WIN8 x86 and x64 (Build 9600) +int __fastcall RtlInsertInvertedFunctionTable(PVOID BaseAddress, ULONG uImageSize) + +33 FF 8B 56 20 8B CB E8 + +.text:6B2D7980 33 FF xor edi, edi +.text:6B2D7982 +.text:6B2D7982 loc_6B2D7982: ; CODE XREF: LdrpProcessMappedModule(x,x)+160j +.text:6B2D7982 ; LdrpProcessMappedModule(x,x)+169j ... +.text:6B2D7982 8B 56 20 mov edx, [esi+20h] ; uImageSize +.text:6B2D7985 8B CB mov ecx, ebx ; BaseAddress +.text:6B2D7987 E8 45 0A 00 00 call _RtlInsertInvertedFunctionTable@8 ; RtlInsertInvertedFunctionTable(x,x) + +///////////////////////////////////////////////////////////////////////////////////////////////////////// + +WIN10 x86 and x64 (Build 16299) +int __fastcall RtlInsertInvertedFunctionTable(PVOID BaseAddress, ULONG uImageSize) + +8B 85 D4 FE FF FF 8B 70 50 8B D6 8B CB E8 + +.text:4B327344 8B 85 D4 FE FF FF mov eax, [ebp+var_12C] +.text:4B32734A 8B 70 50 mov esi, [eax+50h] +.text:4B32734D 8B D6 mov edx, esi +.text:4B32734F 8B CB mov ecx, ebx +.text:4B327351 E8 42 7A FB FF call _RtlInsertInvertedFunctionTable@8 ; RtlInsertInvertedFunctionTable(x,x) + + +WIN10 x86 and x64 (Build 15036) +int __fastcall RtlInsertInvertedFunctionTable(PVOID BaseAddress, ULONG uImageSize) + +8B 45 F8 8B CE 8B 40 50 8B D0 89 45 F0 E8 + +.text:4B32DFEC 8B 45 F8 mov eax, [ebp+var_8] +.text:4B32DFEF 8B CE mov ecx, esi +.text:4B32DFF1 8B 40 50 mov eax, [eax+50h] +.text:4B32DFF4 8B D0 mov edx, eax +.text:4B32DFF6 89 45 F0 mov [ebp+var_10], eax +.text:4B32DFF9 E8 3E 2E FA FF call _RtlInsertInvertedFunctionTable@8 ; RtlInsertInvertedFunctionTable(x,x) + + +WIN10 x86 and x64 (Build 10240) +int __fastcall RtlInsertInvertedFunctionTable(PVOID BaseAddress, ULONG uImageSize) + +8B 85 18 FF FF FF 8B 70 50 8B D6 8B 8D 34 FF FF FF E8 + +.text:4B31E0CB 8B 85 18 FF FF FF mov eax, [ebp+var_E8] +.text:4B31E0D1 8B 70 50 mov esi, [eax+50h] +.text:4B31E0D4 8B D6 mov edx, esi +.text:4B31E0D6 8B 8D 34 FF FF FF mov ecx, [ebp+BaseAddress] +.text:4B31E0DC E8 E9 50 F9 FF call _RtlInsertInvertedFunctionTable@8 ; RtlInsertInvertedFunctionTable(x,x) + +*/ + + +#include +#include +#include +#include +#include +#ifdef DEBUG_OUTPUT +#include +#endif + +#if _MSC_VER +// Disable warning about data -> function pointer conversion +#pragma warning(disable:4055) + // C4244: conversion from 'uintptr_t' to 'DWORD', possible loss of data. +#pragma warning(error: 4244) +// C4267: conversion from 'size_t' to 'int', possible loss of data. +#pragma warning(error: 4267) + +#define inline __inline +#endif + +#ifndef IMAGE_SIZEOF_BASE_RELOCATION +// Vista SDKs no longer define IMAGE_SIZEOF_BASE_RELOCATION!? +#define IMAGE_SIZEOF_BASE_RELOCATION (sizeof(IMAGE_BASE_RELOCATION)) +#endif + +#ifdef _WIN64 +#define HOST_MACHINE IMAGE_FILE_MACHINE_AMD64 +#else +#define HOST_MACHINE IMAGE_FILE_MACHINE_I386 +#endif + +#include "MemoryModulePP.h" + +ULONG dwMajorVersion = 0; +ULONG dwMinorVersion = 0; +ULONG dwBuildNumber = 0; + +PVOID LdrpInvertedFunctionTable = NULL; +typedef int(__stdcall* fnRtlInsertInvertedFunctionTable_Win7)(PVOID Pointer, PVOID BaseAddress, ULONG uImageSize); +fnRtlInsertInvertedFunctionTable_Win7 pfnRtlInsertInvertedFunctionTable_Win7 = NULL; + +typedef int(__fastcall* fnRtlInsertInvertedFunctionTable_Win8_Win10)(PVOID BaseAddress, ULONG uImageSize); +fnRtlInsertInvertedFunctionTable_Win8_Win10 pfnRtlInsertInvertedFunctionTable_Win8_Win10 = NULL; + +typedef BOOLEAN(__cdecl* fnRtlAddFunctionTable64)(PVOID FunctionTable,DWORD EntryCount,DWORD64 BaseAddress); +fnRtlAddFunctionTable64 pfnRtlAddFunctionTable64 = NULL; + +static inline LONG +FindPattern(unsigned char* pSrc, unsigned char* pTrait, int nSrcLen, int nTraitLen) +{ + if (IsBadReadPtr(pSrc, sizeof(void*)) == TRUE) + { + return -1; + } + int i, j, k; + for (i = 0; i <= (nSrcLen - nTraitLen); i++) + { + if (pSrc[i] == pTrait[0]) + { + k = i; + j = 0; + while (j < nTraitLen) + { + k++; j++; + if (pTrait[j] == 0x90) + { + continue; + } + if (pSrc[k] != pTrait[j]) + { + break; + } + } + + if (j == nTraitLen) + { + return i; + } + + } + + } + return -1; +} + +static inline uintptr_t +AlignValueDown(uintptr_t value, uintptr_t alignment) { + return value & ~(alignment - 1); +} + +static inline LPVOID +AlignAddressDown(LPVOID address, uintptr_t alignment) { + return (LPVOID) AlignValueDown((uintptr_t) address, alignment); +} + +static inline size_t +AlignValueUp(size_t value, size_t alignment) { + return (value + alignment - 1) & ~(alignment - 1); +} + +static inline void* +OffsetPointer(void* data, ptrdiff_t offset) { + return (void*) ((uintptr_t) data + offset); +} + +static inline void +OutputLastError(const char *msg) +{ +#ifndef DEBUG_OUTPUT + UNREFERENCED_PARAMETER(msg); +#else + LPVOID tmp; + char *tmpmsg; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&tmp, 0, NULL); + tmpmsg = (char *)LocalAlloc(LPTR, strlen(msg) + strlen(tmp) + 3); + sprintf(tmpmsg, "%s: %s", msg, tmp); + OutputDebugString(tmpmsg); + LocalFree(tmpmsg); + LocalFree(tmp); +#endif +} + +static BOOL +CheckSize(size_t size, size_t expected) { + if (size < expected) { + SetLastError(ERROR_INVALID_DATA); + return FALSE; + } + + return TRUE; +} + +static BOOL +CopySections(const unsigned char *data, size_t size, PIMAGE_NT_HEADERS old_headers, PMEMORYMODULE module) +{ + int i, section_size; + unsigned char *codeBase = module->codeBase; + unsigned char *dest; + PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(module->headers); + for (i=0; iheaders->FileHeader.NumberOfSections; i++, section++) { + if (section->SizeOfRawData == 0) { + // section doesn't contain data in the dll itself, but may define + // uninitialized data + section_size = old_headers->OptionalHeader.SectionAlignment; + if (section_size > 0) { + dest = (unsigned char *)module->alloc(codeBase + section->VirtualAddress, + section_size, + MEM_COMMIT, + PAGE_READWRITE, + module->userdata); + if (dest == NULL) { + return FALSE; + } + + // Always use position from file to support alignments smaller + // than page size (allocation above will align to page size). + dest = codeBase + section->VirtualAddress; + // NOTE: On 64bit systems we truncate to 32bit here but expand + // again later when "PhysicalAddress" is used. + section->Misc.PhysicalAddress = (DWORD) ((uintptr_t) dest & 0xffffffff); + memset(dest, 0, section_size); + } + + // section is empty + continue; + } + + if (!CheckSize(size, section->PointerToRawData + section->SizeOfRawData)) { + return FALSE; + } + + // commit memory block and copy data from dll + dest = (unsigned char *)module->alloc(codeBase + section->VirtualAddress, + section->SizeOfRawData, + MEM_COMMIT, + PAGE_READWRITE, + module->userdata); + if (dest == NULL) { + return FALSE; + } + + // Always use position from file to support alignments smaller + // than page size (allocation above will align to page size). + dest = codeBase + section->VirtualAddress; + memcpy(dest, data + section->PointerToRawData, section->SizeOfRawData); + // NOTE: On 64bit systems we truncate to 32bit here but expand + // again later when "PhysicalAddress" is used. + section->Misc.PhysicalAddress = (DWORD) ((uintptr_t) dest & 0xffffffff); + } + + return TRUE; +} + +// Protection flags for memory pages (Executable, Readable, Writeable) +static int ProtectionFlags[2][2][2] = { + { + // not executable + {PAGE_NOACCESS, PAGE_WRITECOPY}, + {PAGE_READONLY, PAGE_READWRITE}, + }, { + // executable + {PAGE_EXECUTE, PAGE_EXECUTE_WRITECOPY}, + {PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE}, + }, +}; + +static SIZE_T +GetRealSectionSize(PMEMORYMODULE module, PIMAGE_SECTION_HEADER section) { + DWORD size = section->SizeOfRawData; + if (size == 0) { + if (section->Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) { + size = module->headers->OptionalHeader.SizeOfInitializedData; + } else if (section->Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) { + size = module->headers->OptionalHeader.SizeOfUninitializedData; + } + } + return (SIZE_T) size; +} + +static BOOL +FinalizeSection(PMEMORYMODULE module, PSECTIONFINALIZEDATA sectionData) { + DWORD protect, oldProtect; + BOOL executable; + BOOL readable; + BOOL writeable; + + if (sectionData->size == 0) { + return TRUE; + } + + if (sectionData->characteristics & IMAGE_SCN_MEM_DISCARDABLE) { + // section is not needed any more and can safely be freed + if (sectionData->address == sectionData->alignedAddress && + (sectionData->last || + module->headers->OptionalHeader.SectionAlignment == module->pageSize || + (sectionData->size % module->pageSize) == 0) + ) { + // Only allowed to decommit whole pages + module->free(sectionData->address, sectionData->size, MEM_DECOMMIT, module->userdata); + } + return TRUE; + } + + // determine protection flags based on characteristics + executable = (sectionData->characteristics & IMAGE_SCN_MEM_EXECUTE) != 0; + readable = (sectionData->characteristics & IMAGE_SCN_MEM_READ) != 0; + writeable = (sectionData->characteristics & IMAGE_SCN_MEM_WRITE) != 0; + protect = ProtectionFlags[executable][readable][writeable]; + if (sectionData->characteristics & IMAGE_SCN_MEM_NOT_CACHED) { + protect |= PAGE_NOCACHE; + } + + // change memory access flags + if (VirtualProtect(sectionData->address, sectionData->size, protect, &oldProtect) == 0) { + OutputLastError("Error protecting memory page"); + return FALSE; + } + + return TRUE; +} + +static BOOL +FinalizeSections(PMEMORYMODULE module) +{ + int i; + PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(module->headers); +#ifdef _WIN64 + // "PhysicalAddress" might have been truncated to 32bit above, expand to + // 64bits again. + uintptr_t imageOffset = ((uintptr_t) module->headers->OptionalHeader.ImageBase & 0xffffffff00000000); +#else + static const uintptr_t imageOffset = 0; +#endif + SECTIONFINALIZEDATA sectionData; + sectionData.address = (LPVOID)((uintptr_t)section->Misc.PhysicalAddress | imageOffset); + sectionData.alignedAddress = AlignAddressDown(sectionData.address, module->pageSize); + sectionData.size = GetRealSectionSize(module, section); + sectionData.characteristics = section->Characteristics; + sectionData.last = FALSE; + section++; + + // loop through all sections and change access flags + for (i=1; iheaders->FileHeader.NumberOfSections; i++, section++) { + LPVOID sectionAddress = (LPVOID)((uintptr_t)section->Misc.PhysicalAddress | imageOffset); + LPVOID alignedAddress = AlignAddressDown(sectionAddress, module->pageSize); + SIZE_T sectionSize = GetRealSectionSize(module, section); + // Combine access flags of all sections that share a page + // TODO(fancycode): We currently share flags of a trailing large section + // with the page of a first small section. This should be optimized. + if (sectionData.alignedAddress == alignedAddress || (uintptr_t) sectionData.address + sectionData.size > (uintptr_t) alignedAddress) { + // Section shares page with previous + if ((section->Characteristics & IMAGE_SCN_MEM_DISCARDABLE) == 0 || (sectionData.characteristics & IMAGE_SCN_MEM_DISCARDABLE) == 0) { + sectionData.characteristics = (sectionData.characteristics | section->Characteristics) & ~IMAGE_SCN_MEM_DISCARDABLE; + } else { + sectionData.characteristics |= section->Characteristics; + } + sectionData.size = (((uintptr_t)sectionAddress) + ((uintptr_t) sectionSize)) - (uintptr_t) sectionData.address; + continue; + } + + if (!FinalizeSection(module, §ionData)) { + return FALSE; + } + sectionData.address = sectionAddress; + sectionData.alignedAddress = alignedAddress; + sectionData.size = sectionSize; + sectionData.characteristics = section->Characteristics; + } + sectionData.last = TRUE; + if (!FinalizeSection(module, §ionData)) { + return FALSE; + } + return TRUE; +} + +static BOOL +ExecuteTLS(PMEMORYMODULE module) +{ + unsigned char *codeBase = module->codeBase; + PIMAGE_TLS_DIRECTORY tls; + PIMAGE_TLS_CALLBACK* callback; + + PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_TLS); + if (directory->VirtualAddress == 0) { + return TRUE; + } + + tls = (PIMAGE_TLS_DIRECTORY) (codeBase + directory->VirtualAddress); + callback = (PIMAGE_TLS_CALLBACK *) tls->AddressOfCallBacks; + if (callback) { + while (*callback) { + (*callback)((LPVOID) codeBase, DLL_PROCESS_ATTACH, NULL); + callback++; + } + } + return TRUE; +} + +static BOOL +PerformBaseRelocation(PMEMORYMODULE module, ptrdiff_t delta) +{ + unsigned char *codeBase = module->codeBase; + PIMAGE_BASE_RELOCATION relocation; + + PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_BASERELOC); + if (directory->Size == 0) { + return (delta == 0); + } + + relocation = (PIMAGE_BASE_RELOCATION) (codeBase + directory->VirtualAddress); + for (; relocation->VirtualAddress > 0; ) { + DWORD i; + unsigned char *dest = codeBase + relocation->VirtualAddress; + unsigned short *relInfo = (unsigned short*) OffsetPointer(relocation, IMAGE_SIZEOF_BASE_RELOCATION); + for (i=0; i<((relocation->SizeOfBlock-IMAGE_SIZEOF_BASE_RELOCATION) / 2); i++, relInfo++) { + // the upper 4 bits define the type of relocation + int type = *relInfo >> 12; + // the lower 12 bits define the offset + int offset = *relInfo & 0xfff; + + switch (type) + { + case IMAGE_REL_BASED_ABSOLUTE: + // skip relocation + break; + + case IMAGE_REL_BASED_HIGHLOW: + // change complete 32 bit address + { + DWORD *patchAddrHL = (DWORD *) (dest + offset); + *patchAddrHL += (DWORD) delta; + } + break; + +#ifdef _WIN64 + case IMAGE_REL_BASED_DIR64: + { + ULONGLONG *patchAddr64 = (ULONGLONG *) (dest + offset); + *patchAddr64 += (ULONGLONG) delta; + } + break; +#endif + + default: + //printf("Unknown relocation: %d\n", type); + break; + } + } + + // advance to next relocation block + relocation = (PIMAGE_BASE_RELOCATION) OffsetPointer(relocation, relocation->SizeOfBlock); + } + return TRUE; +} + +static BOOL +BuildImportTable(PMEMORYMODULE module) +{ + unsigned char *codeBase = module->codeBase; + PIMAGE_IMPORT_DESCRIPTOR importDesc; + BOOL result = TRUE; + + PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_IMPORT); + if (directory->Size == 0) { + return TRUE; + } + + importDesc = (PIMAGE_IMPORT_DESCRIPTOR) (codeBase + directory->VirtualAddress); + for (; !IsBadReadPtr(importDesc, sizeof(IMAGE_IMPORT_DESCRIPTOR)) && importDesc->Name; importDesc++) { + uintptr_t *thunkRef; + FARPROC *funcRef; + HCUSTOMMODULE *tmp; + HCUSTOMMODULE handle = module->loadLibrary((LPCSTR) (codeBase + importDesc->Name), module->userdata); + if (handle == NULL) { + SetLastError(ERROR_MOD_NOT_FOUND); + result = FALSE; + break; + } + + tmp = (HCUSTOMMODULE *) realloc(module->modules, (module->numModules+1)*(sizeof(HCUSTOMMODULE))); + if (tmp == NULL) { + module->freeLibrary(handle, module->userdata); + SetLastError(ERROR_OUTOFMEMORY); + result = FALSE; + break; + } + module->modules = tmp; + + module->modules[module->numModules++] = handle; + if (importDesc->OriginalFirstThunk) { + thunkRef = (uintptr_t *) (codeBase + importDesc->OriginalFirstThunk); + funcRef = (FARPROC *) (codeBase + importDesc->FirstThunk); + } else { + // no hint table + thunkRef = (uintptr_t *) (codeBase + importDesc->FirstThunk); + funcRef = (FARPROC *) (codeBase + importDesc->FirstThunk); + } + for (; *thunkRef; thunkRef++, funcRef++) { + if (IMAGE_SNAP_BY_ORDINAL(*thunkRef)) { + *funcRef = module->getProcAddress(handle, (LPCSTR)IMAGE_ORDINAL(*thunkRef), module->userdata); + } else { + PIMAGE_IMPORT_BY_NAME thunkData = (PIMAGE_IMPORT_BY_NAME) (codeBase + (*thunkRef)); + *funcRef = module->getProcAddress(handle, (LPCSTR)&thunkData->Name, module->userdata); + } + if (*funcRef == 0) { + result = FALSE; + break; + } + } + + if (!result) { + module->freeLibrary(handle, module->userdata); + SetLastError(ERROR_PROC_NOT_FOUND); + break; + } + } + + return result; +} + +static VOID +InsertExceptionTable(PMEMORYMODULE module) +{ +#if defined(_WIN64) + + PIMAGE_DATA_DIRECTORY pDataTable = \ + &module->headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION]; + + PIMAGE_RUNTIME_FUNCTION_ENTRY pFuncTable = \ + (PIMAGE_RUNTIME_FUNCTION_ENTRY)((ULONG_PTR)module->codeBase + pDataTable->VirtualAddress); + + + if (pfnRtlAddFunctionTable64 != NULL) + { + pfnRtlAddFunctionTable64(pFuncTable, pDataTable->Size / sizeof(IMAGE_RUNTIME_FUNCTION_ENTRY), (DWORD64)module->codeBase); + } + +#else + if (dwMajorVersion == 6 && dwMinorVersion == 1) //WIM7 + { + if (pfnRtlInsertInvertedFunctionTable_Win7 != NULL); + { + pfnRtlInsertInvertedFunctionTable_Win7(LdrpInvertedFunctionTable, module->codeBase, module->headers->OptionalHeader.SizeOfImage); + } + } + else if (dwMajorVersion == 6 && dwMinorVersion == 3) //WIN8 + { + if (pfnRtlInsertInvertedFunctionTable_Win8_Win10 != NULL); + { + + } + } + else if (dwMajorVersion == 10 && dwMinorVersion == 0) //WIN10 + { + if (pfnRtlInsertInvertedFunctionTable_Win8_Win10 != NULL); + { + + } + } + else + { + // not support + } +#endif +} + +static VOID +InitFindExceptPrivateFunc() +{ + PVOID pNtdllCode; + ULONG uNtdllCodeSize; + + PIMAGE_DOS_HEADER pDosHead; + PIMAGE_NT_HEADERS pNtHead; + PIMAGE_SECTION_HEADER pSection; + + pDosHead = (PIMAGE_DOS_HEADER)GetModuleHandle(TEXT("ntdll")); + if (pDosHead->e_magic != IMAGE_DOS_SIGNATURE) + { + return; + } + pNtHead = (PIMAGE_NT_HEADERS)((ULONG_PTR)pDosHead + pDosHead->e_lfanew); + if (pNtHead->Signature != IMAGE_NT_SIGNATURE) + { + return; + } + + pSection = IMAGE_FIRST_SECTION(pNtHead); + + for (int i = 0; i < pNtHead->FileHeader.NumberOfSections; i++) + { + if (stricmp(pSection->Name, ".text") == 0 && + (pSection->Characteristics & IMAGE_SCN_MEM_EXECUTE)) + { + break; + } + pSection++; + } + + pNtdllCode = (PVOID)((ULONG_PTR)pDosHead + pSection->VirtualAddress); + uNtdllCodeSize = pSection->SizeOfRawData; + + if (dwMajorVersion == 6 && dwMinorVersion == 1) //WIM7 + { + LONG lResult; + LONG lCallBuf; + unsigned char ida_chars[] = { + 0x89, 0x48, 0x04, 0x89, 0x01, 0xA3, 0x90, 0x90, 0x90, + 0x90, 0xFF, 0x76, 0x20 + }; + + lResult = FindPattern(pNtdllCode, ida_chars, uNtdllCodeSize, sizeof(ida_chars)); + if (lResult != -1) + { + LdrpInvertedFunctionTable = (PVOID)(*(LONG*)((ULONG_PTR)pNtdllCode + lResult + 0x11)); + + lCallBuf = *(LONG*)((ULONG_PTR)pNtdllCode + lResult + 0x16); + + pfnRtlInsertInvertedFunctionTable_Win7 = (fnRtlInsertInvertedFunctionTable_Win7)((ULONG_PTR)pNtdllCode + lResult + 0x15 + 0x5 + lCallBuf); + + } + + + } + else if (dwMajorVersion == 6 && dwMinorVersion == 3) //WIN8 + { + + } + else if (dwMajorVersion == 10 && dwMinorVersion == 0) //WIN10 + { + + } + else + { + // not support + } + +} + +LPVOID MemoryDefaultAlloc(LPVOID address, SIZE_T size, DWORD allocationType, DWORD protect, void* userdata) +{ + UNREFERENCED_PARAMETER(userdata); + return VirtualAlloc(address, size, allocationType, protect); +} + +BOOL MemoryDefaultFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType, void* userdata) +{ + UNREFERENCED_PARAMETER(userdata); + return VirtualFree(lpAddress, dwSize, dwFreeType); +} + +HCUSTOMMODULE MemoryDefaultLoadLibrary(LPCSTR filename, void *userdata) +{ + HMODULE result; + UNREFERENCED_PARAMETER(userdata); + result = LoadLibraryA(filename); + if (result == NULL) { + return NULL; + } + + return (HCUSTOMMODULE) result; +} + +FARPROC MemoryDefaultGetProcAddress(HCUSTOMMODULE module, LPCSTR name, void *userdata) +{ + UNREFERENCED_PARAMETER(userdata); + return (FARPROC) GetProcAddress((HMODULE) module, name); +} + +void MemoryDefaultFreeLibrary(HCUSTOMMODULE module, void *userdata) +{ + UNREFERENCED_PARAMETER(userdata); + FreeLibrary((HMODULE) module); +} + +PMEMORYMODULE MemoryLoadLibrary(const void *data, size_t size) +{ + return MemoryLoadLibraryEx(data, size, MemoryDefaultAlloc, MemoryDefaultFree, MemoryDefaultLoadLibrary, MemoryDefaultGetProcAddress, MemoryDefaultFreeLibrary, NULL); +} + +PMEMORYMODULE MemoryLoadLibraryEx(const void *data, size_t size, + CustomAllocFunc allocMemory, + CustomFreeFunc freeMemory, + CustomLoadLibraryFunc loadLibrary, + CustomGetProcAddressFunc getProcAddress, + CustomFreeLibraryFunc freeLibrary, + void *userdata) +{ + PMEMORYMODULE result = NULL; + PIMAGE_DOS_HEADER dos_header; + PIMAGE_NT_HEADERS old_header; + unsigned char *code, *headers; + ptrdiff_t locationDelta; + SYSTEM_INFO sysInfo; + PIMAGE_SECTION_HEADER section; + DWORD i; + size_t optionalSectionSize; + size_t lastSectionEnd = 0; + size_t alignedImageSize; + + static BOOL g_bInit = FALSE; + if (_InterlockedCompareExchange((LONG*)&g_bInit,TRUE,FALSE) == FALSE) + { +#if defined(_WIN64) + pfnRtlAddFunctionTable64 = (fnRtlAddFunctionTable64)GetProcAddress(GetModuleHandle(TEXT("ntdll")), "RtlAddFunctionTable"); +#else + RTL_OSVERSIONINFOW osinfo = { 0 }; + typedef LONG(__stdcall *fnRtlGetVersion)(PRTL_OSVERSIONINFOW lpVersionInformation); + fnRtlGetVersion pfnRtlGetVersion = (fnRtlGetVersion)GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "RtlGetVersion"); + if (pfnRtlGetVersion != NULL && pfnRtlGetVersion(&osinfo) == 0) + { + dwMajorVersion = osinfo.dwMajorVersion; + dwMinorVersion = osinfo.dwMinorVersion; + dwBuildNumber = osinfo.dwBuildNumber; + InitFindExceptPrivateFunc(); + } + +#endif + } + + if (!CheckSize(size, sizeof(IMAGE_DOS_HEADER))) { + return NULL; + } + dos_header = (PIMAGE_DOS_HEADER)data; + if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) { + SetLastError(ERROR_BAD_EXE_FORMAT); + return NULL; + } + + if (!CheckSize(size, dos_header->e_lfanew + sizeof(IMAGE_NT_HEADERS))) { + return NULL; + } + old_header = (PIMAGE_NT_HEADERS)&((const unsigned char *)(data))[dos_header->e_lfanew]; + if (old_header->Signature != IMAGE_NT_SIGNATURE) { + SetLastError(ERROR_BAD_EXE_FORMAT); + return NULL; + } + + if (old_header->FileHeader.Machine != HOST_MACHINE) { + SetLastError(ERROR_BAD_EXE_FORMAT); + return NULL; + } + + if (old_header->OptionalHeader.SectionAlignment & 1) { + // Only support section alignments that are a multiple of 2 + SetLastError(ERROR_BAD_EXE_FORMAT); + return NULL; + } + + section = IMAGE_FIRST_SECTION(old_header); + optionalSectionSize = old_header->OptionalHeader.SectionAlignment; + for (i=0; iFileHeader.NumberOfSections; i++, section++) { + size_t endOfSection; + if (section->SizeOfRawData == 0) { + // Section without data in the DLL + endOfSection = section->VirtualAddress + optionalSectionSize; + } else { + endOfSection = section->VirtualAddress + section->SizeOfRawData; + } + + if (endOfSection > lastSectionEnd) { + lastSectionEnd = endOfSection; + } + } + + GetNativeSystemInfo(&sysInfo); + alignedImageSize = AlignValueUp(old_header->OptionalHeader.SizeOfImage, sysInfo.dwPageSize); + if (alignedImageSize != AlignValueUp(lastSectionEnd, sysInfo.dwPageSize)) { + SetLastError(ERROR_BAD_EXE_FORMAT); + return NULL; + } + + // reserve memory for image of library + // XXX: is it correct to commit the complete memory region at once? + // calling DllEntry raises an exception if we don't... + code = (unsigned char *)allocMemory((LPVOID)(old_header->OptionalHeader.ImageBase), + alignedImageSize, + MEM_RESERVE | MEM_COMMIT, + PAGE_READWRITE, + userdata); + + if (code == NULL) { + // try to allocate memory at arbitrary position + code = (unsigned char *)allocMemory(NULL, + alignedImageSize, + MEM_RESERVE | MEM_COMMIT, + PAGE_READWRITE, + userdata); + if (code == NULL) { + SetLastError(ERROR_OUTOFMEMORY); + return NULL; + } + } + + result = (PMEMORYMODULE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MEMORYMODULE)); + if (result == NULL) { + freeMemory(code, 0, MEM_RELEASE, userdata); + SetLastError(ERROR_OUTOFMEMORY); + return NULL; + } + + result->codeBase = code; + result->isDLL = (old_header->FileHeader.Characteristics & IMAGE_FILE_DLL) != 0; + result->alloc = allocMemory; + result->free = freeMemory; + result->loadLibrary = loadLibrary; + result->getProcAddress = getProcAddress; + result->freeLibrary = freeLibrary; + result->userdata = userdata; + result->pageSize = sysInfo.dwPageSize; + + if (!CheckSize(size, old_header->OptionalHeader.SizeOfHeaders)) { + goto error; + } + + // commit memory for headers + headers = (unsigned char *)allocMemory(code, + old_header->OptionalHeader.SizeOfHeaders, + MEM_COMMIT, + PAGE_READWRITE, + userdata); + + // copy PE header to code + memcpy(headers, dos_header, old_header->OptionalHeader.SizeOfHeaders); + result->headers = (PIMAGE_NT_HEADERS)&((const unsigned char *)(headers))[dos_header->e_lfanew]; + + // update position + result->headers->OptionalHeader.ImageBase = (uintptr_t)code; + + // copy sections from DLL file block to new memory location + if (!CopySections((const unsigned char *) data, size, old_header, result)) { + goto error; + } + + // adjust base address of imported data + locationDelta = (ptrdiff_t)(result->headers->OptionalHeader.ImageBase - old_header->OptionalHeader.ImageBase); + if (locationDelta != 0) { + //if not exist reloc table? + if (result->headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress == 0){ + goto error; + } + result->isRelocated = PerformBaseRelocation(result, locationDelta); + } else { + result->isRelocated = TRUE; + } + + // load required dlls and adjust function table of imports + if (!BuildImportTable(result)) { + goto error; + } + + // mark memory pages depending on section headers and release + // sections that are marked as "discardable" + if (!FinalizeSections(result)) { + goto error; + } + + // TLS callbacks are executed BEFORE the main loading + if (!ExecuteTLS(result)) { + goto error; + } + + // support exception + InsertExceptionTable(result); + + // get entry point of loaded library + if (result->headers->OptionalHeader.AddressOfEntryPoint != 0) { + if (result->isDLL) { + DllEntryProc DllEntry = (DllEntryProc)(LPVOID)(code + result->headers->OptionalHeader.AddressOfEntryPoint); + // notify library about attaching to process + BOOL successfull = (*DllEntry)((HINSTANCE)code, DLL_PROCESS_ATTACH, 0); + if (!successfull) { + SetLastError(ERROR_DLL_INIT_FAILED); + goto error; + } + result->initialized = TRUE; + } else { + result->exeEntry = (ExeEntryProc)(LPVOID)(code + result->headers->OptionalHeader.AddressOfEntryPoint); + } + } else { + result->exeEntry = NULL; + } + + return (PMEMORYMODULE)result; + +error: + // cleanup + MemoryFreeLibrary(result); + return NULL; +} + +static int _compare(const void *a, const void *b) +{ + const struct ExportNameEntry *p1 = (const struct ExportNameEntry*) a; + const struct ExportNameEntry *p2 = (const struct ExportNameEntry*) b; + return _stricmp(p1->name, p2->name); +} + +static int _find(const void *a, const void *b) +{ + LPCSTR *name = (LPCSTR *) a; + const struct ExportNameEntry *p = (const struct ExportNameEntry*) b; + return _stricmp(*name, p->name); +} + +FARPROC MemoryGetProcAddress(PMEMORYMODULE mod, LPCSTR name) +{ + PMEMORYMODULE module = (PMEMORYMODULE)mod; + unsigned char *codeBase = module->codeBase; + DWORD idx = 0; + PIMAGE_EXPORT_DIRECTORY exports; + PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY(module, IMAGE_DIRECTORY_ENTRY_EXPORT); + if (directory->Size == 0) { + // no export table found + SetLastError(ERROR_PROC_NOT_FOUND); + return NULL; + } + + exports = (PIMAGE_EXPORT_DIRECTORY) (codeBase + directory->VirtualAddress); + if (exports->NumberOfNames == 0 || exports->NumberOfFunctions == 0) { + // DLL doesn't export anything + SetLastError(ERROR_PROC_NOT_FOUND); + return NULL; + } + + if (HIWORD(name) == 0) { + // load function by ordinal value + if (LOWORD(name) < exports->Base) { + SetLastError(ERROR_PROC_NOT_FOUND); + return NULL; + } + + idx = LOWORD(name) - exports->Base; + } else if (!exports->NumberOfNames) { + SetLastError(ERROR_PROC_NOT_FOUND); + return NULL; + } else { + const struct ExportNameEntry *found; + + // Lazily build name table and sort it by names + if (!module->nameExportsTable) { + DWORD i; + DWORD *nameRef = (DWORD *) (codeBase + exports->AddressOfNames); + WORD *ordinal = (WORD *) (codeBase + exports->AddressOfNameOrdinals); + struct ExportNameEntry *entry = (struct ExportNameEntry*) malloc(exports->NumberOfNames * sizeof(struct ExportNameEntry)); + module->nameExportsTable = entry; + if (!entry) { + SetLastError(ERROR_OUTOFMEMORY); + return NULL; + } + for (i=0; iNumberOfNames; i++, nameRef++, ordinal++, entry++) { + entry->name = (const char *) (codeBase + (*nameRef)); + entry->idx = *ordinal; + } + qsort(module->nameExportsTable, + exports->NumberOfNames, + sizeof(struct ExportNameEntry), _compare); + } + + // search function name in list of exported names with binary search + found = (const struct ExportNameEntry*) bsearch(&name, + module->nameExportsTable, + exports->NumberOfNames, + sizeof(struct ExportNameEntry), _find); + if (!found) { + // exported symbol not found + SetLastError(ERROR_PROC_NOT_FOUND); + return NULL; + } + + idx = found->idx; + } + + if (idx > exports->NumberOfFunctions) { + // name <-> ordinal number don't match + SetLastError(ERROR_PROC_NOT_FOUND); + return NULL; + } + + // AddressOfFunctions contains the RVAs to the "real" functions + return (FARPROC)(LPVOID)(codeBase + (*(DWORD *) (codeBase + exports->AddressOfFunctions + (idx*4)))); +} + +void MemoryFreeLibrary(PMEMORYMODULE mod) +{ + PMEMORYMODULE module = (PMEMORYMODULE)mod; + + if (module == NULL) { + return; + } + if (module->initialized) { + // notify library about detaching from process + DllEntryProc DllEntry = (DllEntryProc)(LPVOID)(module->codeBase + module->headers->OptionalHeader.AddressOfEntryPoint); + (*DllEntry)((HINSTANCE)module->codeBase, DLL_PROCESS_DETACH, 0); + } + + free(module->nameExportsTable); + if (module->modules != NULL) { + // free previously opened libraries + int i; + for (i=0; inumModules; i++) { + if (module->modules[i] != NULL) { + module->freeLibrary(module->modules[i], module->userdata); + } + } + + free(module->modules); + } + + if (module->codeBase != NULL) { + // release memory of library + module->free(module->codeBase, 0, MEM_RELEASE, module->userdata); + } + + HeapFree(GetProcessHeap(), 0, module); +} + +int MemoryCallEntryPoint(PMEMORYMODULE mod) +{ + PMEMORYMODULE module = (PMEMORYMODULE)mod; + + if (module == NULL || module->isDLL || module->exeEntry == NULL || !module->isRelocated) { + return -1; + } + + return module->exeEntry(); +} + +#define DEFAULT_LANGUAGE MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL) + +HMEMORYRSRC MemoryFindResource(PMEMORYMODULE module, LPCTSTR name, LPCTSTR type) +{ + return MemoryFindResourceEx(module, name, type, DEFAULT_LANGUAGE); +} + +static PIMAGE_RESOURCE_DIRECTORY_ENTRY _MemorySearchResourceEntry( + void *root, + PIMAGE_RESOURCE_DIRECTORY resources, + LPCTSTR key) +{ + PIMAGE_RESOURCE_DIRECTORY_ENTRY entries = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) (resources + 1); + PIMAGE_RESOURCE_DIRECTORY_ENTRY result = NULL; + DWORD start; + DWORD end; + DWORD middle; + + if (!IS_INTRESOURCE(key) && key[0] == TEXT('#')) { + // special case: resource id given as string + TCHAR *endpos = NULL; + long int tmpkey = (WORD) _tcstol((TCHAR *) &key[1], &endpos, 10); + if (tmpkey <= 0xffff && lstrlen(endpos) == 0) { + key = MAKEINTRESOURCE(tmpkey); + } + } + + // entries are stored as ordered list of named entries, + // followed by an ordered list of id entries - we can do + // a binary search to find faster... + if (IS_INTRESOURCE(key)) { + WORD check = (WORD) (uintptr_t) key; + start = resources->NumberOfNamedEntries; + end = start + resources->NumberOfIdEntries; + + while (end > start) { + WORD entryName; + middle = (start + end) >> 1; + entryName = (WORD) entries[middle].Name; + if (check < entryName) { + end = (end != middle ? middle : middle-1); + } else if (check > entryName) { + start = (start != middle ? middle : middle+1); + } else { + result = &entries[middle]; + break; + } + } + } else { + LPCWSTR searchKey; + size_t searchKeyLen = _tcslen(key); +#if defined(UNICODE) + searchKey = key; +#else + // Resource names are always stored using 16bit characters, need to + // convert string we search for. +#define MAX_LOCAL_KEY_LENGTH 2048 + // In most cases resource names are short, so optimize for that by + // using a pre-allocated array. + wchar_t _searchKeySpace[MAX_LOCAL_KEY_LENGTH+1]; + LPWSTR _searchKey; + if (searchKeyLen > MAX_LOCAL_KEY_LENGTH) { + size_t _searchKeySize = (searchKeyLen + 1) * sizeof(wchar_t); + _searchKey = (LPWSTR) malloc(_searchKeySize); + if (_searchKey == NULL) { + SetLastError(ERROR_OUTOFMEMORY); + return NULL; + } + } else { + _searchKey = &_searchKeySpace[0]; + } + + mbstowcs(_searchKey, key, searchKeyLen); + _searchKey[searchKeyLen] = 0; + searchKey = _searchKey; +#endif + start = 0; + end = resources->NumberOfNamedEntries; + while (end > start) { + int cmp; + PIMAGE_RESOURCE_DIR_STRING_U resourceString; + middle = (start + end) >> 1; + resourceString = (PIMAGE_RESOURCE_DIR_STRING_U) OffsetPointer(root, entries[middle].Name & 0x7FFFFFFF); + cmp = _wcsnicmp(searchKey, resourceString->NameString, resourceString->Length); + if (cmp == 0) { + // Handle partial match + if (searchKeyLen > resourceString->Length) { + cmp = 1; + } else if (searchKeyLen < resourceString->Length) { + cmp = -1; + } + } + if (cmp < 0) { + end = (middle != end ? middle : middle-1); + } else if (cmp > 0) { + start = (middle != start ? middle : middle+1); + } else { + result = &entries[middle]; + break; + } + } +#if !defined(UNICODE) + if (searchKeyLen > MAX_LOCAL_KEY_LENGTH) { + free(_searchKey); + } +#undef MAX_LOCAL_KEY_LENGTH +#endif + } + + return result; +} + +HMEMORYRSRC MemoryFindResourceEx(PMEMORYMODULE module, LPCTSTR name, LPCTSTR type, WORD language) +{ + unsigned char *codeBase = ((PMEMORYMODULE) module)->codeBase; + PIMAGE_DATA_DIRECTORY directory = GET_HEADER_DICTIONARY((PMEMORYMODULE) module, IMAGE_DIRECTORY_ENTRY_RESOURCE); + PIMAGE_RESOURCE_DIRECTORY rootResources; + PIMAGE_RESOURCE_DIRECTORY nameResources; + PIMAGE_RESOURCE_DIRECTORY typeResources; + PIMAGE_RESOURCE_DIRECTORY_ENTRY foundType; + PIMAGE_RESOURCE_DIRECTORY_ENTRY foundName; + PIMAGE_RESOURCE_DIRECTORY_ENTRY foundLanguage; + if (directory->Size == 0) { + // no resource table found + SetLastError(ERROR_RESOURCE_DATA_NOT_FOUND); + return NULL; + } + + if (language == DEFAULT_LANGUAGE) { + // use language from current thread + language = LANGIDFROMLCID(GetThreadLocale()); + } + + // resources are stored as three-level tree + // - first node is the type + // - second node is the name + // - third node is the language + rootResources = (PIMAGE_RESOURCE_DIRECTORY) (codeBase + directory->VirtualAddress); + foundType = _MemorySearchResourceEntry(rootResources, rootResources, type); + if (foundType == NULL) { + SetLastError(ERROR_RESOURCE_TYPE_NOT_FOUND); + return NULL; + } + + typeResources = (PIMAGE_RESOURCE_DIRECTORY) (codeBase + directory->VirtualAddress + (foundType->OffsetToData & 0x7fffffff)); + foundName = _MemorySearchResourceEntry(rootResources, typeResources, name); + if (foundName == NULL) { + SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND); + return NULL; + } + + nameResources = (PIMAGE_RESOURCE_DIRECTORY) (codeBase + directory->VirtualAddress + (foundName->OffsetToData & 0x7fffffff)); + foundLanguage = _MemorySearchResourceEntry(rootResources, nameResources, (LPCTSTR) (uintptr_t) language); + if (foundLanguage == NULL) { + // requested language not found, use first available + if (nameResources->NumberOfIdEntries == 0) { + SetLastError(ERROR_RESOURCE_LANG_NOT_FOUND); + return NULL; + } + + foundLanguage = (PIMAGE_RESOURCE_DIRECTORY_ENTRY) (nameResources + 1); + } + + return (codeBase + directory->VirtualAddress + (foundLanguage->OffsetToData & 0x7fffffff)); +} + +DWORD MemorySizeofResource(PMEMORYMODULE module, HMEMORYRSRC resource) +{ + PIMAGE_RESOURCE_DATA_ENTRY entry; + UNREFERENCED_PARAMETER(module); + entry = (PIMAGE_RESOURCE_DATA_ENTRY) resource; + if (entry == NULL) { + return 0; + } + + return entry->Size; +} + +LPVOID MemoryLoadResource(PMEMORYMODULE module, HMEMORYRSRC resource) +{ + unsigned char *codeBase = ((PMEMORYMODULE) module)->codeBase; + PIMAGE_RESOURCE_DATA_ENTRY entry = (PIMAGE_RESOURCE_DATA_ENTRY) resource; + if (entry == NULL) { + return NULL; + } + + return codeBase + entry->OffsetToData; +} + +int +MemoryLoadString(PMEMORYMODULE module, UINT id, LPTSTR buffer, int maxsize) +{ + return MemoryLoadStringEx(module, id, buffer, maxsize, DEFAULT_LANGUAGE); +} + +int +MemoryLoadStringEx(PMEMORYMODULE module, UINT id, LPTSTR buffer, int maxsize, WORD language) +{ + HMEMORYRSRC resource; + PIMAGE_RESOURCE_DIR_STRING_U data; + DWORD size; + if (maxsize == 0) { + return 0; + } + + resource = MemoryFindResourceEx(module, MAKEINTRESOURCE((id >> 4) + 1), RT_STRING, language); + if (resource == NULL) { + buffer[0] = 0; + return 0; + } + + data = (PIMAGE_RESOURCE_DIR_STRING_U) MemoryLoadResource(module, resource); + id = id & 0x0f; + while (id--) { + data = (PIMAGE_RESOURCE_DIR_STRING_U) OffsetPointer(data, (data->Length + 1) * sizeof(WCHAR)); + } + if (data->Length == 0) { + SetLastError(ERROR_RESOURCE_NAME_NOT_FOUND); + buffer[0] = 0; + return 0; + } + + size = data->Length; + if (size >= (DWORD) maxsize) { + size = maxsize; + } else { + buffer[size] = 0; + } +#if defined(UNICODE) + wcsncpy(buffer, data->NameString, size); +#else + wcstombs(buffer, data->NameString, size); +#endif + return size; +} + +#ifdef TESTSUITE +#include + +#ifndef PRIxPTR +#ifdef _WIN64 +#define PRIxPTR "I64x" +#else +#define PRIxPTR "x" +#endif +#endif + +static const uintptr_t AlignValueDownTests[][3] = { + {16, 16, 16}, + {17, 16, 16}, + {32, 16, 32}, + {33, 16, 32}, +#ifdef _WIN64 + {0x12345678abcd1000, 0x1000, 0x12345678abcd1000}, + {0x12345678abcd101f, 0x1000, 0x12345678abcd1000}, +#endif + {0, 0, 0}, +}; + +static const uintptr_t AlignValueUpTests[][3] = { + {16, 16, 16}, + {17, 16, 32}, + {32, 16, 32}, + {33, 16, 48}, +#ifdef _WIN64 + {0x12345678abcd1000, 0x1000, 0x12345678abcd1000}, + {0x12345678abcd101f, 0x1000, 0x12345678abcd2000}, +#endif + {0, 0, 0}, +}; + +BOOL MemoryModuleTestsuite() { + BOOL success = TRUE; + size_t idx; + for (idx = 0; AlignValueDownTests[idx][0]; ++idx) { + const uintptr_t* tests = AlignValueDownTests[idx]; + uintptr_t value = AlignValueDown(tests[0], tests[1]); + if (value != tests[2]) { + printf("AlignValueDown failed for 0x%" PRIxPTR "/0x%" PRIxPTR ": expected 0x%" PRIxPTR ", got 0x%" PRIxPTR "\n", + tests[0], tests[1], tests[2], value); + success = FALSE; + } + } + for (idx = 0; AlignValueDownTests[idx][0]; ++idx) { + const uintptr_t* tests = AlignValueUpTests[idx]; + uintptr_t value = AlignValueUp(tests[0], tests[1]); + if (value != tests[2]) { + printf("AlignValueUp failed for 0x%" PRIxPTR "/0x%" PRIxPTR ": expected 0x%" PRIxPTR ", got 0x%" PRIxPTR "\n", + tests[0], tests[1], tests[2], value); + success = FALSE; + } + } + if (success) { + printf("OK\n"); + } + return success; +} +#endif diff --git a/MemoryModulePP.h b/MemoryModulePP.h new file mode 100644 index 0000000..920f2bb --- /dev/null +++ b/MemoryModulePP.h @@ -0,0 +1,181 @@ +/* +* modify by xjun +*/ + +#ifndef __MEMORY_MODULE_HEADER +#define __MEMORY_MODULE_HEADER + +#include + +typedef void *HMEMORYRSRC; + +typedef void *HCUSTOMMODULE; + +#ifdef __cplusplus +extern "C" { +#endif + +typedef LPVOID (*CustomAllocFunc)(LPVOID, SIZE_T, DWORD, DWORD, void*); +typedef BOOL (*CustomFreeFunc)(LPVOID, SIZE_T, DWORD, void*); +typedef HCUSTOMMODULE (*CustomLoadLibraryFunc)(LPCSTR, void *); +typedef FARPROC (*CustomGetProcAddressFunc)(HCUSTOMMODULE, LPCSTR, void *); +typedef void (*CustomFreeLibraryFunc)(HCUSTOMMODULE, void *); + +struct ExportNameEntry { + LPCSTR name; + WORD idx; +}; + +typedef BOOL(WINAPI *DllEntryProc)(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved); +typedef int (WINAPI *ExeEntryProc)(void); + +typedef struct { + PIMAGE_NT_HEADERS headers; + unsigned char *codeBase; + HCUSTOMMODULE *modules; + int numModules; + BOOL initialized; + BOOL isDLL; + BOOL isRelocated; + CustomAllocFunc alloc; + CustomFreeFunc free; + CustomLoadLibraryFunc loadLibrary; + CustomGetProcAddressFunc getProcAddress; + CustomFreeLibraryFunc freeLibrary; + struct ExportNameEntry *nameExportsTable; + void *userdata; + ExeEntryProc exeEntry; + DWORD pageSize; +} MEMORYMODULE, *PMEMORYMODULE; + +typedef struct { + LPVOID address; + LPVOID alignedAddress; + SIZE_T size; + DWORD characteristics; + BOOL last; +} SECTIONFINALIZEDATA, *PSECTIONFINALIZEDATA; + +#define GET_HEADER_DICTIONARY(module, idx) &(module)->headers->OptionalHeader.DataDirectory[idx] + +/** + * Load EXE/DLL from memory location with the given size. + * + * All dependencies are resolved using default LoadLibrary/GetProcAddress + * calls through the Windows API. + */ +PMEMORYMODULE MemoryLoadLibrary(const void *, size_t); + +/** + * Load EXE/DLL from memory location with the given size using custom dependency + * resolvers. + * + * Dependencies will be resolved using passed callback methods. + */ +PMEMORYMODULE MemoryLoadLibraryEx(const void *, size_t, + CustomAllocFunc, + CustomFreeFunc, + CustomLoadLibraryFunc, + CustomGetProcAddressFunc, + CustomFreeLibraryFunc, + void *); + +/** + * Get address of exported method. Supports loading both by name and by + * ordinal value. + */ +FARPROC MemoryGetProcAddress(PMEMORYMODULE, LPCSTR); + +/** + * Free previously loaded EXE/DLL. + */ +void MemoryFreeLibrary(PMEMORYMODULE); + +/** + * Execute entry point (EXE only). The entry point can only be executed + * if the EXE has been loaded to the correct base address or it could + * be relocated (i.e. relocation information have not been stripped by + * the linker). + * + * Important: calling this function will not return, i.e. once the loaded + * EXE finished running, the process will terminate. + * + * Returns a negative value if the entry point could not be executed. + */ +int MemoryCallEntryPoint(PMEMORYMODULE); + +/** + * Find the location of a resource with the specified type and name. + */ +HMEMORYRSRC MemoryFindResource(PMEMORYMODULE, LPCTSTR, LPCTSTR); + +/** + * Find the location of a resource with the specified type, name and language. + */ +HMEMORYRSRC MemoryFindResourceEx(PMEMORYMODULE, LPCTSTR, LPCTSTR, WORD); + +/** + * Get the size of the resource in bytes. + */ +DWORD MemorySizeofResource(PMEMORYMODULE, HMEMORYRSRC); + +/** + * Get a pointer to the contents of the resource. + */ +LPVOID MemoryLoadResource(PMEMORYMODULE, HMEMORYRSRC); + +/** + * Load a string resource. + */ +int MemoryLoadString(PMEMORYMODULE, UINT, LPTSTR, int); + +/** + * Load a string resource with a given language. + */ +int MemoryLoadStringEx(PMEMORYMODULE, UINT, LPTSTR, int, WORD); + +/** +* Default implementation of CustomAllocFunc that calls VirtualAlloc +* internally to allocate memory for a library +* +* This is the default as used by MemoryLoadLibrary. +*/ +LPVOID MemoryDefaultAlloc(LPVOID, SIZE_T, DWORD, DWORD, void *); + +/** +* Default implementation of CustomFreeFunc that calls VirtualFree +* internally to free the memory used by a library +* +* This is the default as used by MemoryLoadLibrary. +*/ +BOOL MemoryDefaultFree(LPVOID, SIZE_T, DWORD, void *); + +/** + * Default implementation of CustomLoadLibraryFunc that calls LoadLibraryA + * internally to load an additional libary. + * + * This is the default as used by MemoryLoadLibrary. + */ +HCUSTOMMODULE MemoryDefaultLoadLibrary(LPCSTR, void *); + +/** + * Default implementation of CustomGetProcAddressFunc that calls GetProcAddress + * internally to get the address of an exported function. + * + * This is the default as used by MemoryLoadLibrary. + */ +FARPROC MemoryDefaultGetProcAddress(HCUSTOMMODULE, LPCSTR, void *); + +/** + * Default implementation of CustomFreeLibraryFunc that calls FreeLibrary + * internally to release an additional libary. + * + * This is the default as used by MemoryLoadLibrary. + */ +void MemoryDefaultFreeLibrary(HCUSTOMMODULE, void *); + +#ifdef __cplusplus +} +#endif + +#endif // __MEMORY_MODULE_HEADER diff --git a/Release/TargetDll_x64.dll b/Release/TargetDll_x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..2147694b459734c0766f88fee2eee4afac5b7749 GIT binary patch literal 81408 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 literal 0 HcmV?d00001 diff --git a/Release/TargetDll_x86.dll b/Release/TargetDll_x86.dll new file mode 100644 index 0000000000000000000000000000000000000000..9fc9d633f9055bf1a2a7290cc4536d6ab6945665 GIT binary patch literal 69632 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 z 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 literal 0 HcmV?d00001 diff --git a/Resource.aps b/Resource.aps new file mode 100644 index 0000000000000000000000000000000000000000..d1da7758db96d558fdf38a124ca84799e8d9f47a GIT binary patch literal 153288 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 UVR24Rc;l9TLfKnoHtw?1UoQ`cvH$=8 literal 0 HcmV?d00001 diff --git a/TargetDll/TargetDll.vcxproj b/TargetDll/TargetDll.vcxproj new file mode 100644 index 0000000..d997e33 --- /dev/null +++ b/TargetDll/TargetDll.vcxproj @@ -0,0 +1,161 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {34EF36DC-75BA-4FF2-83B1-A17E0DF448C1} + Win32Proj + TargetDll + + + + DynamicLibrary + true + v120 + Unicode + + + DynamicLibrary + true + v120 + Unicode + + + DynamicLibrary + false + v120 + true + Unicode + + + DynamicLibrary + false + v120 + true + Unicode + + + + + + + + + + + + + + + + + + + true + TargetDll\ + $(ProjectName)_x86 + + + $(ProjectName)_x64 + true + TargetDll\ + $(SolutionDir)\$(Configuration)\ + + + false + TargetDll\ + $(ProjectName)_x86 + + + false + TargetDll\ + $(ProjectName)_x64 + $(SolutionDir)\$(Configuration)\ + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;TARGETDLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Windows + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;_USRDLL;TARGETDLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreadedDebug + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;TARGETDLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;_USRDLL;TARGETDLL_EXPORTS;%(PreprocessorDefinitions) + MultiThreaded + + + Windows + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/TargetDll/TargetDll.vcxproj.filters b/TargetDll/TargetDll.vcxproj.filters new file mode 100644 index 0000000..fe5e0c9 --- /dev/null +++ b/TargetDll/TargetDll.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + 源文件 + + + \ No newline at end of file diff --git a/TargetDll/dllmain.cpp b/TargetDll/dllmain.cpp new file mode 100644 index 0000000..f5b5329 --- /dev/null +++ b/TargetDll/dllmain.cpp @@ -0,0 +1,38 @@ + +#include + + +void Test() +{ + MessageBox(NULL, TEXT("memory module load successfuly."), TEXT("info"), MB_ICONINFORMATION); + + PCHAR p = NULL; + __try{ + *p = '0'; + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + MessageBox(NULL, TEXT("exception 1"), TEXT("info"), MB_ICONINFORMATION); + } + +} + + +BOOL APIENTRY DllMain(HMODULE hDllHandle, DWORD dwReason, LPVOID lpreserved) +{ + switch (dwReason){ + case DLL_PROCESS_ATTACH:// process attach + { + DisableThreadLibraryCalls(hDllHandle); + Test(); + break; + } + case DLL_PROCESS_DETACH:{// process detach + break; + } + default: + break; + } + + return TRUE; +} \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..5311b5a --- /dev/null +++ b/main.cpp @@ -0,0 +1,45 @@ +#include +#include + +#include "resource.h" +#include "MemoryModulePP.h" + +BOOL LoadDllFromRes(PVOID *pDllData, DWORD *dwDllSize) +{ + HMODULE hInstance = GetModuleHandle(NULL); + HRSRC hRes; + +#if defined(_WIN64) + hRes = FindResource(hInstance, MAKEINTRESOURCE(IDR_DLL_X641),TEXT("DLL_X64")); +#else + hRes = FindResource(hInstance, MAKEINTRESOURCE(IDR_DLL_X861), TEXT("DLL_X86")); +#endif + if (hRes == NULL) + { + return FALSE; + } + + *pDllData = (PVOID)LoadResource(hInstance, hRes); + *dwDllSize = SizeofResource(hInstance, hRes); + + return TRUE; +} + +int main() +{ + PVOID pDllData = NULL; + DWORD dwDllSize = 0; + + PMEMORYMODULE pMemdll = NULL; + + if (LoadDllFromRes(&pDllData,&dwDllSize)) + { + pMemdll = MemoryLoadLibrary(pDllData, dwDllSize); + if (pMemdll != NULL) + { + MemoryFreeLibrary(pMemdll); + } + } + + getchar(); +} \ No newline at end of file diff --git a/resource.h b/resource.h new file mode 100644 index 0000000000000000000000000000000000000000..4f59231b22e6655a3f092acf965b4d1a518ff4ef GIT binary patch literal 958 zcmb7?UrPc(6vYogFG0{ZXrPxsNc)5IYP&v2x`wM#Pm7v@AqsA5K}0V>AENKsWA&R^ zB@06%)MvsJ!if?iz?~~3)EC3UsYZ41uhEYsm3bQGq$T8a*Hx*Xsm(enknWR z>7KnVd$AJrG-2hbfEn#4d;QnNc35b?4L^dd(htUa)2OAPLrB0H5Fa^j^wK;`R+-ix z=$6wFH%#${o_uO;w{)#SS7OaA(wUbPvjGayz1Y;#r+7vcGz-;M2S#d6#~QbGi7rvkUruT( zrWrLYaw}vvsjce