From 1270999026bd77165edfffebfce277a34761710c Mon Sep 17 00:00:00 2001 From: boris Date: Wed, 12 Dec 2018 20:59:44 +1300 Subject: ) --- loader/server/client.cpp | 6 +++ loader/server/injection.hpp | 91 ++++++++++++++++++++++++++++++++++++ loader/server/server.vcxproj | 1 + loader/server/server.vcxproj.filters | 1 + 4 files changed, 99 insertions(+) create mode 100644 loader/server/injection.hpp (limited to 'loader/server') diff --git a/loader/server/client.cpp b/loader/server/client.cpp index b749f16..9893b26 100644 --- a/loader/server/client.cpp +++ b/loader/server/client.cpp @@ -1,5 +1,6 @@ #include "client.hpp" #include "server.hpp" +#include "injection.hpp" /* std::vector< byte > server::c_client::receive_message( ) { @@ -123,5 +124,10 @@ bool server::c_client::handle() { if(get_msg() != "hello") return false; + inject::c_pe_file pe_file; + + if(!pe_file.get("test.dll")) + return false; + return true; } diff --git a/loader/server/injection.hpp b/loader/server/injection.hpp new file mode 100644 index 0000000..d750bb5 --- /dev/null +++ b/loader/server/injection.hpp @@ -0,0 +1,91 @@ +#pragma once + +#include + +namespace inject { + // small wrapper for pe files + class c_pe_file { + // wew lad + bool is_valid_pe() { + IMAGE_DOS_HEADER *dos_header; + IMAGE_NT_HEADERS *nt_headers; + + // dos header, "mz" + dos_header = reinterpret_cast(m_file.data()); + + if(!dos_header || dos_header->e_magic != IMAGE_DOS_SIGNATURE) + return false; + + // nt headers, "pe00" + nt_headers = reinterpret_cast(m_file.data() + dos_header->e_lfanew); + + if(!nt_headers || nt_headers->Signature != IMAGE_NT_SIGNATURE) + return false; + + return true; + } + + public: + std::vector m_file; + + c_pe_file() = default; + + bool get(const char *name) { + std::ifstream file_handle(name, std::ios::in | std::ios::binary); + + // do not skip whitespace + file_handle.unsetf(std::ios::skipws); + + if(!file_handle.is_open()) + return false; + + // read file contents + m_file.insert( + m_file.begin(), + std::istream_iterator(file_handle), + std::istream_iterator() + ); + + file_handle.close(); + + // we read the file, check if it's a pe + if(m_file.size() > 0) + return is_valid_pe(); + + // empty file or not pe + return false; + } + + // homo wrappers + size_t size() { + return m_file.size(); + } + + uint8_t *data() { + return m_file.data(); + } + }; + + // handles reloc, overwriting pe header with cheat header + class c_inject_transaction { + c_pe_file m_file; + public: + c_inject_transaction() = default; + + bool get(c_pe_file &file) { + if(!file.size()) + return false; + + m_file = file; + return true; + } + + void process_pe_header(std::vector &cheat_header) { + std::memcpy(m_file.data(), cheat_header.data(), cheat_header.size()); + } + + bool process_reloc() { + return true; + } + }; +} \ No newline at end of file diff --git a/loader/server/server.vcxproj b/loader/server/server.vcxproj index 543a42f..63bd5da 100644 --- a/loader/server/server.vcxproj +++ b/loader/server/server.vcxproj @@ -36,6 +36,7 @@ + diff --git a/loader/server/server.vcxproj.filters b/loader/server/server.vcxproj.filters index 5ef28fc..07743d9 100644 --- a/loader/server/server.vcxproj.filters +++ b/loader/server/server.vcxproj.filters @@ -5,6 +5,7 @@ + -- cgit v1.2.3