From 2ef25b0ce86c3d0d0016bd4c599770ced347397b Mon Sep 17 00:00:00 2001 From: Orange Date: Wed, 4 Feb 2026 18:29:55 +0300 Subject: [PATCH 1/5] added resharper ignore segment --- source/utility/macho_pattern_scan.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/utility/macho_pattern_scan.cpp b/source/utility/macho_pattern_scan.cpp index e4d1ef9..e2a9892 100644 --- a/source/utility/macho_pattern_scan.cpp +++ b/source/utility/macho_pattern_scan.cpp @@ -22,6 +22,7 @@ namespace constexpr std::uint32_t lc_segment = 0x1; constexpr std::uint32_t lc_segment_64 = 0x19; + // ReSharper disable CppDeclaratorNeverUsed // Mach-O header for 32-bit struct MachHeader32 final { @@ -118,7 +119,7 @@ namespace std::uint32_t reserved2; std::uint32_t reserved3; }; - + // ReSharper enable CppDeclaratorNeverUsed #pragma pack(pop) enum class MachOArch : std::int8_t From d64d60cfcd838e04a105f36c60e6049cc69e25cc Mon Sep 17 00:00:00 2001 From: Orange Date: Wed, 4 Feb 2026 18:30:45 +0300 Subject: [PATCH 2/5] fixed codestyle --- source/utility/macho_pattern_scan.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/utility/macho_pattern_scan.cpp b/source/utility/macho_pattern_scan.cpp index e2a9892..dd3aad7 100644 --- a/source/utility/macho_pattern_scan.cpp +++ b/source/utility/macho_pattern_scan.cpp @@ -227,7 +227,7 @@ namespace [[nodiscard]] std::optional get_macho_section_by_name(const std::filesystem::path& path, - const std::string_view& section_name) + const std::string_view& section_name) { std::fstream file(path, std::ios::binary | std::ios::in); @@ -244,8 +244,7 @@ namespace if (arch.value() == MachOArch::x64) return extract_section_impl(file, section_name); - else - return extract_section_impl(file, section_name); + return extract_section_impl(file, section_name); } template @@ -310,8 +309,8 @@ namespace omath std::memcpy(&magic, base, sizeof(magic)); if (magic == mh_magic_64 || magic == mh_cigam_64) - return scan_in_module_impl( - base, pattern, target_section_name); + return scan_in_module_impl(base, pattern, + target_section_name); if (magic == mh_magic_32 || magic == mh_cigam_32) return scan_in_module_impl(base, pattern, From c25a3da196bf0c08c5b0c4013b908fe2a7424e68 Mon Sep 17 00:00:00 2001 From: Orange Date: Wed, 4 Feb 2026 18:33:05 +0300 Subject: [PATCH 3/5] removed nesting --- source/utility/macho_pattern_scan.cpp | 45 +++++++++++++-------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/source/utility/macho_pattern_scan.cpp b/source/utility/macho_pattern_scan.cpp index dd3aad7..968b80a 100644 --- a/source/utility/macho_pattern_scan.cpp +++ b/source/utility/macho_pattern_scan.cpp @@ -259,32 +259,31 @@ namespace { const auto* lc = reinterpret_cast(base + cmd_offset); - if (lc->cmd == segment_cmd) + if (lc->cmd != segment_cmd) { - const auto* segment = reinterpret_cast(base + cmd_offset); - std::size_t sect_offset = cmd_offset + sizeof(SegmentType); - - for (std::uint32_t j = 0; j < segment->nsects; ++j) - { - const auto* section = reinterpret_cast(base + sect_offset); - - if (get_section_name(section->sectname) == target_section_name && section->size > 0) - { - const auto* section_begin = base + static_cast(section->addr); - const auto* section_end = section_begin + static_cast(section->size); - - const auto scan_result = - omath::PatternScanner::scan_for_pattern(section_begin, section_end, pattern); - - if (scan_result != section_end) - return reinterpret_cast(scan_result); - } - - sect_offset += sizeof(SectionType); - } + cmd_offset += lc->cmdsize; + continue; } + const auto* segment = reinterpret_cast(base + cmd_offset); + std::size_t sect_offset = cmd_offset + sizeof(SegmentType); - cmd_offset += lc->cmdsize; + for (std::uint32_t j = 0; j < segment->nsects; ++j) + { + const auto* section = reinterpret_cast(base + sect_offset); + + if (get_section_name(section->sectname) != target_section_name && section->size > 0) + { + sect_offset += sizeof(SectionType); + continue; + } + const auto* section_begin = base + static_cast(section->addr); + const auto* section_end = section_begin + static_cast(section->size); + + const auto scan_result = omath::PatternScanner::scan_for_pattern(section_begin, section_end, pattern); + + if (scan_result != section_end) + return reinterpret_cast(scan_result); + } } return std::nullopt; From 8dd044fa1e7571cdbdf6a2dd7f1bea06e599665e Mon Sep 17 00:00:00 2001 From: Orange Date: Wed, 4 Feb 2026 18:35:04 +0300 Subject: [PATCH 4/5] removed nesting --- source/utility/macho_pattern_scan.cpp | 59 ++++++++++++++------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/source/utility/macho_pattern_scan.cpp b/source/utility/macho_pattern_scan.cpp index 968b80a..b4e399c 100644 --- a/source/utility/macho_pattern_scan.cpp +++ b/source/utility/macho_pattern_scan.cpp @@ -184,42 +184,43 @@ namespace if (!file.read(reinterpret_cast(&lc), sizeof(lc))) [[unlikely]] return std::nullopt; - if (lc.cmd == segment_cmd) + if (lc.cmd != segment_cmd) { - SegmentType segment{}; - file.seekg(cmd_offset, std::ios_base::beg); - if (!file.read(reinterpret_cast(&segment), sizeof(segment))) [[unlikely]] + cmd_offset += static_cast(lc.cmdsize); + continue; + } + SegmentType segment{}; + file.seekg(cmd_offset, std::ios_base::beg); + if (!file.read(reinterpret_cast(&segment), sizeof(segment))) [[unlikely]] + return std::nullopt; + + std::streamoff sect_offset = cmd_offset + static_cast(sizeof(segment)); + + for (std::uint32_t j = 0; j < segment.nsects; ++j) + { + SectionType section{}; + file.seekg(sect_offset, std::ios_base::beg); + if (!file.read(reinterpret_cast(§ion), sizeof(section))) [[unlikely]] return std::nullopt; - std::streamoff sect_offset = cmd_offset + static_cast(sizeof(segment)); - - for (std::uint32_t j = 0; j < segment.nsects; ++j) + if (get_section_name(section.sectname) != section_name) { - SectionType section{}; - file.seekg(sect_offset, std::ios_base::beg); - if (!file.read(reinterpret_cast(§ion), sizeof(section))) [[unlikely]] - return std::nullopt; - - if (get_section_name(section.sectname) == section_name) - { - ExtractedSection out; - out.virtual_base_addr = static_cast(section.addr); - out.raw_base_addr = static_cast(section.offset); - out.data.resize(static_cast(section.size)); - - file.seekg(static_cast(section.offset), std::ios_base::beg); - if (!file.read(reinterpret_cast(out.data.data()), - static_cast(out.data.size()))) [[unlikely]] - return std::nullopt; - - return out; - } - sect_offset += static_cast(sizeof(section)); + continue; } - } - cmd_offset += static_cast(lc.cmdsize); + ExtractedSection out; + out.virtual_base_addr = static_cast(section.addr); + out.raw_base_addr = static_cast(section.offset); + out.data.resize(static_cast(section.size)); + + file.seekg(static_cast(section.offset), std::ios_base::beg); + if (!file.read(reinterpret_cast(out.data.data()), static_cast(out.data.size()))) + [[unlikely]] + return std::nullopt; + + return out; + } } return std::nullopt; From dbad87de0ffb74a77b32d587ffcf49d4cdd8b814 Mon Sep 17 00:00:00 2001 From: Orange Date: Wed, 4 Feb 2026 19:10:06 +0300 Subject: [PATCH 5/5] fixed bug --- source/utility/macho_pattern_scan.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/utility/macho_pattern_scan.cpp b/source/utility/macho_pattern_scan.cpp index b4e399c..84aa14c 100644 --- a/source/utility/macho_pattern_scan.cpp +++ b/source/utility/macho_pattern_scan.cpp @@ -194,6 +194,11 @@ namespace if (!file.read(reinterpret_cast(&segment), sizeof(segment))) [[unlikely]] return std::nullopt; + if (!segment.nsects) + { + cmd_offset += static_cast(lc.cmdsize); + continue; + } std::streamoff sect_offset = cmd_offset + static_cast(sizeof(segment)); for (std::uint32_t j = 0; j < segment.nsects; ++j)