diff options
| author | boris <wzn@moneybot.cc> | 2018-11-28 16:00:02 +1300 |
|---|---|---|
| committer | boris <wzn@moneybot.cc> | 2018-11-28 16:00:02 +1300 |
| commit | 3d412a4b30a9f7c7f51ea6562e694315948bd3da (patch) | |
| tree | 26d67dfd1f3e5fd12903ad13e85d0cb8bcf8f21c /internal_rewrite/factory.cpp | |
| parent | e4729e4393d90271a3814c7a79950a660c48325a (diff) | |
cleaned up
in short, the cheat and loader are now separate solutions. unused stuff was moved into the legacy solution in case anyone wants to compile it or whatever.
i can change this back if you want to. also, i configured the loader to compile in x64, and have separate build types for linux and win64
Diffstat (limited to 'internal_rewrite/factory.cpp')
| -rw-r--r-- | internal_rewrite/factory.cpp | 110 |
1 files changed, 0 insertions, 110 deletions
diff --git a/internal_rewrite/factory.cpp b/internal_rewrite/factory.cpp deleted file mode 100644 index 0e7bc03..0000000 --- a/internal_rewrite/factory.cpp +++ /dev/null @@ -1,110 +0,0 @@ -#include "factory.hpp" -#ifndef IFACE_DLLMAIN -#include "fnv.hpp" - -#include <algorithm> - -NAMESPACE_REGION( factory ) -NAMESPACE_REGION( interfaces ) - -//iterate all exports inside of a module and find createinterface -uintptr_t c_interface_manager::find_createinterface( void* module_ ) { - IMAGE_DOS_HEADER* dos_header; - IMAGE_NT_HEADERS* nt_headers; - uintptr_t export_address; - IMAGE_EXPORT_DIRECTORY* export_dir; - const char* export_name; - uintptr_t* names; - uintptr_t* funcs; - uint16_t* ords; - uint32_t export_hash; - - dos_header = reinterpret_cast< decltype( dos_header ) >( uintptr_t( module_ ) ); - nt_headers = reinterpret_cast< decltype( nt_headers ) >( uintptr_t( module_ ) + dos_header->e_lfanew ); - - //find addresses of functions from nt headers - export_address = nt_headers->OptionalHeader.DataDirectory[ 0 ].VirtualAddress; - export_dir = reinterpret_cast< decltype( export_dir ) >( uintptr_t( module_ ) + export_address ); - - if ( !export_dir->NumberOfFunctions ) - return uintptr_t{ }; - - names = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfNames ); - funcs = reinterpret_cast< uintptr_t* >( uintptr_t( module_ ) + export_dir->AddressOfFunctions ); - - ords = reinterpret_cast< uint16_t* >( uintptr_t( module_ ) + export_dir->AddressOfNameOrdinals ); - - if ( names && funcs && ords ) { - //iterate the exports - for ( size_t i{ }; i < export_dir->NumberOfNames; ++i ) { - export_name = reinterpret_cast< const char* >( uintptr_t( module_ ) + names[ i ] ); - export_hash = hash::fnv1a( export_name ); - - if ( export_hash == fnv( "CreateInterface" ) ) { - return uintptr_t( module_ ) + funcs[ ords[ i ] ]; - } - } - } - - return uintptr_t{ }; -} - -c_interface_manager::c_interface_manager( ) { - auto teb = reinterpret_cast< PTEB >( __readfsdword( uintptr_t( &static_cast< NT_TIB* >( nullptr )->Self ) ) ); - auto peb = teb->ProcessEnvironmentBlock; - - auto root = &peb->Ldr->InMemoryOrderModuleList; - //iterate module list - for ( auto entry = root->Flink->Flink->Flink->Flink; entry != root; entry = entry->Flink ) { - PLDR_DATA_TABLE_ENTRY data_table; - HMODULE module_base; - uintptr_t create_interface_export; - uintptr_t create_interface_; - uintptr_t* list_iterator_ptr; - interface_iterator_t* list_iterator; - - data_table = reinterpret_cast< PLDR_DATA_TABLE_ENTRY >( entry ); - module_base = reinterpret_cast< HMODULE >( data_table->Reserved2[ 0 ] ); - create_interface_export = find_createinterface( module_base ); - - if ( !create_interface_export || !is_createinterface_export( create_interface_export ) ) { - continue; - } - - //find the createinterface function - create_interface_ = follow_createinterface_export( create_interface_export ); - if ( !is_createinterface_fn( create_interface_ ) ) { - continue; - } - - //find the list iterator - list_iterator_ptr = find_list_ptr( create_interface_ ); - - //iterate the interface list - for ( list_iterator = reinterpret_cast< interface_iterator_t* >( - list_iterator_ptr ); - !!list_iterator; - list_iterator = list_iterator->m_next - ) { - std::string name( list_iterator->m_name ); - std::string module_name( util::unicode_to_ascii( - std::wstring( data_table->FullDllName.Buffer, data_table->FullDllName.Length ) ) ); - - uintptr_t ptr = static_cast< uintptr_t( *)( ) >( list_iterator->m_create_fn )( ); - - size_t version = [ & ]( ) { - std::string ret( name ); - ret.erase( std::remove_if( ret.begin( ), ret.end( ), - [ & ]( int i ) { return !::isdigit( i ); } - ), ret.end( ) ); - return atoi( ret.c_str( ) ); - }( ); - - m_interfaces.emplace_back( interface_data_t{ name, module_name, version, ptr } ); - } - } -} - -END_REGION -END_REGION -#endif
\ No newline at end of file |
