Как узнать начальный адрес процесса, который используется в сабже? Я так догадываюсь это будет entry point, что-то типа 0x401000, но все же?
Не совсем понятен вопрос. Если нужно получить entrypoint, то прочитай его из заголовка файла на диске или из PEB.
Код (Text): BOOL ReadProcessMemory( HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T nSize, SIZE_T* lpNumberOfBytesRead ); У меня есть все кроме LPCVOID lpBaseAddress. Базовый адрес процесса. Как его узнать? И еще: память просесса скорее всего представляет разрозненные блоки памяти, всмысле физически разрозненные. Слепит ли мне ReadProcessMemory это в единый блок?
Открываем нужный процесс по OpenProcess,выделяем память требуемого размера в процессе с помощью VirtualAllocEx, а дальше юзаем WriteProcessMemory/ReadProcessMemory
Stub [] Да понимаю я все это! С какого адореса процесс-то начинается? Вот что мне надо: 1. CreateToolhelp32Snapshot - сделали 2. FindProcess32First / Last - нашли 3. Взяли конкретный процесс, взяли его ID, открыли его (OpenProcess). 4. Узнали, сколько байт оперативы юзает этот процесс. 5. Решили его прочитать с помощью ReadProcessMemory. Как узнать базовый адрес этого процесса?
_DEN_ > У меня есть все кроме LPCVOID lpBaseAddress. Базовый адрес процесса. Как его узнать? Вобще-то это не базовый адрес процесса, а LPCVOID lpBaseAddress, // address to start reading Базовый модуля можно получить через те же Toolhelp32 API BOOL WINAPI Module32First(HANDLE hSnapshot, LPMODULEENTRY32 lpme); Parameters hSnapshot Handle of the snapshot returned from a previous call to the CreateToolhelp32Snapshot function. lpme Address of a buffer containing a MODULEENTRY32 structure. Код (Text): typedef struct tagMODULEENTRY32 { DWORD dwSize; DWORD th32ModuleID; DWORD th32ProcessID; DWORD GlblcntUsage; DWORD ProccntUsage; BYTE * modBaseAddr; DWORD modBaseSize; HMODULE hModule; char szModule[MAX_MODULE_NAME32 + 1]; char szExePath[MAX_PATH]; } MODULEENTRY32; typedef MODULEENTRY32 * PMODULEENTRY32; typedef MODULEENTRY32 * LPMODULEENTRY32;
Asterix Да, так вот я хочу всю память процесса прочитать, значит начинать надо с начального адреса. Это и есть базовый адрес модуля?
Так, на сколько я понял снапшот делается для указанного процесса. Список модулей состоит из exe-шника и dll-ек, которые он юзает. Хорошо, но тогда какой же module base address брать, если я хочу прочитать всю память процесса?
"Всю память процесса" Вся память процесса на 32 битной шине (без PAE) - 4Gb, я не думаю, что все они тебе нужны. Для того, чтобы получить информацию, о том где и что лежит используй VirtualQueryEx. Если нужен IMAGE exe'шника - прочитай у Рихтера.
_DEN_ И еще: память просесса скорее всего представляет разрозненные блоки памяти, всмысле физически разрозненные. Слепит ли мне ReadProcessMemory это в единый блок? Если секции идут друг за другом и атрибуты страниц не мешают читать страницы, никаких проблем с чтением за один ReadProcessMemory я не заметил.
LocTb Вся память процесса на 32 битной шине (без PAE) - 4Gb Мне будет достаточно PROCESS_MEMORY_COUNTERS::PagefileUsage