2013-04-12 1 views
-1

Как читать каждый байт в памяти процесса? После того, как мы закончили чтение, как мы создаем «шестнадцатеричный» свалку процесса?Как читать каждый байт в памяти другого процесса?

Для примера:

Process a.exe:

00400000: 00 00 
00400002: 74 05 
... 

сканирования:

00 74 05 ... 

сбросами a.exe к a.txt:

00 74 05 

Мои компилятор - visual C++ 2010, и я pla nning при написании приложения win32, которое будет использовать эту функцию. ОС, над которой я буду работать, - это Window 8. Однако мое приложение должно работать для Windows 8 и, по крайней мере, Window XP.

До сих пор, это то, что у меня есть ...

#include <windows.h> 

void ScanForBytes(const char* TargetName, DWORD dwFromAddress, DWORD dwToAddress) { 
    HANDLE hProc; // I guess we will be needing the handle to the process. 
    //And this is where I stopped and asked for help... 
} 

int main() { 
    ScanForBytes("Chrome.exe", 0x00400000, 0x00400001); 
    return 0; 
} 
+1

Просто из любопытства, неисправимого стремления избежать распространения недобросовестных приложений и серьезной попытки предоставить наилучшие возможные решения ... не возражаете ли вы поделиться с нами * почему * вы думаете, что вам нужно это делать? –

+0

Возможный дубликат [Чтение памяти процесса] (http://stackoverflow.com/questions/2300894/reading-a-process-memory) – Suma

ответ

2

Функция вы ищете является ReadProcessMemory. Вы можете найти документацию для этой функции here on MSDN.

Эта функция копирует данные в указанном диапазоне адресов определенного процесса в указанный буфер. Вам нужно будет убедиться, что ваше приложение работает с соответствующими привилегиями для этого. Как правило, это отладочные привилегии - только отладчикам необходимо читать и/или изменять частную память других процессов. Функция не удастся, если у вас нет необходимых привилегий в указанном блоке памяти всего. Вы найдете дополнительную информацию о привилегиях доступа here on MSDN. Если вы еще не знакомы с моделью безопасности, работающей здесь, я рекомендую внимательно прочитать документ.

Естественно, ваш процесс также должен соответствовать битности процесса, память которого вы хотите прочитать. Другими словами, если вы хотите прочитать память из процесса Chrome, Chrome будет скомпилирован как 32-разрядное приложение, поэтому ваше приложение также должно быть одним из них. Вам нужно будет перекомпилировать в качестве 64-разрядного приложения, если вы хотите сбросить память из другого 64-битного приложения. Это вызвало ряд комментариев на странице MSDN.

Само собой разумеется, что вам необходимо проверить все возвращаемые значения и обработать ошибки соответствующим образом. Этот вид вещей должен быть ожидается для отказа при обычных условиях.

Как только ReadProcessMemory успешно возвращается, указанный вами массив будет содержать запрошенные данные. Оттуда, это просто сделать все, что вы пожелаете, например, написать в текстовый файл.