diff options
| author | Orfeas <38209077+0xfea5@users.noreply.github.com> | 2024-04-21 16:27:55 +0300 |
|---|---|---|
| committer | Orfeas <38209077+0xfea5@users.noreply.github.com> | 2024-04-21 16:32:47 +0300 |
| commit | c79bbdb0448501987c0c16c2877c780143156d1e (patch) | |
| tree | ff518148959a27e0efa655b3e40c4efea074a383 /src/vm.c | |
| parent | Write other process' memory (diff) | |
| download | linux-game-trainer-c79bbdb0448501987c0c16c2877c780143156d1e.tar.gz linux-game-trainer-c79bbdb0448501987c0c16c2877c780143156d1e.zip | |
Changes in trainer interface, bug fixes & helper scripts
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 33 |
1 files changed, 26 insertions, 7 deletions
| @@ -79,7 +79,7 @@ static off_t memfind(const uint8_t *hay, size_t hay_size, const uint8_t *needle, | |||
| 79 | return hay_size; | 79 | return hay_size; |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | MemscanResult* memscan(int pid, uint8_t *byte_seq, uint64_t byte_seq_len) | 82 | MemscanResult* memscan(int pid, Bytes aob) |
| 83 | { | 83 | { |
| 84 | char fmem_path[1024] = {0}; | 84 | char fmem_path[1024] = {0}; |
| 85 | sprintf(fmem_path, "/proc/%d/mem", pid); | 85 | sprintf(fmem_path, "/proc/%d/mem", pid); |
| @@ -95,15 +95,15 @@ MemscanResult* memscan(int pid, uint8_t *byte_seq, uint64_t byte_seq_len) | |||
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | size_t region_size = cur_vmmap->end - cur_vmmap->begin; | 97 | size_t region_size = cur_vmmap->end - cur_vmmap->begin; |
| 98 | uint8_t region_data[region_size]; | 98 | uint8_t *region_data = xmalloc(region_size); |
| 99 | fseek(fmem, (off_t)cur_vmmap->begin, SEEK_SET); | 99 | fseek(fmem, (off_t)cur_vmmap->begin, SEEK_SET); |
| 100 | fread(region_data, 1, region_size, fmem); | 100 | fread(region_data, 1, region_size, fmem); |
| 101 | 101 | ||
| 102 | off_t offset = 0; | 102 | off_t offset = 0; |
| 103 | while (offset += memfind(region_data + offset, | 103 | while (offset += memfind(region_data + offset, |
| 104 | region_size - offset, | 104 | region_size - offset, |
| 105 | byte_seq, | 105 | aob.data, |
| 106 | byte_seq_len), | 106 | aob.len), |
| 107 | offset < region_size) { | 107 | offset < region_size) { |
| 108 | LOG("Matched pattern at [%p]\n", cur_vmmap->begin + (off_t)offset); | 108 | LOG("Matched pattern at [%p]\n", cur_vmmap->begin + (off_t)offset); |
| 109 | MemscanResult *new_result = xmalloc(sizeof(MemscanResult)); | 109 | MemscanResult *new_result = xmalloc(sizeof(MemscanResult)); |
| @@ -121,8 +121,9 @@ MemscanResult* memscan(int pid, uint8_t *byte_seq, uint64_t byte_seq_len) | |||
| 121 | head = cur = new_result; | 121 | head = cur = new_result; |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | offset += byte_seq_len; | 124 | offset += aob.len; |
| 125 | } | 125 | } |
| 126 | free(region_data); | ||
| 126 | 127 | ||
| 127 | cur_vmmap = cur_vmmap->next; | 128 | cur_vmmap = cur_vmmap->next; |
| 128 | } | 129 | } |
| @@ -131,15 +132,33 @@ MemscanResult* memscan(int pid, uint8_t *byte_seq, uint64_t byte_seq_len) | |||
| 131 | return head; | 132 | return head; |
| 132 | } | 133 | } |
| 133 | 134 | ||
| 134 | void memwrite(int pid, void *address, uint8_t *data, size_t data_len) | 135 | void memwrite(int pid, void *address, Bytes aob) |
| 135 | { | 136 | { |
| 136 | char fmem_path[1024] = {0}; | 137 | char fmem_path[1024] = {0}; |
| 137 | sprintf(fmem_path, "/proc/%d/mem", pid); | 138 | sprintf(fmem_path, "/proc/%d/mem", pid); |
| 138 | FILE *fmem = fopen(fmem_path, "rb+"); | 139 | FILE *fmem = fopen(fmem_path, "rb+"); |
| 139 | 140 | ||
| 140 | fseek(fmem, (off_t)address, SEEK_SET); | 141 | fseek(fmem, (off_t)address, SEEK_SET); |
| 141 | fwrite(data, 1, data_len, fmem); | 142 | fwrite(aob.data, 1, aob.len, fmem); |
| 142 | fclose(fmem); | 143 | fclose(fmem); |
| 143 | 144 | ||
| 144 | LOG("Data written successfully at address %p\n", address); | 145 | LOG("Data written successfully at address %p\n", address); |
| 145 | } | 146 | } |
| 147 | |||
| 148 | Bytes memread(int pid, void *address, size_t nbytes) | ||
| 149 | { | ||
| 150 | Bytes result = { | ||
| 151 | .data = xmalloc(nbytes), | ||
| 152 | .len = nbytes, | ||
| 153 | }; | ||
| 154 | |||
| 155 | char fmem_path[1024] = {0}; | ||
| 156 | sprintf(fmem_path, "/proc/%d/mem", pid); | ||
| 157 | FILE *fmem = fopen(fmem_path, "rb"); | ||
| 158 | |||
| 159 | fseek(fmem, (off_t)address, SEEK_SET); | ||
| 160 | fread(result.data, 1, result.len, fmem); | ||
| 161 | fclose(fmem); | ||
| 162 | |||
| 163 | return result; | ||
| 164 | } | ||
