#pragma once // IDA search pattern library // 4l3x777 #include #include #include #include #include #include #include #include namespace scanner { class handle { public: handle() = default; explicit handle(uintptr_t address, uintptr_t module_handle) : m_address(address), m_module_handle(module_handle) {} template T as() const { return reinterpret_cast(m_address); } handle add(uintptr_t offset) const { if (m_address != 0) { return handle(m_address + offset, m_module_handle); } return *this; } handle sub(uintptr_t offset) const { if (m_address != 0) { return handle(m_address - offset, m_module_handle); } return *this; } handle rip() const { if (m_address != 0) { auto offset = *as(); return add(offset + sizeof(int32_t)); } return *this; } template T get_base() const { return reinterpret_cast(m_module_handle); } private: uintptr_t m_address = 0; uintptr_t m_module_handle = 0; }; class _module { public: _module(const char* module) : m_module(module) { m_module_handle = LoadLibraryA(m_module); } handle get_export(const char* func) { return handle((std::uintptr_t)GetProcAddress(m_module_handle, func), (std::uintptr_t)m_module_handle); } HMODULE get_handle() { return m_module_handle; } private: const char* m_module; HMODULE m_module_handle; }; class pattern { public: pattern(const std::string& module); ~pattern() noexcept; pattern& scan_now(const char* sig_name, const char* ida_sig, const char* section_name = nullptr); handle get_result(); private: std::string m_module_name; _module m_module; size_t m_module_size; HMODULE m_module_handle; handle m_result; }; }