Сканирование всех адресов в ProcessMemory - PullRequest
0 голосов
/ 10 июля 2011

Я довольно новичок в C ++, и я решил создать простой "сканер", который будет сканировать все адреса процесса и печатать значения. Я начинаю с калькулятора appliction, и это мой код

Редактировать: я изменил свой код на это

int main()
{
    HWND h_wnd = FindWindow("Calculator", 0);
    DWORD pid;
    GetWindowThreadProcessId(h_wnd, &pid);
    HANDLE h_calc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    int someValue;
    for(int i = 0; i < 1000; i++) {

        void *address = (void*)i;
         ReadProcessMemory(h_calc, address, &someValue, 4, 0);
    cout << "Address: " << address << " " << someValue << endl;
    }
    system("pause");
    return EXIT_SUCCESS;
}

И это то, что я получаю за каждый адрес

Address: 000003DB -858993460
Address: 000003DC -858993460
Address: 000003DD -858993460
Address: 000003DE -858993460
Address: 000003DF -858993460
Address: 000003E0 -858993460
Address: 000003E1 -858993460
Address: 000003E2 -858993460
Address: 000003E3 -858993460
Address: 000003E4 -858993460
Address: 000003E5 -858993460
Address: 000003E6 -858993460
Address: 000003E7 -858993460

Что я делаю не так?

но я хочу, чтобы он нашел ВСЕ адреса и распечатал их значения. Я понимаю, что это может быть много, чтобы распечатать, но я просто хочу увидеть это для результатов.

Любая помощь очень ценится, спасибо!

Ответы [ 5 ]

1 голос
/ 10 июля 2011

Вы на самом деле не делаете ничего плохого, просто ваши результаты не настолько интересны (с точки зрения данных ... не должны звучать оскорбительно).

Значение -858993460 просто 0xcccccccc, которые используются компиляторами Microsoft для обнаружения переполнения памяти.Часто память за пределами ваших выделенных значений инициализируется специальным значением, так что если вы его получите, вы сразу поймете, что вы получаете доступ к тому месту, которое вы не хотели (или не должны).Еще один шаблон, который используют многие, - 0xDEADBEEF, просто потому, что это странное значение, которое что-то прописывает при печати в шестнадцатеричном формате.

1 голос
/ 10 июля 2011

OpenProcess и ReadProcessMemeory доступны только для процессов в режиме отладки:

См. Руководство здесь http://msdn.microsoft.com/en-us/library/ms684320(v=vs.85).aspx для получения дополнительной информации

Проверьте возвращаемые значения этих двух вызовов и посмотрите, чтоВы получаете.

1 голос
/ 10 июля 2011

Вместо

int addr = 0xFFFFFF;

Не можете ли вы выбрать

void *addr = 0;

Для адресной цели.

0 голосов
/ 10 июля 2011

Поскольку ни один процесс не использует все пространство виртуального адреса , первое, что вам нужно сделать, - это определить, какие страницы могут и не могут быть прочитаны.

Windows предоставляет функцию VirtualQueryEx , которая позволяет сканировать память процесса для получения состояния диапазона адресов. Поэтому вы будете вызывать эту функцию в цикле и выводить содержимое диапазонов с атрибутом MEM_COMMIT. Детали опущены как домашнее задание:)

Вы также можете найти полезной функцию EnumProcessModules . Он перечисляет все исполняемые файлы, которые загружаются в процессе, вместе с их базовым адресом. Опять же, детали опущены как домашнее задание.

Кроме того, если вы хотите использовать только функцию ReadProcessMemory , то я считаю, что вам нужно только передать PROCESS_VM_READ и, возможно, PROCESS_QUERY_INFORMATION в OpenProcess. Это должно избежать необходимости устанавливать целевой процесс в режиме отладки, как упомянул Сорен.

0 голосов
/ 10 июля 2011

Ваша проблема возникает из-за того, что вы преобразуете i в адрес, но если я меньше 1 КБ, его никогда не будет в адресном пространстве процессов. Что вам нужно сделать, это получить HANDLE / HMODULE для процесса, а затем получить адрес памяти основного процесса из этого (в зависимости от памяти, которую вы хотите сканировать, это можно получить из PE, для кода, данных, текстовых разделов и т. Д. или через psapi для зарезервированной системной памяти), тогда от вас сделаете void* address = (void*)((UINT_PTR)base + i);. также было бы неплохо связать i с размером раздела памяти, опционально округленным до границы страницы.

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