A simple memory scanning library for javascript
var scanner = new MemoryScanner();
// ...
// filter out data that
// has increased by 10
scanner.filter_inc(10);
// filter out data that
// does not change
scanner.filter_unchanged();
// filter out data that
// is not an integer
scanner.filter_int();
// print remaining addresses
console.log(scanner.memory);
For server-side, install it with npm.
npm install @creuserr/memory-scanner
Then import it on your script.
const MemoryScanner = require("memory-scanner");
For client-side, import it with CDN.
<script src="https://cdn.jsdelivr.net/gh/creuserr/memory-scanner/dist/memory-scanner.min.js"></script>
{
memory: Array<Object> [{
addr: Any,
bef: Number,
aft: Number
}],
version: String,
blocked: Array<Number>,
rules: Object<Function>,
should_override: Boolean(true),
should_block: Boolean(true),
_backup: Array<Any>
}
Important
Do not modify the memory
directly. Please use push and patch to prevent inaccuracies.
To add an address, you need to call push
.
scanner.push(Any: address, Number: value);
// returns a boolean
If an error occurred (such as the address cannot be added due to being blocked, or the address has already been added), it will return false.
To modify a value by address, you need to call patch
.
scanner.patch(Any: address, Number: value);
// returns a boolean
If an error occurred (such as the address does not exist), it will return false.
If should_override
is true, any use of filters will automatically modify the memory.
You can avoid this by setting should_override
to false:
scanner.should_override = false;
If should_block
is true, filtered out addresses are added to the blacklist (named blocked
), which disallows them from being added.
You can avoid this by using:
scanner.should_block = false;
Allowing this feature will trigger block_filtered()
after the filter.
filter_eq(Number: value);
This filters out data that does not match the given value.
scanner.push(0x1, 5);
scanner.push(0x2, 10);
// filters out address 0x2
// because its value is not 5
scanner.filter_eq(5);
filter_ineq(Number: value);
This filters out data that matches the given value.
scanner.push(0x1, 5);
scanner.push(0x2, 10);
// filters out address 0x1
// because its value is 5
scanner.filter_ineq(5);
filter_changed();
This filters out data that hasn't been patched/changed.
scanner.push(0x1, 5);
scanner.push(0x2, 5);
scanner.patch(0x2, 10);
// filters out address 0x1
// because it hasn't been patched
scanner.filter_changed();
filter_unchanged();
This filters out data that has been patched/changed.
scanner.push(0x1, 5);
scanner.push(0x2, 5);
scanner.patch(0x2, 10);
// filters out address 0x2
// because it has been patched
scanner.filter_unchanged()
filter_inc(Number: by?);
This filters out data that doesn't increases its value.
When the parameter by
is defined, it is determined by the formula b + by == a
, where b is the previous value and a is the latest value.
scanner.push(0x1, 5);
scanner.push(0x2, 10);
scanner.patch(0x2, 15);
// filters out address 0x1
// because it doesn't increase
scanner.filter_inc();
filter_dec(Number: by?);
This filters out data that doesn't decreases its value.
When the parameter by
is defined, it is determined by the formula b - by == a
, where b is the previous value and a is the latest value.
scanner.push(0x1, 5);
scanner.push(0x2, 10);
scanner.patch(0x2, 5);
// filters out address 0x1
// because it doesn't
// decrease by 5
scanner.filter_dec(5);
filter_int();
This filters out data that isn't an integer.
scanner.push(0x1, 5.9);
scanner.push(0x2, 10);
// filters out address 0x1
// because its value is not an integer
scanner.filter_int();
filter_float();
This filters out data that isn't a float.
scanner.push(0x1, 5.9);
scanner.push(0x2, 10);
// filters out address 0x2
// because its value is not a float
scanner.filter_float();
filter_pos();
This filters out data that isn't a positive number.
scanner.push(0x1, -5);
scanner.push(0x2, 10);
// filters out address 0x1
// because its value is not positive
scanner.filter_pos();
filter_neg();
This filters out data that isn't a negative number.
scanner.push(0x1, -5);
scanner.push(0x2, 10);
// filters out address 0x2
// because its value is not negative
scanner.filter_neg();
filter_byte(Number: byte);
This filters out data that exceeds the value that a given byte size can carry.
It is determined by the formula 256 ** byte < a
, where a is the latest value.
scanner.push(0x1, 10);
scanner.push(0x2, 300);
// filters out address 0x2
// because a 1-byte number cannot
// carry 300
scanner.filter_byte(1);
To set up a custom filter, define it with the property rules
.
scanner.rules.even = (bef, aft, args) => {
return aft % 2 == 0;
}
Where bef is the previous value, aft is the latest value, and args is the additional arguments.
After setting it up, you can use it with filter_rule(String: name)
.
scanner.push(0x1, 2);
scanner.push(0x2, 3);
// filters out address 0x2
// because its value is not an even number
scanner.filter_rule("even");
If you want to manually block filtered addresses, you can call block_filtered()
.
Moreover, you also need to disable blocking in order to manually block addresses, due to automatic blocking after filtering, which can be prevented by should_block = false
.
This method will search for filtered out addresses and add them to the blacklist.