diff options
Diffstat (limited to 'client/src/injection/mapper.cpp')
| -rw-r--r-- | client/src/injection/mapper.cpp | 90 |
1 files changed, 40 insertions, 50 deletions
diff --git a/client/src/injection/mapper.cpp b/client/src/injection/mapper.cpp index 0b993a0..052dc39 100644 --- a/client/src/injection/mapper.cpp +++ b/client/src/injection/mapper.cpp @@ -5,94 +5,84 @@ #include "mapper.h" void mmap::thread(tcp::client& client) { - while (client.mapper_data.imports.empty()) { - std::this_thread::sleep_for(std::chrono::seconds(2)); + while (client.state != tcp::client_state::imports_ready) { + std::this_thread::sleep_for(std::chrono::seconds(1)); } - std::vector<util::process> process_list; - util::fetch_processes(process_list); + util::system_data_t dat; + util::fetch_system_data(dat); - auto needle = std::find_if(process_list.begin(), process_list.end(), [&](util::process& proc) { - return proc.name() == "notepad++.exe"; + auto needle = std::find_if(dat.processes.begin(), dat.processes.end(), [&](util::process_data_t& dat) { + return dat.name == client.selected_game.process_name; }); - while (needle == process_list.end()) { - std::this_thread::sleep_for(std::chrono::seconds(2)); - - util::fetch_processes(process_list); - - io::logger->info("size {}", process_list.size()); - - io::logger->info("waiting for process.."); - - needle = std::find_if(process_list.begin(), process_list.end(), [&](util::process& proc) { - return proc.name() == "notepad++.exe"; - }); + if (needle == dat.processes.end()) { + io::log_error("failed to find process."); + return; } - if (!needle->open()) { + util::process32 proc(*needle); + + if (!proc.open()) { return; } - if (!needle->enum_modules()) { - io::logger->error("failed to enum {} modules", needle->name()); + if (!proc.enum_modules()) { + io::log_error("failed to enum {} modules", proc.name()); return; } - auto image = needle->allocate(client.mapper_data.image_size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); + auto image = proc.allocate(client.mapper_data.image_size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (!image) { - io::logger->error("failed to allocate memory for image."); + io::log_error("failed to allocate memory for image."); return; } - io::logger->info("image base : {:x}", image); + io::log("image base : {:x}", image); auto imports = nlohmann::json::parse(client.mapper_data.imports); nlohmann::json final_imports; for (auto& [key, value] : imports.items()) { - auto base = needle->load(key); + auto base = proc.load(key); if (!base) { - io::logger->error("failed to load {}", key); + io::log_error("failed to load {}", key); continue; } for (auto& i : value) { auto name = i.get<std::string>(); - final_imports[name] = needle->module_export(base, name); + final_imports[name] = proc.module_export(base, name); } } + imports.clear(); nlohmann::json resp; resp["alloc"] = image; + resp["id"] = client.selected_game.id; client.write(tcp::packet_t(resp.dump(), tcp::packet_type::write, client.session_id, tcp::packet_id::image)); + resp.clear(); - auto proc_imports = final_imports.dump(); - client.stream(proc_imports); - - proc_imports.clear(); + client.stream(final_imports.dump()); final_imports.clear(); - imports.clear(); - client.mapper_data.imports.clear(); - io::logger->info("please wait..."); - while (client.mapper_data.image.size() != client.mapper_data.image_size) { - std::this_thread::sleep_for(std::chrono::seconds(2)); + io::log("please wait..."); + while (client.state != tcp::client_state::image_ready) { + std::this_thread::sleep_for(std::chrono::seconds(1)); } - if (!needle->write(image, client.mapper_data.image.data(), client.mapper_data.image.size())) { - io::logger->error("failed to write image."); + if (!proc.write(image, client.mapper_data.image.data(), client.mapper_data.image.size())) { + io::log_error("failed to write image."); return; } - client.mapper_data.image.clear(); auto entry = image + client.mapper_data.entry; - io::logger->info("entry : {:x}", entry); + io::log("entry : {:x}", entry); static std::vector<uint8_t> shellcode = { 0x55, 0x89, 0xE5, 0x6A, 0x00, 0x6A, 0x01, 0x68, 0xEF, 0xBE, 0xAD, 0xDE, 0xB8, 0xEF, 0xBE, 0xAD, 0xDE, 0xFF, 0xD0, 0x89, 0xEC, 0x5D, 0xC3 }; @@ -100,23 +90,23 @@ void mmap::thread(tcp::client& client) { *reinterpret_cast<uint32_t*>(&shellcode[8]) = image; *reinterpret_cast<uint32_t*>(&shellcode[13]) = entry; - auto code = needle->allocate(shellcode.size(), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); - if (!needle->write(code, shellcode.data(), shellcode.size())) { - io::logger->error("failed to write shellcode."); + auto code = proc.allocate(shellcode.size(), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); + if (!proc.write(code, shellcode.data(), shellcode.size())) { + io::log_error("failed to write shellcode."); return; } - io::logger->info("shellcode : {:x}", code); - - needle->thread(code); + io::log("shellcode : {:x}", code); - needle->free(code, shellcode.size()); + proc.thread(code); - needle->close(); + proc.free(code, shellcode.size()); - io::logger->info("done"); + //proc.free(image, client.mapper_data.image_size); - client.shutdown(); + proc.close(); client.state = tcp::client_state::injected; + + io::log("done"); }
\ No newline at end of file |