diff --git a/example/dllmain.cpp b/example/dllmain.cpp new file mode 100644 index 0000000..892b2c7 --- /dev/null +++ b/example/dllmain.cpp @@ -0,0 +1,36 @@ +#include "stdafx.hpp" + +__declspec( dllexport ) std::uint8_t entry_buffer[5]; // To be filled by mapper (Original bytes of DllEntryPoint to be restored on execution) +__declspec( dllexport ) std::uint32_t entry_rva; // RVA to the DllEntryPoint filled by mapper. + +bool dll_main( const std::uint64_t image_base, const std::uint32_t reason, const void* reserved ) +{ + const auto dbg_print = [ ]( const char* msg, ... ) -> void + { + va_list args; + va_start( args, msg ); + + char buffer[512]; + mini_vsprintf_s( buffer, sizeof(buffer), msg, args ); + LI_FN( OutputDebugStringA ).get_safe()( buffer ); + return va_end( args ); + }; + + dbg_print( "[EACMapper] Image Base: 0x%x", image_base ); + dbg_print( "[EACMapper] DllEntryPoint: 0x%x", entry_rva ); + + const auto eac_dll_fn = + reinterpret_cast( image_base + entry_rva ); + + memcpy( eac_dll_fn, &entry_buffer[ 0 ], sizeof( entry_buffer ) ); + + // EasyAntiCheat.dll returns 0 to prevent reverse engineers from using LoadLibraryA to unpack the module.... + const auto result = eac_dll_fn( image_base, reason, reserved ); + + { + dbg_print( "[EACMapper] DllMain returned: 0x%x", result ); + dbg_print( "[EACMapper] Hello World from RustClient.exe!" ); + } + + return result; +} \ No newline at end of file