Никак. Память читается по виртуальным адресам, а не физическим. В каждом новом процессе месторасположение нужных данных - будет меняться.
Можно сканировать память процесса на наличие нужных бинарных паттернов и таким образом определять требуемый адрес.
Как пример, но для посикса (когда-то давно писал, тащемта, в винде даже удобнее должно быть, без всяких ptrace):
Код:
void processScanMemory(pid_t pid, address_t ** addresses, int count) {
if (ptrace(PTRACE_ATTACH, pid, NULL, NULL)) {
perror("Failed attach to process");
return;
}
uint8_t bPattern[] = {
0x48, 0x89, 0x97, 0x00, 0x00, 0x00, 0x00, //mov [rdi+offset], rdx
0x0f, 0x84, 0x00, 0x00, 0x00, 0x00, //je adr
0xf3, 0xc3, 0x00, 0x00 //repz ret
};
uint8_t bMask[] = {
0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00
};
#define patternSize 4*sizeof(uint32_t)
#define dataSize patternSize+sizeof(uint32_t)
for (int i = 0; i < count; i++) {
address_t * adr = addresses[i];
long int start = adr->start;
long int end = adr->end;
#ifdef DUMP_X
char filename[128];
sprintf(filename, "./%ld_%lx-%lx.dump", (long int)pid, start, end);
FILE * dumpFd = fopen(filename, "w");
#endif
fprintf(stdout, "Scanning 0x%lx ... 0%lx\n", adr->start, adr->end);
uint8_t data[dataSize] = {0};
for (long int current = start; current < end; current += sizeof(int)) {
uint32_t word = ptrace(PTRACE_PEEKDATA, pid, (void *) current, NULL);
memmove(data, data + sizeof(uint32_t), dataSize - sizeof(uint32_t));
*((uint32_t *)&(data[dataSize - sizeof(uint32_t)])) = word;
int finded = -1;
for(int j = 0; j < sizeof(uint32_t); j++) {
int sub = 1;
for(int k = 0; k < patternSize; k++) {
if ((data[k + j] & bMask[k]) != bPattern[k]) {
sub = 0;
break;
}
}
if(sub) {
finded = j;
break;
}
}
if (finded != -1) {
for (int a = 0; a < dataSize; a++) {
fprintf(stdout, "%02x ", data[a] & 0xff);
}
fprintf(stdout, "\n");
fprintf(stdout, "Finded pattern on: 0x%lx (phy offset: 0x%lx)", current, current - start - dataSize - finded);
}
#ifdef DUMP_X
fwrite(&word, sizeof(uint32_t), 1, dumpFd);
#endif
}
#ifdef DUMP_X
fclose(dumpFd);
#endif
}
if(ptrace(PTRACE_DETACH, pid, NULL, NULL)) {
perror("Failed deattach from process\n");
}
}