ReadProcessMemory / WriteProcessMemory

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 10 янв 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Как узнать начальный адрес процесса, который используется в сабже? Я так догадываюсь это будет entry point, что-то типа 0x401000, но все же?
     
  2. nobodi

    nobodi Сисадмин Команда форума

    Публикаций:
    0
    Регистрация:
    2 апр 2004
    Сообщения:
    35
    Не совсем понятен вопрос.

    Если нужно получить entrypoint, то прочитай его из заголовка файла на диске или из PEB.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Код (Text):
    1.  
    2. BOOL ReadProcessMemory(
    3.   HANDLE hProcess,
    4.   LPCVOID lpBaseAddress,
    5.   LPVOID lpBuffer,
    6.   SIZE_T nSize,
    7.   SIZE_T* lpNumberOfBytesRead
    8. );
    9.  




    У меня есть все кроме LPCVOID lpBaseAddress. Базовый адрес процесса. Как его узнать?



    И еще: память просесса скорее всего представляет разрозненные блоки памяти, всмысле физически разрозненные. Слепит ли мне ReadProcessMemory это в единый блок?
     
  4. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Открываем нужный процесс по OpenProcess,выделяем память требуемого размера в процессе с помощью VirtualAllocEx, а дальше юзаем WriteProcessMemory/ReadProcessMemory
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Stub

    [] Да понимаю я все это! С какого адореса процесс-то начинается?



    Вот что мне надо:



    1. CreateToolhelp32Snapshot - сделали

    2. FindProcess32First / Last - нашли

    3. Взяли конкретный процесс, взяли его ID, открыли его (OpenProcess).

    4. Узнали, сколько байт оперативы юзает этот процесс.

    5. Решили его прочитать с помощью ReadProcessMemory. Как узнать базовый адрес этого процесса?
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    _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):
    1. typedef struct tagMODULEENTRY32 {  
    2.     DWORD   dwSize;
    3.     DWORD   th32ModuleID;
    4.     DWORD   th32ProcessID;
    5.     DWORD   GlblcntUsage;
    6.     DWORD   ProccntUsage;
    7.     BYTE  * modBaseAddr;
    8.     DWORD   modBaseSize;
    9.     HMODULE hModule;
    10.     char    szModule[MAX_MODULE_NAME32 + 1];
    11.     char    szExePath[MAX_PATH];
    12. } MODULEENTRY32;
    13. typedef MODULEENTRY32 *  PMODULEENTRY32;
    14. typedef MODULEENTRY32 *  LPMODULEENTRY32;
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Asterix





    Да, так вот я хочу всю память процесса прочитать, значит начинать надо с начального адреса. Это и есть базовый адрес модуля?
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Так, на сколько я понял снапшот делается для указанного процесса. Список модулей состоит из exe-шника и dll-ек, которые он юзает. Хорошо, но тогда какой же module base address брать, если я хочу прочитать всю память процесса?
     
  9. LocTb

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    "Всю память процесса"

    Вся память процесса на 32 битной шине (без PAE) - 4Gb, я не думаю, что все они тебе нужны. Для того, чтобы получить информацию, о том где и что лежит используй VirtualQueryEx. Если нужен IMAGE exe'шника - прочитай у Рихтера.
     
  10. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    _DEN_

    И еще: память просесса скорее всего представляет разрозненные блоки памяти, всмысле физически разрозненные. Слепит ли мне ReadProcessMemory это в единый блок?



    Если секции идут друг за другом и атрибуты страниц не мешают читать страницы, никаких проблем с чтением за один ReadProcessMemory я не заметил.
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    LocTb



    Вся память процесса на 32 битной шине (без PAE) - 4Gb



    Мне будет достаточно PROCESS_MEMORY_COUNTERS::PagefileUsage