mirror of
https://github.com/Fatmike-GH/Fatpack
synced 2026-06-06 15:44:28 +00:00
Splitted PELoaderStubs
This commit is contained in:
+14
@@ -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
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace Packer
|
||||
|
||||
bool ResourcePacker::PrepareLoaderStub()
|
||||
{
|
||||
if (!_packerUtils->PrepareLoaderStub(_inputFile, _peLoader))
|
||||
if (!_packerUtils->PrepareResourceLoaderStub(_inputFile, _peLoader))
|
||||
{
|
||||
SetLastError(_packerUtils->GetLastError());
|
||||
return false;
|
||||
|
||||
@@ -51,7 +51,7 @@ namespace Packer
|
||||
|
||||
bool SectionPacker::PrepareLoaderStub()
|
||||
{
|
||||
if (!_packerUtils->PrepareLoaderStub(_inputFile, _peLoader))
|
||||
if (!_packerUtils->PrepareSectionLoaderStub(_inputFile, _peLoader))
|
||||
{
|
||||
SetLastError(_packerUtils->GetLastError());
|
||||
return false;
|
||||
|
||||
@@ -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"
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user