Как считать значение нужного CPU регистра?

Доброго дня.
есть C# приложение, читающее память стороннего процесса.
По маске (F3 0F 11 8F 88 00 00 00) находим адрес инструкции, считывающей нужное значение.
В приложении он равен 7FF7548006C5, так же как и на картинке.
624046a947683697693395.png
Окончательное значение, которое нужно считать находится по адресу в регистре rdi +0х88, тоесть в моем случае мне надо получить 0x204E31A5BB8, чтобы считать из него float

Как я понял, считать значение регистра можно только используя С++ .
Буду только рад, если это ни так и его можно считать напрямую из C# - тогда подскажите как.
Подозреваю, что считывать это значение нужно в "контексте исследуемого приложения" - пока плохо представляю, как это сделать из С++, но на данном этапе это не важно.
Я пытаюсь скомпилировать С++ Dll которую я буду дергать из C# с кодом, который я нашел здесь: https://stackoverflow.com/questions/2114163/readin...
#include <stdio.h>
long Get_rdi() {
    register long x asm("rdi");
    long y = *(&x);
    return y;
}

62404beede8fc789005935.png
62404c4d760b9344280456.png
Проблема в том, что функция не компилируется.
Возможно что-то ни так с настройками проекта/VS или не хватает какого-то заголовка?
  • Вопрос задан
  • 371 просмотр
Пригласить эксперта
Ответы на вопрос 1
ValdikSS
@ValdikSS
Вам нужно отлаживать этот процесс. Просто так, статически, не меняя код процесса (чтобы вставить программную точку останова/бесконечный цикл) и не отлаживая его (чтобы использовать аппаратную точку останова), вы не сможете получить значение rdi.

Лет 15 назад я занимался написанием кейгенов, а когда это было нецелесообразно, скучно или долго, делал снифферы кодов.
Подробно процесс создания сниффера расписан в ARTeam Ezine #2: https://www.exploit-db.com/ezines/kr5hou2zh4qtebqk...

Before the actual coding part, let’s think for a minute what we need to do:
• start the program in suspended mode
• read the original bytes we are going to patch at the magic address
• write some bytes at the magic address, to make program enter an infinite-loop
• let the program run
• monitor if the program arrived at the infinite-loop (at magic address)
• if previous step is done, suspend the program and sniff the serial from EAX
• restore the original bytes (clear the infinite-loop) and resume the program
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы