From 77b52da44b263df4884be2f35f885d8edccbb6fa Mon Sep 17 00:00:00 2001 From: boris Date: Wed, 19 Dec 2018 00:13:24 +1300 Subject: added new loader project :) merry christmas --- loader/server/injection.hpp | 62 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 3 deletions(-) (limited to 'loader/server/injection.hpp') diff --git a/loader/server/injection.hpp b/loader/server/injection.hpp index d750bb5..d014e4c 100644 --- a/loader/server/injection.hpp +++ b/loader/server/injection.hpp @@ -36,7 +36,7 @@ namespace inject { // do not skip whitespace file_handle.unsetf(std::ios::skipws); - if(!file_handle.is_open()) + if(!file_handle.is_open()) return false; // read file contents @@ -72,6 +72,8 @@ namespace inject { public: c_inject_transaction() = default; + std::vector m_image; + bool get(c_pe_file &file) { if(!file.size()) return false; @@ -81,11 +83,65 @@ namespace inject { } void process_pe_header(std::vector &cheat_header) { + // copy over cheat header std::memcpy(m_file.data(), cheat_header.data(), cheat_header.size()); } - bool process_reloc() { - return true; + uint32_t size_of_image() { + IMAGE_DOS_HEADER *dos_header; + IMAGE_NT_HEADERS *nt_headers; + + // read pe header + dos_header = reinterpret_cast(m_file.data()); + nt_headers = reinterpret_cast(m_file.data() + dos_header->e_lfanew); + + // epic + return (uint32_t)nt_headers->OptionalHeader.SizeOfImage; + } + + void process_reloc(uint32_t remote_address) { + IMAGE_DOS_HEADER *dos_header; + IMAGE_NT_HEADERS *nt_headers; + + // read pe header + dos_header = reinterpret_cast(m_file.data()); + nt_headers = reinterpret_cast(m_file.data() + dos_header->e_lfanew); + + // copy over image + m_image.reserve(size_of_image()); + + // process reloc + IMAGE_SECTION_HEADER *sections; + sections = reinterpret_cast((uintptr_t)m_file.data() + dos_header->e_lfanew + sizeof IMAGE_NT_HEADERS); + for(size_t i{ }; i < nt_headers->FileHeader.NumberOfSections; ++i) { + auto section = sections[i]; + uintptr_t address = (uintptr_t)m_image.data() + section.VirtualAddress; + memcpy((void*)address, + (void*)(uintptr_t(m_file.data()) + section.PointerToRawData), + (size_t)section.SizeOfRawData); + } + + auto base = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress; + auto base_reloc = (IMAGE_BASE_RELOCATION*)((uintptr_t)m_file.data() + base); + auto delta = remote_address - nt_headers->OptionalHeader.ImageBase; + + while(base_reloc->VirtualAddress) { + if(base_reloc->SizeOfBlock >= sizeof(IMAGE_BASE_RELOCATION)) { + size_t count = (base_reloc->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(uint16_t); + + auto list = (uint16_t*)(base_reloc + 1); + + uint32_t* ptr{ }; + for(size_t i{ }; i < count; ++i) { + if(list[i]) { + ptr = (uint32_t*)((uintptr_t)(m_image.data())+(base_reloc->VirtualAddress + (list[i] & 0xfff))); + *ptr += delta; + } + } + } + + base_reloc = (IMAGE_BASE_RELOCATION*)((uintptr_t)base_reloc + base_reloc->SizeOfBlock); + } } }; } \ No newline at end of file -- cgit v1.2.3