From c79bbdb0448501987c0c16c2877c780143156d1e Mon Sep 17 00:00:00 2001 From: Orfeas <38209077+0xfea5@users.noreply.github.com> Date: Sun, 21 Apr 2024 16:27:55 +0300 Subject: Changes in trainer interface, bug fixes & helper scripts --- src/vm.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) (limited to 'src/vm.c') diff --git a/src/vm.c b/src/vm.c index b33a7bf..6e04bc8 100644 --- a/src/vm.c +++ b/src/vm.c @@ -79,7 +79,7 @@ static off_t memfind(const uint8_t *hay, size_t hay_size, const uint8_t *needle, return hay_size; } -MemscanResult* memscan(int pid, uint8_t *byte_seq, uint64_t byte_seq_len) +MemscanResult* memscan(int pid, Bytes aob) { char fmem_path[1024] = {0}; sprintf(fmem_path, "/proc/%d/mem", pid); @@ -95,15 +95,15 @@ MemscanResult* memscan(int pid, uint8_t *byte_seq, uint64_t byte_seq_len) } size_t region_size = cur_vmmap->end - cur_vmmap->begin; - uint8_t region_data[region_size]; + uint8_t *region_data = xmalloc(region_size); fseek(fmem, (off_t)cur_vmmap->begin, SEEK_SET); fread(region_data, 1, region_size, fmem); off_t offset = 0; while (offset += memfind(region_data + offset, region_size - offset, - byte_seq, - byte_seq_len), + aob.data, + aob.len), offset < region_size) { LOG("Matched pattern at [%p]\n", cur_vmmap->begin + (off_t)offset); MemscanResult *new_result = xmalloc(sizeof(MemscanResult)); @@ -121,8 +121,9 @@ MemscanResult* memscan(int pid, uint8_t *byte_seq, uint64_t byte_seq_len) head = cur = new_result; } - offset += byte_seq_len; + offset += aob.len; } + free(region_data); cur_vmmap = cur_vmmap->next; } @@ -131,15 +132,33 @@ MemscanResult* memscan(int pid, uint8_t *byte_seq, uint64_t byte_seq_len) return head; } -void memwrite(int pid, void *address, uint8_t *data, size_t data_len) +void memwrite(int pid, void *address, Bytes aob) { char fmem_path[1024] = {0}; sprintf(fmem_path, "/proc/%d/mem", pid); FILE *fmem = fopen(fmem_path, "rb+"); fseek(fmem, (off_t)address, SEEK_SET); - fwrite(data, 1, data_len, fmem); + fwrite(aob.data, 1, aob.len, fmem); fclose(fmem); LOG("Data written successfully at address %p\n", address); } + +Bytes memread(int pid, void *address, size_t nbytes) +{ + Bytes result = { + .data = xmalloc(nbytes), + .len = nbytes, + }; + + char fmem_path[1024] = {0}; + sprintf(fmem_path, "/proc/%d/mem", pid); + FILE *fmem = fopen(fmem_path, "rb"); + + fseek(fmem, (off_t)address, SEEK_SET); + fread(result.data, 1, result.len, fmem); + fclose(fmem); + + return result; +} -- cgit v1.2.3