Files
driverMapper/Signature/Scanner.h
2024-08-02 13:27:27 -07:00

103 lines
2.3 KiB
C++

#pragma once
// IDA search pattern library
// 4l3x777
#include <cstdint>
#include <string>
#include <Windows.h>
#include <Psapi.h>
#include <vector>
#include <optional>
#include <sstream>
#include <array>
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 <typename T>
T as() const {
return reinterpret_cast<T>(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<int32_t*>();
return add(offset + sizeof(int32_t));
}
return *this;
}
template <typename T>
T get_base() const {
return reinterpret_cast<T>(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;
};
}