From 5e10af434438701b175ccf42c489ae75b250837d Mon Sep 17 00:00:00 2001 From: aixxe Date: Tue, 20 Dec 2016 20:14:58 +0000 Subject: [PATCH] Add basic pattern scanner. Signed-off-by: aixxe --- src/Utilities/FindPattern.h | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/Utilities/FindPattern.h diff --git a/src/Utilities/FindPattern.h b/src/Utilities/FindPattern.h new file mode 100644 index 0000000..19d052e --- /dev/null +++ b/src/Utilities/FindPattern.h @@ -0,0 +1,29 @@ +#pragma once + +// Slightly modified version of P47R!CK & dom1n1k's pattern scanner. +inline bool Compare(const uint8_t* data, const uint8_t* pattern, const char* mask) { + for (; *mask; ++mask, ++data, ++pattern) { + if (*mask == 'x' && *data != *pattern) { + return false; + } + } + + return *mask == 0; +} + +static uintptr_t FindPattern(const char* library, const char* pattern_string, const char* mask) { + size_t address = 0, length = 0; + + if (!Linker::GetLibraryInformation(library, &address, &length)) + return 0; + + const uint8_t* pattern = reinterpret_cast(pattern_string); + + for (size_t i = 0; i < length; i++) { + if (Compare(reinterpret_cast(address + i), pattern, mask)) { + return address + i; + } + } + + return 0; +} \ No newline at end of file