Я пытаюсь использовать системный вызов process_vm_readv для чтения значения из другого процесса Linux. При попытке прочитать магическое число в известном месте я получаю случайное значение.
Я пытался написать две простые программы, чтобы посмотреть, смогу ли я заставить их работать, но у меня не получилось. Я проверил свои возвращаемые значения, и они каждый раз выполняются успешно, я просто оставил это, чтобы сделать код более понятным.
Основной файл (для чтения)
const long val = 0xDEADBEEF;
int main(int argc, char** argv) {
std::cin.get(); // keep process running so I can read from it
}
Reader
int main(int argc, char** argv) {
pid_t pid = strol(argv[1], NULL, 10);
constexpr bufferLen = sizeof(long);
char buffer[bufferLen] { 0 };
struct iovec local, remote;
local.iov_base = buffer;
local.iov_len = bufferLen;
remote.iov_base = reinterpret_cast<void*>(0x603120);
remote.iov_len = bufferLen;
ssize_t bytesRead = process_vm_readv(pid, &local, 1, &remote, 1, 0);
std::cout << reinterpret_cast<long>(local.iov_base) << std::endl;
}
Я использовал objdump, чтобы найти правильный адрес 'val' 0x603120. Я также распечатал его адрес и попробовал то же самое, просто чтобы быть уверенным.
Я ожидаю распечатать 0xDEADBEEF (хорошо, его базовую 10-ю версию), но происходит то, что он печатает разные значения каждый раз, когда вызывается «читатель», даже при запуске его с одной и той же «основной» программой; в основной программе ничего не должно изменяться в .data, так как она просто ожидает ввода, поэтому я запутался в том, что делаю неправильно.