Splitted PELoaderStubs

This commit is contained in:
Fatmike-GH
2025-06-17 14:26:02 +02:00
parent 67cda64a97
commit 7a4d406c67
26 changed files with 946 additions and 151 deletions
+14
View File
@@ -5,7 +5,9 @@ VisualStudioVersion = 17.13.35818.85
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Fatpack", "Fatpack\Fatpack.vcxproj", "{23B3307D-097A-4F6F-BD3D-AB61BEA6D30C}"
ProjectSection(ProjectDependencies) = postProject
{1378C489-F61E-4A00-9757-34D7A88B42E9} = {1378C489-F61E-4A00-9757-34D7A88B42E9}
{6482B097-A9DE-4D2F-B103-7DF0BC56B231} = {6482B097-A9DE-4D2F-B103-7DF0BC56B231}
{7B2040C9-F75E-4D32-9D50-B34DAA46FDB4} = {7B2040C9-F75E-4D32-9D50-B34DAA46FDB4}
{D6392848-12A3-4B94-BF4C-1CE727F12D0B} = {D6392848-12A3-4B94-BF4C-1CE727F12D0B}
{E373949F-E084-4DD4-A445-43B2672C42AA} = {E373949F-E084-4DD4-A445-43B2672C42AA}
EndProjectSection
@@ -16,6 +18,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ResourceAdder", "ResourceAd
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Loader_Windows_Resource", "Loader_Windows_Resource\Loader_Windows_Resource.vcxproj", "{6482B097-A9DE-4D2F-B103-7DF0BC56B231}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Loader_Console_Section", "Loader_Console_Section\Loader_Console_Section.vcxproj", "{1378C489-F61E-4A00-9757-34D7A88B42E9}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Loader_Windows_Section", "Loader_Windows_Section\Loader_Windows_Section.vcxproj", "{7B2040C9-F75E-4D32-9D50-B34DAA46FDB4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
@@ -38,6 +44,14 @@ Global
{6482B097-A9DE-4D2F-B103-7DF0BC56B231}.Debug|x64.Build.0 = Debug|x64
{6482B097-A9DE-4D2F-B103-7DF0BC56B231}.Release|x64.ActiveCfg = Release|x64
{6482B097-A9DE-4D2F-B103-7DF0BC56B231}.Release|x64.Build.0 = Release|x64
{1378C489-F61E-4A00-9757-34D7A88B42E9}.Debug|x64.ActiveCfg = Debug|x64
{1378C489-F61E-4A00-9757-34D7A88B42E9}.Debug|x64.Build.0 = Debug|x64
{1378C489-F61E-4A00-9757-34D7A88B42E9}.Release|x64.ActiveCfg = Release|x64
{1378C489-F61E-4A00-9757-34D7A88B42E9}.Release|x64.Build.0 = Release|x64
{7B2040C9-F75E-4D32-9D50-B34DAA46FDB4}.Debug|x64.ActiveCfg = Debug|x64
{7B2040C9-F75E-4D32-9D50-B34DAA46FDB4}.Debug|x64.Build.0 = Debug|x64
{7B2040C9-F75E-4D32-9D50-B34DAA46FDB4}.Release|x64.ActiveCfg = Release|x64
{7B2040C9-F75E-4D32-9D50-B34DAA46FDB4}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
+26 -9
View File
@@ -53,20 +53,37 @@ namespace Packer
return true;
}
bool PackerUtils::PrepareLoaderStub(PEFile::PEFile& inputFile, PEFile::PEFile& peLoader)
bool PackerUtils::PrepareResourceLoaderStub(PEFile::PEFile& inputFile, PEFile::PEFile& peLoader)
{
if (inputFile.IsConsole())
{
return PrepareLoaderStub(peLoader, 1000);
}
else
{
return PrepareLoaderStub(peLoader, 1001);
}
}
bool PackerUtils::PrepareSectionLoaderStub(PEFile::PEFile& inputFile, PEFile::PEFile& peLoader)
{
if (inputFile.IsConsole())
{
return PrepareLoaderStub(peLoader, 1002);
}
else
{
return PrepareLoaderStub(peLoader, 1003);
}
}
bool PackerUtils::PrepareLoaderStub(PEFile::PEFile& peLoader, WORD resourceId)
{
ResourceLoader::ResourceLoader resourceLoader;
DWORD size = 0;
BYTE* buffer = nullptr;
if (inputFile.IsConsole())
{
buffer = resourceLoader.LoadResource(MAKEINTRESOURCE(1000), RT_RCDATA, size);
}
else
{
buffer = resourceLoader.LoadResource(MAKEINTRESOURCE(1001), RT_RCDATA, size);
}
buffer = resourceLoader.LoadResource(MAKEINTRESOURCE(resourceId), RT_RCDATA, size);
if (!buffer || size == 0 || !peLoader.LoadFromBuffer(buffer, size))
{
+4 -1
View File
@@ -13,12 +13,15 @@ namespace Packer
bool ReadPeFile(LPWSTR fileName, PEFile::PEFile& peFile);
bool ValidatePeFile(PEFile::PEFile& peFile);
bool PrepareLoaderStub(PEFile::PEFile& inputFile, PEFile::PEFile& peLoader);
bool PrepareResourceLoaderStub(PEFile::PEFile& inputFile, PEFile::PEFile& peLoader);
bool PrepareSectionLoaderStub(PEFile::PEFile& inputFile, PEFile::PEFile& peLoader);
bool SavePeFile(LPWSTR fileName, PEFile::PEFile& peFile);
bool AppendResources(LPWSTR inputFileName, LPWSTR outputFileName);
Error::ErrorCode GetLastError() { return _lastError; }
private:
bool PrepareLoaderStub(PEFile::PEFile& peLoader, WORD resourceId);
void SetLastError(Error::ErrorCode error) { _lastError = error; }
private:
+1 -1
View File
@@ -49,7 +49,7 @@ namespace Packer
bool ResourcePacker::PrepareLoaderStub()
{
if (!_packerUtils->PrepareLoaderStub(_inputFile, _peLoader))
if (!_packerUtils->PrepareResourceLoaderStub(_inputFile, _peLoader))
{
SetLastError(_packerUtils->GetLastError());
return false;
+1 -1
View File
@@ -51,7 +51,7 @@ namespace Packer
bool SectionPacker::PrepareLoaderStub()
{
if (!_packerUtils->PrepareLoaderStub(_inputFile, _peLoader))
if (!_packerUtils->PrepareSectionLoaderStub(_inputFile, _peLoader))
{
SetLastError(_packerUtils->GetLastError());
return false;
+5
View File
@@ -6,4 +6,9 @@ cd Debug
START /WAIT ResourceAdder Loader_Console_Resource.exe Fatpack.exe 1000
powershell -command "Start-Sleep -Milliseconds 1000"
START /WAIT ResourceAdder Loader_Windows_Resource.exe Fatpack.exe 1001
powershell -command "Start-Sleep -Milliseconds 1000"
START /WAIT ResourceAdder Loader_Console_Section.exe Fatpack.exe 1002
powershell -command "Start-Sleep -Milliseconds 1000"
START /WAIT ResourceAdder Loader_Windows_Section.exe Fatpack.exe 1003
powershell -command "Start-Sleep -Milliseconds 1000"
+5
View File
@@ -6,4 +6,9 @@ cd Release
START /WAIT ResourceAdder Loader_Console_Resource.exe Fatpack.exe 1000
powershell -command "Start-Sleep -Milliseconds 1000"
START /WAIT ResourceAdder Loader_Windows_Resource.exe Fatpack.exe 1001
powershell -command "Start-Sleep -Milliseconds 1000"
START /WAIT ResourceAdder Loader_Console_Section.exe Fatpack.exe 1002
powershell -command "Start-Sleep -Milliseconds 1000"
START /WAIT ResourceAdder Loader_Windows_Section.exe Fatpack.exe 1003
powershell -command "Start-Sleep -Milliseconds 1000"
@@ -22,7 +22,7 @@
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{e373949f-e084-4dd4-a445-43b2672c42aa}</ProjectGuid>
<RootNamespace>LoaderConsole</RootNamespace>
<RootNamespace>LoaderConsoleResource</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>Loader_Console_Resource</ProjectName>
</PropertyGroup>
@@ -171,7 +171,7 @@
<ClCompile Include="..\Shared\CRT\crt.cpp" />
<ClCompile Include="..\Shared\Decompressor\Decompressor.cpp" />
<ClCompile Include="..\Shared\Decompressor\TinyLzmaDecompress.cpp" />
<ClCompile Include="..\Shared\PELoaderStub\PELoaderStub.cpp" />
<ClCompile Include="..\Shared\PELoaderStub\ResourceLoaderStub.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PEFile.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PEImage.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PELoader.cpp" />
@@ -185,7 +185,7 @@
<ClInclude Include="..\Shared\CRT\crt_tls.h" />
<ClInclude Include="..\Shared\Decompressor\Decompressor.h" />
<ClInclude Include="..\Shared\Decompressor\TinyLzmaDecompress.h" />
<ClInclude Include="..\Shared\PELoaderStub\PELoaderStub.h" />
<ClInclude Include="..\Shared\PELoaderStub\ResourceLoaderStub.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PEFile.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PEImage.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PELoader.h" />
@@ -26,12 +26,12 @@
<ClCompile Include="..\Shared\Decompressor\TinyLzmaDecompress.cpp">
<Filter>Decompressor</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoaderStub\PELoaderStub.cpp">
<Filter>PELoaderStub</Filter>
</ClCompile>
<ClCompile Include="..\Shared\ApiCaller\ApiCaller.cpp">
<Filter>ApiCaller</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoaderStub\ResourceLoaderStub.cpp">
<Filter>PELoaderStub</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="PELoader">
@@ -93,11 +93,11 @@
<ClInclude Include="..\Shared\Decompressor\TinyLzmaDecompress.h">
<Filter>Decompressor</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoaderStub\PELoaderStub.h">
<Filter>PELoaderStub</Filter>
</ClInclude>
<ClInclude Include="..\Shared\ApiCaller\ApiCaller.h">
<Filter>ApiCaller</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoaderStub\ResourceLoaderStub.h">
<Filter>PELoaderStub</Filter>
</ClInclude>
</ItemGroup>
</Project>
+2 -2
View File
@@ -1,5 +1,5 @@
#include <Windows.h>
#include "..\Shared\PELoaderStub\PELoaderStub.h"
#include "..\Shared\PELoaderStub\ResourceLoaderStub.h"
#include "..\Shared\PELoader\PELoader\PEImage.h"
#include "..\Shared\PELoader\PELoader\TlsResolver.h"
#include "..\Shared\PELoader\TlsCallbackProxy\TlsCallbackProxy.h"
@@ -36,7 +36,7 @@ int main()
{
_tlsResolver = new PELoader::TlsResolver();
PELoaderStub::PELoaderStub* peLoaderStub = new PELoaderStub::PELoaderStub();
PELoaderStub::ResourceLoaderStub* peLoaderStub = new PELoaderStub::ResourceLoaderStub();
_peImage = peLoaderStub->Load(_tlsResolver);
delete peLoaderStub;
@@ -0,0 +1,200 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{1378c489-f61e-4a00-9757-34d7a88b42e9}</ProjectGuid>
<RootNamespace>LoaderConsoleSection</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>Loader_Console_Section</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)\build\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)\build\obj\Loader_Console_Section\$(Platform)\$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)\build\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)\build\obj\Loader_Console_Section\$(Platform)\$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<ExceptionHandling>false</ExceptionHandling>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<RuntimeLibrary />
<BufferSecurityCheck>false</BufferSecurityCheck>
<AdditionalOptions>/Zc:threadSafeInit- /Gs10000000 %(AdditionalOptions)</AdditionalOptions>
<IntrinsicFunctions>true</IntrinsicFunctions>
<FunctionLevelLinking>
</FunctionLevelLinking>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<EnableUAC>false</EnableUAC>
<EntryPointSymbol>main</EntryPointSymbol>
<StackReserveSize>
</StackReserveSize>
<StackCommitSize>
</StackCommitSize>
<RandomizedBaseAddress>true</RandomizedBaseAddress>
<FixedBaseAddress>false</FixedBaseAddress>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<ExceptionHandling>false</ExceptionHandling>
<RuntimeLibrary />
<BufferSecurityCheck>false</BufferSecurityCheck>
<AdditionalOptions>/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
<WholeProgramOptimization>false</WholeProgramOptimization>
<Optimization>MinSpace</Optimization>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>false</GenerateDebugInformation>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<EnableUAC>false</EnableUAC>
<EntryPointSymbol>main</EntryPointSymbol>
<AdditionalOptions>/DEBUG:NONE /EMITPOGOPHASEINFO %(AdditionalOptions)</AdditionalOptions>
<RandomizedBaseAddress>true</RandomizedBaseAddress>
<FixedBaseAddress>false</FixedBaseAddress>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\Shared\ApiCaller\ApiCaller.cpp" />
<ClCompile Include="..\Shared\CRT\crt.cpp" />
<ClCompile Include="..\Shared\Decompressor\Decompressor.cpp" />
<ClCompile Include="..\Shared\Decompressor\TinyLzmaDecompress.cpp" />
<ClCompile Include="..\Shared\PELoaderStub\SectionLoaderStub.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PEFile.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PEImage.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PELoader.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\TlsResolver.cpp" />
<ClCompile Include="..\Shared\ResourceLoader\ResourceLoader.cpp" />
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\Shared\ApiCaller\ApiCaller.h" />
<ClInclude Include="..\Shared\CRT\crt.h" />
<ClInclude Include="..\Shared\CRT\crt_tls.h" />
<ClInclude Include="..\Shared\Decompressor\Decompressor.h" />
<ClInclude Include="..\Shared\Decompressor\TinyLzmaDecompress.h" />
<ClInclude Include="..\Shared\PELoaderStub\SectionLoaderStub.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PEFile.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PEImage.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PELoader.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\TlsResolver.h" />
<ClInclude Include="..\Shared\PELoader\TlsCallbackProxy\TlsCallbackProxy.h" />
<ClInclude Include="..\Shared\PELoader\TypeDefs\peb.h" />
<ClInclude Include="..\Shared\ResourceLoader\ResourceLoader.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="main.cpp" />
<ClCompile Include="..\Shared\CRT\crt.cpp">
<Filter>CRT</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoader\PELoader\PEFile.cpp">
<Filter>PELoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoader\PELoader\PEImage.cpp">
<Filter>PELoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoader\PELoader\PELoader.cpp">
<Filter>PELoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoader\PELoader\TlsResolver.cpp">
<Filter>PELoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\ResourceLoader\ResourceLoader.cpp">
<Filter>ResourceLoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\Decompressor\Decompressor.cpp">
<Filter>Decompressor</Filter>
</ClCompile>
<ClCompile Include="..\Shared\Decompressor\TinyLzmaDecompress.cpp">
<Filter>Decompressor</Filter>
</ClCompile>
<ClCompile Include="..\Shared\ApiCaller\ApiCaller.cpp">
<Filter>ApiCaller</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoaderStub\SectionLoaderStub.cpp">
<Filter>PELoaderStub</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="PELoader">
<UniqueIdentifier>{8bc8722f-41fb-405d-a2f5-48c040013e7d}</UniqueIdentifier>
</Filter>
<Filter Include="TlsCallbackProxy">
<UniqueIdentifier>{8cd4ed16-89d6-4c5c-b102-26b5626249e3}</UniqueIdentifier>
</Filter>
<Filter Include="TypeDefs">
<UniqueIdentifier>{b5a4e8a5-6067-4597-ac61-8c68e7e2e6c7}</UniqueIdentifier>
</Filter>
<Filter Include="CRT">
<UniqueIdentifier>{f83fac1d-c5cf-4b1f-99d8-19371c40002f}</UniqueIdentifier>
</Filter>
<Filter Include="ResourceLoader">
<UniqueIdentifier>{a247ea49-dee8-4075-8bb7-aaf43fe552d2}</UniqueIdentifier>
</Filter>
<Filter Include="Decompressor">
<UniqueIdentifier>{89b152b3-51c6-4a6c-90ec-7f8f0de1026d}</UniqueIdentifier>
</Filter>
<Filter Include="PELoaderStub">
<UniqueIdentifier>{54e5439f-4789-4650-a902-4c2da15d678f}</UniqueIdentifier>
</Filter>
<Filter Include="ApiCaller">
<UniqueIdentifier>{bb7cb992-0b8e-444d-8d03-b46546268647}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\Shared\CRT\crt.h">
<Filter>CRT</Filter>
</ClInclude>
<ClInclude Include="..\Shared\CRT\crt_tls.h">
<Filter>CRT</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\PELoader\PEFile.h">
<Filter>PELoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\PELoader\PEImage.h">
<Filter>PELoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\PELoader\PELoader.h">
<Filter>PELoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\PELoader\TlsResolver.h">
<Filter>PELoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\TlsCallbackProxy\TlsCallbackProxy.h">
<Filter>TlsCallbackProxy</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\TypeDefs\peb.h">
<Filter>TypeDefs</Filter>
</ClInclude>
<ClInclude Include="..\Shared\ResourceLoader\ResourceLoader.h">
<Filter>ResourceLoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\Decompressor\Decompressor.h">
<Filter>Decompressor</Filter>
</ClInclude>
<ClInclude Include="..\Shared\Decompressor\TinyLzmaDecompress.h">
<Filter>Decompressor</Filter>
</ClInclude>
<ClInclude Include="..\Shared\ApiCaller\ApiCaller.h">
<Filter>ApiCaller</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoaderStub\SectionLoaderStub.h">
<Filter>PELoaderStub</Filter>
</ClInclude>
</ItemGroup>
</Project>
+49
View File
@@ -0,0 +1,49 @@
#include <Windows.h>
#include "..\Shared\PELoaderStub\SectionLoaderStub.h"
#include "..\Shared\PELoader\PELoader\PEImage.h"
#include "..\Shared\PELoader\PELoader\TlsResolver.h"
#include "..\Shared\PELoader\TlsCallbackProxy\TlsCallbackProxy.h"
PELoader::TlsResolver* _tlsResolver = nullptr;
PELoader::PEImage* _peImage = nullptr;
BOOL _entryPointCalled = FALSE;
void TlsCallbackProxy(PVOID hModule, DWORD dwReason, PVOID pContext)
{
if (_entryPointCalled == FALSE) return;
if (dwReason == DLL_THREAD_DETACH)
{
_tlsResolver->ExecuteCallbacks(_peImage, dwReason, pContext);
_tlsResolver->ClearTlsData();
}
else if (dwReason == DLL_THREAD_ATTACH)
{
_tlsResolver->InitializeTlsData(_peImage);
_tlsResolver->ExecuteCallbacks(_peImage, dwReason, pContext);
}
else if (dwReason == DLL_PROCESS_ATTACH)
{
_tlsResolver->ExecuteCallbacks(_peImage, dwReason, pContext);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
_tlsResolver->ExecuteCallbacks(_peImage, dwReason, pContext);
}
}
int main()
{
_tlsResolver = new PELoader::TlsResolver();
PELoaderStub::SectionLoaderStub* peLoaderStub = new PELoaderStub::SectionLoaderStub();
_peImage = peLoaderStub->Load(_tlsResolver);
delete peLoaderStub;
// Call entry point
LPVOID entryPoint = _peImage->GetEntryPoint();
_entryPointCalled = TRUE;
((void(*)())(entryPoint))();
return 0;
}
@@ -22,7 +22,7 @@
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{6482b097-a9de-4d2f-b103-7df0bc56b231}</ProjectGuid>
<RootNamespace>LoaderWindows</RootNamespace>
<RootNamespace>LoaderWindowsResource</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>Loader_Windows_Resource</ProjectName>
</PropertyGroup>
@@ -166,7 +166,7 @@
<ClCompile Include="..\Shared\CRT\crt.cpp" />
<ClCompile Include="..\Shared\Decompressor\Decompressor.cpp" />
<ClCompile Include="..\Shared\Decompressor\TinyLzmaDecompress.cpp" />
<ClCompile Include="..\Shared\PELoaderStub\PELoaderStub.cpp" />
<ClCompile Include="..\Shared\PELoaderStub\ResourceLoaderStub.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PEFile.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PEImage.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PELoader.cpp" />
@@ -180,7 +180,7 @@
<ClInclude Include="..\Shared\CRT\crt_tls.h" />
<ClInclude Include="..\Shared\Decompressor\Decompressor.h" />
<ClInclude Include="..\Shared\Decompressor\TinyLzmaDecompress.h" />
<ClInclude Include="..\Shared\PELoaderStub\PELoaderStub.h" />
<ClInclude Include="..\Shared\PELoaderStub\ResourceLoaderStub.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PEFile.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PEImage.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PELoader.h" />
@@ -26,12 +26,12 @@
<ClCompile Include="..\Shared\Decompressor\TinyLzmaDecompress.cpp">
<Filter>Decompressor</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoaderStub\PELoaderStub.cpp">
<Filter>PELoaderStub</Filter>
</ClCompile>
<ClCompile Include="..\Shared\ApiCaller\ApiCaller.cpp">
<Filter>ApiCaller</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoaderStub\ResourceLoaderStub.cpp">
<Filter>PELoaderStub</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="CRT">
@@ -93,11 +93,11 @@
<ClInclude Include="..\Shared\Decompressor\TinyLzmaDecompress.h">
<Filter>Decompressor</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoaderStub\PELoaderStub.h">
<Filter>PELoaderStub</Filter>
</ClInclude>
<ClInclude Include="..\Shared\ApiCaller\ApiCaller.h">
<Filter>ApiCaller</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoaderStub\ResourceLoaderStub.h">
<Filter>PELoaderStub</Filter>
</ClInclude>
</ItemGroup>
</Project>
+2 -2
View File
@@ -1,5 +1,5 @@
#include <Windows.h>
#include "..\Shared\PELoaderStub\PELoaderStub.h"
#include "..\Shared\PELoaderStub\ResourceLoaderStub.h"
#include "..\Shared\PELoader\PELoader\PEImage.h"
#include "..\Shared\PELoader\PELoader\TlsResolver.h"
#include "..\Shared\PELoader\TlsCallbackProxy\TlsCallbackProxy.h"
@@ -36,7 +36,7 @@ int main()
{
_tlsResolver = new PELoader::TlsResolver();
PELoaderStub::PELoaderStub* peLoaderStub = new PELoaderStub::PELoaderStub();
PELoaderStub::ResourceLoaderStub* peLoaderStub = new PELoaderStub::ResourceLoaderStub();
_peImage = peLoaderStub->Load(_tlsResolver);
delete peLoaderStub;
@@ -0,0 +1,195 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{7b2040c9-f75e-4d32-9d50-b34daa46fdb4}</ProjectGuid>
<RootNamespace>LoaderWindowsSection</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>Loader_Windows_Section</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)\build\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)\build\obj\Loader_Windows_Section\$(Platform)\$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)\build\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)\build\obj\Loader_Windows_Section\$(Platform)\$(Configuration)\</IntDir>
<GenerateManifest>false</GenerateManifest>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalOptions>/Zc:threadSafeInit- /Gs10000000 %(AdditionalOptions)</AdditionalOptions>
<IntrinsicFunctions>true</IntrinsicFunctions>
<BufferSecurityCheck>false</BufferSecurityCheck>
<ExceptionHandling>false</ExceptionHandling>
<BasicRuntimeChecks>Default</BasicRuntimeChecks>
<RuntimeLibrary />
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<EntryPointSymbol>main</EntryPointSymbol>
<EnableUAC>false</EnableUAC>
<RandomizedBaseAddress>true</RandomizedBaseAddress>
<FixedBaseAddress>false</FixedBaseAddress>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalOptions>/Zc:threadSafeInit- %(AdditionalOptions)</AdditionalOptions>
<WholeProgramOptimization>false</WholeProgramOptimization>
<BufferSecurityCheck>false</BufferSecurityCheck>
<ExceptionHandling>false</ExceptionHandling>
<Optimization>MinSpace</Optimization>
<RuntimeLibrary>
</RuntimeLibrary>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>false</GenerateDebugInformation>
<IgnoreAllDefaultLibraries>true</IgnoreAllDefaultLibraries>
<EntryPointSymbol>main</EntryPointSymbol>
<EnableUAC>false</EnableUAC>
<RandomizedBaseAddress>true</RandomizedBaseAddress>
<FixedBaseAddress>false</FixedBaseAddress>
<AdditionalOptions>/DEBUG:NONE /EMITPOGOPHASEINFO %(AdditionalOptions)</AdditionalOptions>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="..\Shared\ApiCaller\ApiCaller.cpp" />
<ClCompile Include="..\Shared\CRT\crt.cpp" />
<ClCompile Include="..\Shared\Decompressor\Decompressor.cpp" />
<ClCompile Include="..\Shared\Decompressor\TinyLzmaDecompress.cpp" />
<ClCompile Include="..\Shared\PELoaderStub\SectionLoaderStub.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PEFile.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PEImage.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\PELoader.cpp" />
<ClCompile Include="..\Shared\PELoader\PELoader\TlsResolver.cpp" />
<ClCompile Include="..\Shared\ResourceLoader\ResourceLoader.cpp" />
<ClCompile Include="main.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\Shared\ApiCaller\ApiCaller.h" />
<ClInclude Include="..\Shared\CRT\crt.h" />
<ClInclude Include="..\Shared\CRT\crt_tls.h" />
<ClInclude Include="..\Shared\Decompressor\Decompressor.h" />
<ClInclude Include="..\Shared\Decompressor\TinyLzmaDecompress.h" />
<ClInclude Include="..\Shared\PELoaderStub\SectionLoaderStub.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PEFile.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PEImage.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\PELoader.h" />
<ClInclude Include="..\Shared\PELoader\PELoader\TlsResolver.h" />
<ClInclude Include="..\Shared\PELoader\TlsCallbackProxy\TlsCallbackProxy.h" />
<ClInclude Include="..\Shared\PELoader\TypeDefs\peb.h" />
<ClInclude Include="..\Shared\ResourceLoader\ResourceLoader.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
@@ -0,0 +1,103 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="main.cpp" />
<ClCompile Include="..\Shared\CRT\crt.cpp">
<Filter>CRT</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoader\PELoader\PEFile.cpp">
<Filter>PELoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoader\PELoader\PEImage.cpp">
<Filter>PELoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoader\PELoader\PELoader.cpp">
<Filter>PELoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoader\PELoader\TlsResolver.cpp">
<Filter>PELoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\ResourceLoader\ResourceLoader.cpp">
<Filter>ResourceLoader</Filter>
</ClCompile>
<ClCompile Include="..\Shared\Decompressor\Decompressor.cpp">
<Filter>Decompressor</Filter>
</ClCompile>
<ClCompile Include="..\Shared\Decompressor\TinyLzmaDecompress.cpp">
<Filter>Decompressor</Filter>
</ClCompile>
<ClCompile Include="..\Shared\ApiCaller\ApiCaller.cpp">
<Filter>ApiCaller</Filter>
</ClCompile>
<ClCompile Include="..\Shared\PELoaderStub\SectionLoaderStub.cpp">
<Filter>PELoaderStub</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="CRT">
<UniqueIdentifier>{26ee8355-4a30-474e-9804-2a5dd66241ef}</UniqueIdentifier>
</Filter>
<Filter Include="ResourceLoader">
<UniqueIdentifier>{f26f6ac7-016a-4050-92a7-fa09dd2d02ba}</UniqueIdentifier>
</Filter>
<Filter Include="TypeDefs">
<UniqueIdentifier>{76cc35a7-9632-4fb7-abdf-ad58935b1ea4}</UniqueIdentifier>
</Filter>
<Filter Include="TlsCallbackProxy">
<UniqueIdentifier>{99f38114-3632-4185-9806-112071789014}</UniqueIdentifier>
</Filter>
<Filter Include="PELoader">
<UniqueIdentifier>{15defd60-dee7-4278-b7d5-caa308c1731f}</UniqueIdentifier>
</Filter>
<Filter Include="Decompressor">
<UniqueIdentifier>{5779bd0d-7384-41a8-85b9-7496dd4e3b8c}</UniqueIdentifier>
</Filter>
<Filter Include="PELoaderStub">
<UniqueIdentifier>{ccd74711-d078-4364-8337-d80c7b100c2d}</UniqueIdentifier>
</Filter>
<Filter Include="ApiCaller">
<UniqueIdentifier>{c4d1676c-238a-4714-b491-4d5e7062b75a}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\Shared\CRT\crt.h">
<Filter>CRT</Filter>
</ClInclude>
<ClInclude Include="..\Shared\CRT\crt_tls.h">
<Filter>CRT</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\PELoader\PEFile.h">
<Filter>PELoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\PELoader\PEImage.h">
<Filter>PELoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\PELoader\PELoader.h">
<Filter>PELoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\PELoader\TlsResolver.h">
<Filter>PELoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\TlsCallbackProxy\TlsCallbackProxy.h">
<Filter>TlsCallbackProxy</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoader\TypeDefs\peb.h">
<Filter>TypeDefs</Filter>
</ClInclude>
<ClInclude Include="..\Shared\ResourceLoader\ResourceLoader.h">
<Filter>ResourceLoader</Filter>
</ClInclude>
<ClInclude Include="..\Shared\Decompressor\Decompressor.h">
<Filter>Decompressor</Filter>
</ClInclude>
<ClInclude Include="..\Shared\Decompressor\TinyLzmaDecompress.h">
<Filter>Decompressor</Filter>
</ClInclude>
<ClInclude Include="..\Shared\ApiCaller\ApiCaller.h">
<Filter>ApiCaller</Filter>
</ClInclude>
<ClInclude Include="..\Shared\PELoaderStub\SectionLoaderStub.h">
<Filter>PELoaderStub</Filter>
</ClInclude>
</ItemGroup>
</Project>
+49
View File
@@ -0,0 +1,49 @@
#include <Windows.h>
#include "..\Shared\PELoaderStub\SectionLoaderStub.h"
#include "..\Shared\PELoader\PELoader\PEImage.h"
#include "..\Shared\PELoader\PELoader\TlsResolver.h"
#include "..\Shared\PELoader\TlsCallbackProxy\TlsCallbackProxy.h"
PELoader::TlsResolver* _tlsResolver = nullptr;
PELoader::PEImage* _peImage = nullptr;
BOOL _entryPointCalled = FALSE;
void TlsCallbackProxy(PVOID hModule, DWORD dwReason, PVOID pContext)
{
if (_entryPointCalled == FALSE) return;
if (dwReason == DLL_THREAD_DETACH)
{
_tlsResolver->ExecuteCallbacks(_peImage, dwReason, pContext);
_tlsResolver->ClearTlsData();
}
else if (dwReason == DLL_THREAD_ATTACH)
{
_tlsResolver->InitializeTlsData(_peImage);
_tlsResolver->ExecuteCallbacks(_peImage, dwReason, pContext);
}
else if (dwReason == DLL_PROCESS_ATTACH)
{
_tlsResolver->ExecuteCallbacks(_peImage, dwReason, pContext);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
_tlsResolver->ExecuteCallbacks(_peImage, dwReason, pContext);
}
}
int main()
{
_tlsResolver = new PELoader::TlsResolver();
PELoaderStub::SectionLoaderStub* peLoaderStub = new PELoaderStub::SectionLoaderStub();
_peImage = peLoaderStub->Load(_tlsResolver);
delete peLoaderStub;
// Call entry point
LPVOID entryPoint = _peImage->GetEntryPoint();
_entryPointCalled = TRUE;
((void(*)())(entryPoint))();
return 0;
}
-99
View File
@@ -1,99 +0,0 @@
#include "PELoaderStub.h"
#include "..\ResourceLoader\ResourceLoader.h"
#include "..\Decompressor\Decompressor.h"
#include "..\PELoader\PELoader\PELoader.h"
#include "..\PELoader\PELoader\PEImage.h"
#include "..\PELoader\PELoader\PEFile.h"
#include "..\PELoader\PELoader\TlsResolver.h"
#include "..\ApiCaller\ApiCaller.h"
namespace PELoaderStub
{
PELoaderStub::PELoaderStub()
{
}
PELoaderStub::~PELoaderStub()
{
}
PELoader::PEImage* PELoaderStub::Load(PELoader::TlsResolver* tlsResolver)
{
return IsResourceAvailable() ? LoadFromResource(tlsResolver) : LoadFromSection(tlsResolver);
}
PELoader::PEImage* PELoaderStub::LoadFromResource(PELoader::TlsResolver* tlsResolver)
{
DWORD compressedSize = 0;
BYTE* compressedData = GetCompressedDataFromResource(compressedSize);
if (!compressedData || compressedSize == 0) return nullptr;
size_t decompressedSize = 0;
BYTE* decompressedData = Decompress(compressedData, compressedSize, decompressedSize);
delete[] compressedData;
return CreatePEImageFromMemory(decompressedData, tlsResolver);
}
PELoader::PEImage* PELoaderStub::LoadFromSection(PELoader::TlsResolver* tlsResolver)
{
DWORD rawSize = 0, virtualSize = 0;
BYTE* sectionBase = GetLastSection(rawSize, virtualSize);
if (!sectionBase || rawSize == 0) return nullptr;
size_t decompressedSize = 0;
BYTE* decompressedData = Decompress(sectionBase, rawSize, decompressedSize);
SecureZeroMemory(sectionBase, virtualSize);
return CreatePEImageFromMemory(decompressedData, tlsResolver, sectionBase);
}
bool PELoaderStub::IsResourceAvailable()
{
ResourceLoader::ResourceLoader resourceLoader;
return resourceLoader.FindResource(L"FPACK", RT_RCDATA) != nullptr;
}
BYTE* PELoaderStub::GetCompressedDataFromResource(DWORD& compressedSize)
{
ResourceLoader::ResourceLoader resourceLoader;
return resourceLoader.LoadResource(L"FPACK", RT_RCDATA, compressedSize);
}
BYTE* PELoaderStub::GetLastSection(DWORD& rawSize, DWORD& virtualSize)
{
PELoader::PEImage self(ApiCaller::ApiCaller::Instance().CallGetModuleHandle(nullptr));
WORD lastSectionIndex = self.GetNumberOfSections() - 1;
PIMAGE_SECTION_HEADER lastSectionHeader = self.GetSectionHeader(lastSectionIndex);
BYTE* sectionStart = (BYTE*)self.GetImageBase() + lastSectionHeader->VirtualAddress;
rawSize = lastSectionHeader->SizeOfRawData;
virtualSize = lastSectionHeader->Misc.VirtualSize;
DWORD oldProtect = 0;
ApiCaller::ApiCaller::Instance().CallVirtualProtect(sectionStart, virtualSize, PAGE_EXECUTE_READWRITE, &oldProtect);
return sectionStart;
}
BYTE* PELoaderStub::Decompress(BYTE* compressedData, DWORD compressedSize, size_t& decompressedSize)
{
BYTE* decompressedData = nullptr;
Decompressor::Decompressor decompressor;
decompressor.Decompress(compressedData, compressedSize, &decompressedData, &decompressedSize);
return decompressedData;
}
PELoader::PEImage* PELoaderStub::CreatePEImageFromMemory(BYTE* peFileBuffer, PELoader::TlsResolver* tlsResolver, LPVOID allocatedImageBase /*= nullptr*/)
{
if (!peFileBuffer) return nullptr;
PELoader::PELoader peLoader;
PELoader::PEFile peFile(peFileBuffer);
allocatedImageBase = peLoader.LoadPE(&peFile, tlsResolver, allocatedImageBase);
delete[] peFileBuffer;
return new PELoader::PEImage(allocatedImageBase);
}
}
@@ -0,0 +1,63 @@
#include "ResourceLoaderStub.h"
#include "..\..\Shared\ResourceLoader\ResourceLoader.h"
#include "..\..\Shared\Decompressor\Decompressor.h"
#include "..\..\Shared\PELoader\PELoader\PELoader.h"
#include "..\..\Shared\PELoader\PELoader\PEImage.h"
#include "..\..\Shared\PELoader\PELoader\PEFile.h"
#include "..\..\Shared\ApiCaller\ApiCaller.h"
namespace PELoaderStub
{
ResourceLoaderStub::ResourceLoaderStub()
{
}
ResourceLoaderStub::~ResourceLoaderStub()
{
}
PELoader::PEImage* ResourceLoaderStub::Load(PELoader::TlsResolver* tlsResolver)
{
return LoadFromResource(tlsResolver);
}
PELoader::PEImage* ResourceLoaderStub::LoadFromResource(PELoader::TlsResolver* tlsResolver)
{
DWORD compressedSize = 0;
BYTE* compressedData = GetCompressedDataFromResource(compressedSize);
if (!compressedData || compressedSize == 0) return nullptr;
size_t decompressedSize = 0;
BYTE* decompressedData = Decompress(compressedData, compressedSize, decompressedSize);
delete[] compressedData;
return CreatePEImageFromMemory(decompressedData, tlsResolver);
}
BYTE* ResourceLoaderStub::GetCompressedDataFromResource(DWORD& compressedSize)
{
ResourceLoader::ResourceLoader resourceLoader;
return resourceLoader.LoadResource(L"FPACK", RT_RCDATA, compressedSize);
}
BYTE* ResourceLoaderStub::Decompress(BYTE* compressedData, DWORD compressedSize, size_t& decompressedSize)
{
BYTE* decompressedData = nullptr;
Decompressor::Decompressor decompressor;
decompressor.Decompress(compressedData, compressedSize, &decompressedData, &decompressedSize);
return decompressedData;
}
PELoader::PEImage* ResourceLoaderStub::CreatePEImageFromMemory(BYTE* peFileBuffer, PELoader::TlsResolver* tlsResolver, LPVOID allocatedImageBase /*= nullptr*/)
{
if (!peFileBuffer) return nullptr;
PELoader::PELoader peLoader;
PELoader::PEFile peFile(peFileBuffer);
allocatedImageBase = peLoader.LoadPE(&peFile, tlsResolver, allocatedImageBase);
delete[] peFileBuffer;
return new PELoader::PEImage(allocatedImageBase);
}
}
@@ -14,24 +14,17 @@ namespace ResourceLoader
namespace PELoaderStub
{
class PELoaderStub
class ResourceLoaderStub
{
public:
PELoaderStub();
~PELoaderStub();
ResourceLoaderStub();
~ResourceLoaderStub();
PELoader::PEImage* Load(PELoader::TlsResolver* tlsResolver);
private:
bool IsResourceAvailable();
PELoader::PEImage* LoadFromResource(PELoader::TlsResolver* tlsResolver);
PELoader::PEImage* LoadFromSection(PELoader::TlsResolver* tlsResolver);
BYTE* GetCompressedDataFromResource(DWORD& compressedSize);
BYTE* GetLastSection(DWORD& rawSize, DWORD& virtualSize);
BYTE* Decompress(BYTE* compressedData, DWORD compressedSize, size_t& decompressedSize);
PELoader::PEImage* CreatePEImageFromMemory(BYTE* peFileBuffer, PELoader::TlsResolver* tlsResolver, LPVOID allocatedImageBase = nullptr);
};
+72
View File
@@ -0,0 +1,72 @@
#include "SectionLoaderStub.h"
#include "..\..\Shared\Decompressor\Decompressor.h"
#include "..\..\Shared\PELoader\PELoader\PELoader.h"
#include "..\..\Shared\PELoader\PELoader\PEImage.h"
#include "..\..\Shared\PELoader\PELoader\PEFile.h"
#include "..\..\Shared\ApiCaller\ApiCaller.h"
namespace PELoaderStub
{
SectionLoaderStub::SectionLoaderStub()
{
}
SectionLoaderStub::~SectionLoaderStub()
{
}
PELoader::PEImage* SectionLoaderStub::Load(PELoader::TlsResolver* tlsResolver)
{
return LoadFromSection(tlsResolver);
}
PELoader::PEImage* SectionLoaderStub::LoadFromSection(PELoader::TlsResolver* tlsResolver)
{
DWORD rawSize = 0, virtualSize = 0;
BYTE* sectionBase = GetLastSection(rawSize, virtualSize);
if (!sectionBase || rawSize == 0) return nullptr;
size_t decompressedSize = 0;
BYTE* decompressedData = Decompress(sectionBase, rawSize, decompressedSize);
SecureZeroMemory(sectionBase, virtualSize);
return CreatePEImageFromMemory(decompressedData, tlsResolver, sectionBase);
}
BYTE* SectionLoaderStub::GetLastSection(DWORD& rawSize, DWORD& virtualSize)
{
PELoader::PEImage self(ApiCaller::ApiCaller::Instance().CallGetModuleHandle(nullptr));
WORD lastSectionIndex = self.GetNumberOfSections() - 1;
PIMAGE_SECTION_HEADER lastSectionHeader = self.GetSectionHeader(lastSectionIndex);
BYTE* sectionStart = (BYTE*)self.GetImageBase() + lastSectionHeader->VirtualAddress;
rawSize = lastSectionHeader->SizeOfRawData;
virtualSize = lastSectionHeader->Misc.VirtualSize;
DWORD oldProtect = 0;
ApiCaller::ApiCaller::Instance().CallVirtualProtect(sectionStart, virtualSize, PAGE_EXECUTE_READWRITE, &oldProtect);
return sectionStart;
}
BYTE* SectionLoaderStub::Decompress(BYTE* compressedData, DWORD compressedSize, size_t& decompressedSize)
{
BYTE* decompressedData = nullptr;
Decompressor::Decompressor decompressor;
decompressor.Decompress(compressedData, compressedSize, &decompressedData, &decompressedSize);
return decompressedData;
}
PELoader::PEImage* SectionLoaderStub::CreatePEImageFromMemory(BYTE* peFileBuffer, PELoader::TlsResolver* tlsResolver, LPVOID allocatedImageBase /*= nullptr*/)
{
if (!peFileBuffer) return nullptr;
PELoader::PELoader peLoader;
PELoader::PEFile peFile(peFileBuffer);
allocatedImageBase = peLoader.LoadPE(&peFile, tlsResolver, allocatedImageBase);
delete[] peFileBuffer;
return new PELoader::PEImage(allocatedImageBase);
}
}
+31
View File
@@ -0,0 +1,31 @@
#pragma once
#include <windows.h>
namespace PELoader
{
class PEImage;
class TlsResolver;
}
namespace ResourceLoader
{
class ResourceLoader;
}
namespace PELoaderStub
{
class SectionLoaderStub
{
public:
SectionLoaderStub();
~SectionLoaderStub();
PELoader::PEImage* Load(PELoader::TlsResolver* tlsResolver);
private:
PELoader::PEImage* LoadFromSection(PELoader::TlsResolver* tlsResolver);
BYTE* GetLastSection(DWORD& rawSize, DWORD& virtualSize);
BYTE* Decompress(BYTE* compressedData, DWORD compressedSize, size_t& decompressedSize);
PELoader::PEImage* CreatePEImageFromMemory(BYTE* peFileBuffer, PELoader::TlsResolver* tlsResolver, LPVOID allocatedImageBase = nullptr);
};
}
-7
View File
@@ -11,13 +11,6 @@ namespace ResourceLoader
{
}
HRSRC ResourceLoader::FindResource(LPCWSTR resourceName, LPCWSTR resourceType)
{
HMODULE moduleHandle = ApiCaller::ApiCaller::Instance().CallGetModuleHandle(nullptr);
HRSRC resourceHandle = ApiCaller::ApiCaller::Instance().CallFindResourceW(moduleHandle, resourceName, resourceType);
return resourceHandle;
}
BYTE* ResourceLoader::LoadResource(LPCWSTR resourceName, LPCWSTR resourceType, DWORD& resourceSize)
{
resourceSize = 0;
-1
View File
@@ -9,7 +9,6 @@ namespace ResourceLoader
ResourceLoader();
~ResourceLoader();
HRSRC FindResource(LPCWSTR resourceName, LPCWSTR resourceType);
BYTE* LoadResource(LPCWSTR resourceName, LPCWSTR resourceType, DWORD& resourceSize);
void Free(BYTE* resourceBuffer);
};