From 99a30e8fdf0330acada877b8f0c71be7ee4544d7 Mon Sep 17 00:00:00 2001 From: Orange Date: Tue, 10 Mar 2026 18:55:55 +0300 Subject: [PATCH] added pattern scan to lua --- include/omath/lua/lua.hpp | 1 + source/lua/lua.cpp | 1 + source/lua/lua_pattern_scan.cpp | 100 ++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 source/lua/lua_pattern_scan.cpp diff --git a/include/omath/lua/lua.hpp b/include/omath/lua/lua.hpp index 6585740..45c0942 100644 --- a/include/omath/lua/lua.hpp +++ b/include/omath/lua/lua.hpp @@ -19,6 +19,7 @@ namespace omath::lua static void register_triangle(sol::table& omath_table); static void register_shared_types(sol::table& omath_table); static void register_engines(sol::table& omath_table); + static void register_pattern_scan(sol::table& omath_table); }; } #endif \ No newline at end of file diff --git a/source/lua/lua.cpp b/source/lua/lua.cpp index 275d86e..0d226ce 100644 --- a/source/lua/lua.cpp +++ b/source/lua/lua.cpp @@ -21,6 +21,7 @@ namespace omath::lua register_triangle(omath_table); register_shared_types(omath_table); register_engines(omath_table); + register_pattern_scan(omath_table); } } // namespace omath::lua #endif diff --git a/source/lua/lua_pattern_scan.cpp b/source/lua/lua_pattern_scan.cpp new file mode 100644 index 0000000..b28c1a8 --- /dev/null +++ b/source/lua/lua_pattern_scan.cpp @@ -0,0 +1,100 @@ +// +// Created by orange on 10.03.2026. +// +#ifdef OMATH_ENABLE_LUA +#include "omath/lua/lua.hpp" +#include +#include +#include +#include +#include +#include +#include +#endif + +namespace omath::lua +{ + void LuaInterpreter::register_pattern_scan(sol::table& omath_table) + { + omath_table.new_usertype( + "SectionScanResult", sol::no_constructor, "virtual_base_addr", + sol::readonly(&SectionScanResult::virtual_base_addr), "raw_base_addr", + sol::readonly(&SectionScanResult::raw_base_addr), "target_offset", + sol::readonly(&SectionScanResult::target_offset), sol::meta_function::to_string, + [](const SectionScanResult& r) + { + return std::format("SectionScanResult(vbase=0x{:X}, raw_base=0x{:X}, offset={})", + r.virtual_base_addr, r.raw_base_addr, r.target_offset); + }); + + // Generic scanner: accepts a Lua string as a byte buffer + auto ps_table = omath_table["PatternScanner"].get_or_create(); + ps_table["scan"] = [](const std::string& data, const std::string& pattern) -> sol::optional + { + const auto* begin = reinterpret_cast(data.data()); + const auto* end = begin + data.size(); + const auto* result = PatternScanner::scan_for_pattern(begin, end, pattern); + if (result == end) + return sol::nullopt; + return std::distance(begin, result); + }; + + auto pe_table = omath_table["PePatternScanner"].get_or_create(); + pe_table["scan_in_module"] = [](std::uintptr_t base_addr, const std::string& pattern, + sol::optional section) -> sol::optional + { + auto result = PePatternScanner::scan_for_pattern_in_loaded_module(reinterpret_cast(base_addr), + pattern, section.value_or(".text")); + if (!result) + return sol::nullopt; + return *result; + }; + pe_table["scan_in_file"] = [](const std::string& path, const std::string& pattern, + sol::optional section) -> sol::optional + { + auto result = PePatternScanner::scan_for_pattern_in_file(std::filesystem::path(path), pattern, + section.value_or(".text")); + if (!result) + return sol::nullopt; + return *result; + }; + auto elf_table = omath_table["ElfPatternScanner"].get_or_create(); + elf_table["scan_in_module"] = [](std::uintptr_t base_addr, const std::string& pattern, + sol::optional section) -> sol::optional + { + auto result = ElfPatternScanner::scan_for_pattern_in_loaded_module(reinterpret_cast(base_addr), + pattern, section.value_or(".text")); + if (!result) + return sol::nullopt; + return *result; + }; + elf_table["scan_in_file"] = [](const std::string& path, const std::string& pattern, + sol::optional section) -> sol::optional + { + auto result = ElfPatternScanner::scan_for_pattern_in_file(std::filesystem::path(path), pattern, + section.value_or(".text")); + if (!result) + return sol::nullopt; + return *result; + }; + auto macho_table = omath_table["MachOPatternScanner"].get_or_create(); + macho_table["scan_in_module"] = [](std::uintptr_t base_addr, const std::string& pattern, + sol::optional section) -> sol::optional + { + auto result = MachOPatternScanner::scan_for_pattern_in_loaded_module( + reinterpret_cast(base_addr), pattern, section.value_or("__text")); + if (!result) + return sol::nullopt; + return *result; + }; + macho_table["scan_in_file"] = [](const std::string& path, const std::string& pattern, + sol::optional section) -> sol::optional + { + auto result = MachOPatternScanner::scan_for_pattern_in_file(std::filesystem::path(path), pattern, + section.value_or("__text")); + if (!result) + return sol::nullopt; + return *result; + }; + } +} // namespace omath::lua \ No newline at end of file