Process_vm_readv, возвращающий случайные значения - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь использовать системный вызов 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, так как она просто ожидает ввода, поэтому я запутался в том, что делаю неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...