mirror of
https://github.com/entropykit/entropia
synced 2026-06-24 06:05:04 +00:00
40 lines
977 B
Plaintext
40 lines
977 B
Plaintext
|
|
fn opsec_xor_region(addr: u64, length: u64, key: u8) -> void {
|
|
var p: char* = (char*)addr;
|
|
var i: u64 = 0;
|
|
while i < length {
|
|
p[i] = p[i] ^ key;
|
|
i = i + 1;
|
|
}
|
|
ret;
|
|
}
|
|
|
|
fn opsec_anchor() -> u64 {
|
|
var addr: u64;
|
|
asm {
|
|
lea rax, opsec_anchor
|
|
mov %addr, rax
|
|
}
|
|
ret addr;
|
|
}
|
|
|
|
fn opsec_set_protect(addr: u64, length: u64, new_protect: u32, old_out: u32*) -> bool {
|
|
var ok: int = Kernel32.VirtualProtect(
|
|
(void*)addr, length, new_protect, old_out);
|
|
if ok == 0 { ret false; }
|
|
ret true;
|
|
}
|
|
|
|
fn opsec_mask_region(addr: u64, length: u64, key: u8) -> bool {
|
|
var old: u32 = 0;
|
|
// PAGE_READWRITE = 0x04 - strips execute, allows write.
|
|
if opsec_set_protect(addr, length, 0x04, &old) == false {
|
|
ret false;
|
|
}
|
|
opsec_xor_region(addr, length, key);
|
|
var dummy: u32 = 0;
|
|
// Restore. old was set by the first call.
|
|
opsec_set_protect(addr, length, old, &dummy);
|
|
ret true;
|
|
}
|