aboutsummaryrefslogtreecommitdiffstats
path: root/src/vm.c
diff options
context:
space:
mode:
authorOrfeas <38209077+0xfea5@users.noreply.github.com>2024-04-21 16:27:55 +0300
committerOrfeas <38209077+0xfea5@users.noreply.github.com>2024-04-21 16:32:47 +0300
commitc79bbdb0448501987c0c16c2877c780143156d1e (patch)
treeff518148959a27e0efa655b3e40c4efea074a383 /src/vm.c
parentWrite other process' memory (diff)
downloadlinux-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.c33
1 files changed, 26 insertions, 7 deletions
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,
79 return hay_size; 79 return hay_size;
80} 80}
81 81
82MemscanResult* memscan(int pid, uint8_t *byte_seq, uint64_t byte_seq_len) 82MemscanResult* 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
134void memwrite(int pid, void *address, uint8_t *data, size_t data_len) 135void 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
148Bytes 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}