Simplified ScopedUnprotect selection

Made SA use safer ScopedUnprotect
This commit is contained in:
Silent 2017-09-18 12:52:35 +02:00
parent 29cea98c70
commit fb672f079b
4 changed files with 41 additions and 39 deletions

View file

@ -625,12 +625,25 @@ namespace Memory
#include <forward_list> #include <forward_list>
#include <tuple> #include <tuple>
#include <memory>
namespace ScopedUnprotect namespace ScopedUnprotect
{ {
class unprotect class Unprotect
{ {
public:
~Unprotect()
{
for ( auto& it : m_queriedProtects )
{
DWORD dwOldProtect;
VirtualProtect( std::get<0>(it), std::get<1>(it), std::get<2>(it), &dwOldProtect );
}
}
protected: protected:
Unprotect() = default;
void UnprotectRange( DWORD_PTR BaseAddress, SIZE_T Size ) void UnprotectRange( DWORD_PTR BaseAddress, SIZE_T Size )
{ {
SIZE_T QueriedSize = 0; SIZE_T QueriedSize = 0;
@ -650,20 +663,11 @@ namespace ScopedUnprotect
} }
} }
~unprotect()
{
for ( auto& it : m_queriedProtects )
{
DWORD dwOldProtect;
VirtualProtect( std::get<0>(it), std::get<1>(it), std::get<2>(it), &dwOldProtect );
}
}
private: private:
std::forward_list< std::tuple< LPVOID, SIZE_T, DWORD > > m_queriedProtects; std::forward_list< std::tuple< LPVOID, SIZE_T, DWORD > > m_queriedProtects;
}; };
class Section : protected unprotect class Section : public Unprotect
{ {
public: public:
Section( HINSTANCE hInstance, const char* name ) Section( HINSTANCE hInstance, const char* name )
@ -696,7 +700,7 @@ namespace ScopedUnprotect
bool m_locatedSection = false; bool m_locatedSection = false;
}; };
class FullModule : protected unprotect class FullModule : public Unprotect
{ {
public: public:
FullModule( HINSTANCE hInstance ) FullModule( HINSTANCE hInstance )
@ -705,6 +709,16 @@ namespace ScopedUnprotect
UnprotectRange( (DWORD_PTR)hInstance, ntHeader->OptionalHeader.SizeOfImage ); UnprotectRange( (DWORD_PTR)hInstance, ntHeader->OptionalHeader.SizeOfImage );
} }
}; };
inline std::unique_ptr<Unprotect> UnprotectSectionOrFullModule( HINSTANCE hInstance, const char* name )
{
std::unique_ptr<Section> section = std::make_unique<Section>( hInstance, name );
if ( !section->SectionLocated() )
{
return std::make_unique<FullModule>( hInstance );
}
return section;
}
}; };
#endif #endif

View file

@ -890,15 +890,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
GetWindowRect(GetDesktopWindow(), &desktop); GetWindowRect(GetDesktopWindow(), &desktop);
sprintf_s(aNoDesktopMode, "Cannot find %dx%dx32 video mode", desktop.right, desktop.bottom); sprintf_s(aNoDesktopMode, "Cannot find %dx%dx32 video mode", desktop.right, desktop.bottom);
const HINSTANCE hModule = GetModuleHandle( nullptr ); std::unique_ptr<ScopedUnprotect::Unprotect> Protect = ScopedUnprotect::UnprotectSectionOrFullModule( GetModuleHandle( nullptr ), ".text" );
std::unique_ptr<ScopedUnprotect::Section> SectionProtect = std::make_unique<ScopedUnprotect::Section>( hModule, ".text" );
std::unique_ptr<ScopedUnprotect::FullModule> ModuleProtect = nullptr;
if ( !SectionProtect->SectionLocated() )
{
SectionProtect = nullptr;
ModuleProtect = std::make_unique<ScopedUnprotect::FullModule>( hModule );
}
if (*(DWORD*)0x5C1E75 == 0xB85548EC) Patch_III_10(desktop); if (*(DWORD*)0x5C1E75 == 0xB85548EC) Patch_III_10(desktop);
else if (*(DWORD*)0x5C2135 == 0xB85548EC) Patch_III_11(desktop); else if (*(DWORD*)0x5C2135 == 0xB85548EC) Patch_III_11(desktop);

View file

@ -2295,8 +2295,10 @@ BOOL InjectDelayedPatches_10()
if ( !IsAlreadyRunning() ) if ( !IsAlreadyRunning() )
{ {
using namespace Memory; using namespace Memory;
ScopedUnprotect::Section Protect( (HINSTANCE)0x400000, ".text" );
ScopedUnprotect::Section Protect2( (HINSTANCE)0x400000, ".rdata" ); const HINSTANCE hInstance = GetModuleHandle( nullptr );
std::unique_ptr<ScopedUnprotect::Unprotect> Protect = ScopedUnprotect::UnprotectSectionOrFullModule( hInstance, ".text" );
ScopedUnprotect::Section Protect2( hInstance, ".rdata" );
// Obtain a path to the ASI // Obtain a path to the ASI
wchar_t wcModulePath[MAX_PATH]; wchar_t wcModulePath[MAX_PATH];
@ -2553,8 +2555,9 @@ BOOL InjectDelayedPatches_11()
if ( !IsAlreadyRunning() ) if ( !IsAlreadyRunning() )
{ {
using namespace Memory; using namespace Memory;
ScopedUnprotect::Section Protect( (HINSTANCE)0x400000, ".text" ); const HINSTANCE hInstance = GetModuleHandle( nullptr );
ScopedUnprotect::Section Protect2( (HINSTANCE)0x400000, ".rdata" ); std::unique_ptr<ScopedUnprotect::Unprotect> Protect = ScopedUnprotect::UnprotectSectionOrFullModule( hInstance, ".text" );
ScopedUnprotect::Section Protect2( hInstance, ".rdata" );
// Obtain a path to the ASI // Obtain a path to the ASI
wchar_t wcModulePath[MAX_PATH]; wchar_t wcModulePath[MAX_PATH];
@ -2785,8 +2788,9 @@ BOOL InjectDelayedPatches_Steam()
if ( !IsAlreadyRunning() ) if ( !IsAlreadyRunning() )
{ {
using namespace Memory; using namespace Memory;
ScopedUnprotect::Section Protect( (HINSTANCE)0x400000, ".text" ); const HINSTANCE hInstance = GetModuleHandle( nullptr );
ScopedUnprotect::Section Protect2( (HINSTANCE)0x400000, ".rdata" ); std::unique_ptr<ScopedUnprotect::Unprotect> Protect = ScopedUnprotect::UnprotectSectionOrFullModule( hInstance, ".text" );
ScopedUnprotect::Section Protect2( hInstance, ".rdata" );
// Obtain a path to the ASI // Obtain a path to the ASI
wchar_t wcModulePath[MAX_PATH]; wchar_t wcModulePath[MAX_PATH];
@ -4763,9 +4767,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{ {
hDLLModule = hinstDLL; hDLLModule = hinstDLL;
HINSTANCE hGameHandle = GetModuleHandle( nullptr ); const HINSTANCE hInstance = GetModuleHandle( nullptr );
ScopedUnprotect::Section Protect( hGameHandle, ".text" ); std::unique_ptr<ScopedUnprotect::Unprotect> Protect = ScopedUnprotect::UnprotectSectionOrFullModule( hInstance, ".text" );
ScopedUnprotect::Section Protect2( hGameHandle, ".rdata" ); ScopedUnprotect::Section Protect2( hInstance, ".rdata" );
if (*(DWORD*)DynBaseAddress(0x82457C) == 0x94BF || *(DWORD*)DynBaseAddress(0x8245BC) == 0x94BF) Patch_SA_10(); if (*(DWORD*)DynBaseAddress(0x82457C) == 0x94BF || *(DWORD*)DynBaseAddress(0x8245BC) == 0x94BF) Patch_SA_10();
else if (*(DWORD*)DynBaseAddress(0x8252FC) == 0x94BF || *(DWORD*)DynBaseAddress(0x82533C) == 0x94BF) Patch_SA_11(), MessageBoxW( nullptr, L"You're using a 1.01 executable which is no longer supported by SilentPatch!\n\nI have no idea if anyone was still using it, so if you do - shoot me an e-mail!", L"SilentPatch", MB_OK | MB_ICONWARNING ); else if (*(DWORD*)DynBaseAddress(0x8252FC) == 0x94BF || *(DWORD*)DynBaseAddress(0x82533C) == 0x94BF) Patch_SA_11(), MessageBoxW( nullptr, L"You're using a 1.01 executable which is no longer supported by SilentPatch!\n\nI have no idea if anyone was still using it, so if you do - shoot me an e-mail!", L"SilentPatch", MB_OK | MB_ICONWARNING );

View file

@ -708,15 +708,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
GetWindowRect(GetDesktopWindow(), &desktop); GetWindowRect(GetDesktopWindow(), &desktop);
sprintf_s(aNoDesktopMode, "Cannot find %dx%dx32 video mode", desktop.right, desktop.bottom); sprintf_s(aNoDesktopMode, "Cannot find %dx%dx32 video mode", desktop.right, desktop.bottom);
const HINSTANCE hModule = GetModuleHandle( nullptr ); std::unique_ptr<ScopedUnprotect::Unprotect> Protect = ScopedUnprotect::UnprotectSectionOrFullModule( GetModuleHandle( nullptr ), ".text" );
std::unique_ptr<ScopedUnprotect::Section> SectionProtect = std::make_unique<ScopedUnprotect::Section>( hModule, ".text" );
std::unique_ptr<ScopedUnprotect::FullModule> ModuleProtect = nullptr;
if ( !SectionProtect->SectionLocated() )
{
SectionProtect = nullptr;
ModuleProtect = std::make_unique<ScopedUnprotect::FullModule>( hModule );
}
if(*(DWORD*)0x667BF5 == 0xB85548EC) Patch_VC_10(desktop); if(*(DWORD*)0x667BF5 == 0xB85548EC) Patch_VC_10(desktop);
else if(*(DWORD*)0x667C45 == 0xB85548EC) Patch_VC_11(desktop); else if(*(DWORD*)0x667C45 == 0xB85548EC) Patch_VC_11(desktop);