Yes for the moment I use GameConqueror to read addresses.
For example in C I had coded this program which allowed me to read and write to a memory address :
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/ptrace.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
struct StockPid
{
pid_t pid;
char buff[512];
FILE *pid_pipe;
} stockthepid;
void Func_StockPid(const char *processtarget)
{
stockthepid.pid_pipe = popen(processtarget, "r");
fgets(stockthepid.buff, 512, stockthepid.pid_pipe);
stockthepid.pid = strtoul(stockthepid.buff, NULL, 10);
if (stockthepid.pid == 0)
{
printf("App Var is not launch ! \n");
pclose(stockthepid.pid_pipe);
exit(-1);
}
else
{
printf("App Var is running - PID NUMBER -> {%d} \n", stockthepid.pid);
pclose(stockthepid.pid_pipe);
}
}
void ReadProcessMemory(unsigned long address, int pid) {
int buf = 0;
int err_code = ptrace(PTRACE_ATTACH, stockthepid.pid, NULL, NULL);
if (err_code == -1)
{
printf("%s\n", "error 1");
exit(-1);
}
wait(NULL);
printf("Read the adress of the process \n");
for (int i = 0; i < 1; i++)
{
buf = ptrace(PTRACE_PEEKDATA, stockthepid.pid, address + i * sizeof(int), NULL);
if (buf == -1)
{
printf("%s\n", "error 2");
exit(-1);
}
printf("%d\n", buf);
}
err_code = ptrace(PTRACE_DETACH, stockthepid.pid, NULL, NULL);
if (err_code == -1)
{
printf("%s\n", "error 3");
exit(-1);
}
}
void WriteProcessMemory(unsigned long address, int pid) {
int WhatValue = 0;
int buf = 0;
printf("Enter the new Value !\n");
scanf("%d", &WhatValue);
int err_code = ptrace(PTRACE_ATTACH, stockthepid.pid, NULL, NULL);
if (err_code == -1)
{
printf("%s\n", "error 1");
exit(-1);
}
wait(NULL);
printf("Write the new value ! \n");
for(int i = 0; i < 1; i++) {
buf = ptrace(PTRACE_POKEDATA, stockthepid.pid, address + i * sizeof(int), WhatValue);
if (buf == -1)
{
printf("%s\n", "error 2");
exit(-1);
}
printf("The new value has just been added! \n");
}
err_code = ptrace(PTRACE_DETACH, stockthepid.pid, NULL, NULL);
if (err_code == -1)
{
printf("%s\n", "error 3");
exit(-1);
}
}
int main()
{
Func_StockPid("pidof -s ac_client");
ReadProcessMemory(0x81d80ed4de, stockthepid.pid);
WriteProcessMemory(0x81d80ed4de, stockthepid.pid);
return 0;
}
I know how to get the pid with rust but I don't know how to read and write to a memory address.