summaryrefslogtreecommitdiff
path: root/loader/server
diff options
context:
space:
mode:
authorboris <wzn@moneybot.cc>2018-12-19 00:13:24 +1300
committerboris <wzn@moneybot.cc>2018-12-19 00:13:24 +1300
commit77b52da44b263df4884be2f35f885d8edccbb6fa (patch)
tree54a9a07c67d507cb5120ae7e4ee86669dfec7c6b /loader/server
parent1270999026bd77165edfffebfce277a34761710c (diff)
added new loader project :)
merry christmas
Diffstat (limited to 'loader/server')
-rw-r--r--loader/server/client.cpp15
-rw-r--r--loader/server/injection.hpp62
-rw-r--r--loader/server/server.vcxproj1
3 files changed, 75 insertions, 3 deletions
diff --git a/loader/server/client.cpp b/loader/server/client.cpp
index 9893b26..b800da1 100644
--- a/loader/server/client.cpp
+++ b/loader/server/client.cpp
@@ -129,5 +129,20 @@ bool server::c_client::handle() {
if(!pe_file.get("test.dll"))
return false;
+ printf("file read\n");
+
+ inject::c_inject_transaction transaction;
+
+ if(!transaction.get(pe_file))
+ return false;
+
+ printf("starting transaction\n");
+
+ transaction.process_reloc(0x10000000);
+
+ printf("reloc processed\n");
+
+
+
return true;
}
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<uint8_t> 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<uint8_t> &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<decltype(dos_header)>(m_file.data());
+ nt_headers = reinterpret_cast<decltype(nt_headers)>(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<decltype(dos_header)>(m_file.data());
+ nt_headers = reinterpret_cast<decltype(nt_headers)>(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<decltype(sections)>((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
diff --git a/loader/server/server.vcxproj b/loader/server/server.vcxproj
index 63bd5da..d977f60 100644
--- a/loader/server/server.vcxproj
+++ b/loader/server/server.vcxproj
@@ -218,6 +218,7 @@
<RuntimeTypeInfo>false</RuntimeTypeInfo>
<LanguageStandard>stdcpplatest</LanguageStandard>
<CallingConvention>FastCall</CallingConvention>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>