commit 450e7ee8593b0b00fe95216b7613cf9973877512
parent a160be8fd398ba9bf7b3977d5dd049ed157a835f
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date: Tue, 7 Nov 2023 23:59:39 +0100
fix(native): module size
Diffstat:
1 file changed, 36 insertions(+), 5 deletions(-)
diff --git a/native/jni/src/util.h b/native/jni/src/util.h
@@ -47,12 +47,12 @@ namespace util {
continue;
}
- if (flags[0] != 'r' || flags[2] != 'x') {
- continue;
+ if (addr == 0 && flags[0] == 'r' && flags[2] == 'x') {
+ addr = start - offset;
+ }
+ if (addr != 0) {
+ size += end - start;
}
- addr = start - offset;
- size = end - start;
- break;
}
fclose(file);
return {addr, size};
@@ -96,4 +96,35 @@ namespace util {
}
return 0;
}
+
+ std::vector<uintptr_t> find_signatures(uintptr_t module_base, uintptr_t size, const std::string &pattern, int offset = 0) {
+ std::vector<uintptr_t> results;
+ std::vector<char> bytes;
+ std::vector<char> mask;
+
+ for (size_t i = 0; i < pattern.size(); i += 3) {
+ if (pattern[i] == '?') {
+ bytes.push_back(0);
+ mask.push_back('?');
+ } else {
+ bytes.push_back(std::stoi(pattern.substr(i, 2), nullptr, 16));
+ mask.push_back('x');
+ }
+ }
+
+ for (size_t i = 0; i < size; i++) {
+ bool found = true;
+ for (size_t j = 0; j < bytes.size(); j++) {
+ if (mask[j] == '?' || bytes[j] == *(char *) (module_base + i + j)) {
+ continue;
+ }
+ found = false;
+ break;
+ }
+ if (found) {
+ results.push_back(module_base + i + offset);
+ }
+ }
+ return results;
+ }
}
\ No newline at end of file