VirtualAllocEx возвращет 0
От: Time Россия  
Дата: 18.06.04 06:44
Оценка:
Цель: опредлить участок памяти процесса и записать туды значение.
Что сделано:
в в переменную DWORD записан дескриптор процесса. Далее

DWORD dwProcessID;
    dwProcessID = atoi(m_csID);
    int iBaseAddr = 0x10000000;
    int str = 19483;
    // Пробовал вместо iBaseAddr писать NULL - безрезультатно
    MemAdr = VirtualAllocEx(HANDLE(dwProcessID),&iBaseAddr,64,MEM_COMMIT,PAGE_EXECUTE_READWRITE); //Получаю 0!
    SIZE_T num = 0;
    int f =0;
    if (!WriteProcessMemory(HANDLE(dwProcessID),MemAdr,&str,sizeof(str),&num))
    {
        DWORD te = GetLastError();//Возвращает ошибку: неверный дескриптор
        int d = 0;
        d++;
    }

Помогите, пожалуйста. Запарился уже.
И еще, если Вас не затруднит, объясните поля у VirtualAllocEx а точнее LPVOID lpAddress, SIZE_T dwSize. В msdn я почитал
но не понял в каком случае и сколько туда передавать?
С уважением, Time.
Re: VirtualAllocEx возвращет 0
От: SergeMukhin Россия  
Дата: 18.06.04 06:51
Оценка:
Здравствуйте, Time, Вы писали:

T>И еще, если Вас не затруднит, объясните поля у VirtualAllocEx а точнее LPVOID lpAddress, SIZE_T dwSize. В msdn я почитал

T>но не понял в каком случае и сколько туда передавать?
T>С уважением, Time.

1. хорошо бы ошибку выдавать сразу после VirtualAllocEx, а это ошибка WriteProcessMemory
2, первым параметром нужен handle процесса с соотв привилегиями, я не уверен, что HANDLE(dwProcessId) это то что надо
3. если ты хочешь захватить кусок памяти в другом процессе, то лучше lpAddress == NULL
а dwSize — сколько тебе надо в байтах (не забывая о округлении).

вообщем в MSDN все это есть
---
С уважением,
Сергей Мухин
Re[2]: VirtualAllocEx возвращет 0
От: Time Россия  
Дата: 18.06.04 07:13
Оценка:
Здравствуйте, SergeMukhin, Вы писали:

SM>Здравствуйте, Time, Вы писали:


msdn я читал, но не понял маленько. а VirtualAllocEx тоже дает ошибку 6 — неверный дескрипрот, а как написать иначе чем HANDLE(dwProcessID)
Re[3]: VirtualAllocEx возвращет 0
От: TarasCo  
Дата: 18.06.04 07:31
Оценка:
Здравствуйте, Time, Вы писали:

T>msdn я читал, но не понял маленько. а VirtualAllocEx тоже дает ошибку 6 — неверный дескрипрот, а как написать иначе чем HANDLE(dwProcessID)


Получить дескриптор процесс (HAndle) по идентификатору (Pid) можно с помощью OpenProcess
Да пребудет с тобою сила
Re[2]: VirtualAllocEx возвращет 0
От: Vamp Россия  
Дата: 18.06.04 07:41
Оценка:
SM>2, первым параметром нужен handle процесса с соотв привилегиями, я не уверен, что HANDLE(dwProcessId) это то что надо
Я вот уверен, что это абсолютно не то, что надо
Да здравствует мыло душистое и веревка пушистая.
Re[4]: VirtualAllocEx возвращет 0
От: Time Россия  
Дата: 18.06.04 07:41
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Здравствуйте, Time, Вы писали:


T>>msdn я читал, но не понял маленько. а VirtualAllocEx тоже дает ошибку 6 — неверный дескрипрот, а как написать иначе чем HANDLE(dwProcessID)


TC>Получить дескриптор процесс (HAndle) по идентификатору (Pid) можно с помощью OpenProcess


Спасибо, я так и сделал, но теперь WriteProcessMemory выдает отказано в доступе
Re[3]: VirtualAllocEx возвращет 0
От: SergeMukhin Россия  
Дата: 18.06.04 07:44
Оценка: :)
Здравствуйте, Vamp, Вы писали:

SM>>2, первым параметром нужен handle процесса с соотв привилегиями, я не уверен, что HANDLE(dwProcessId) это то что надо

V>Я вот уверен, что это абсолютно не то, что надо

откуда такая уверенность? может HANDLE переопределили мы же не видим всю программу.
---
С уважением,
Сергей Мухин
Re[5]: VirtualAllocEx возвращет 0
От: TarasCo  
Дата: 18.06.04 07:59
Оценка:
Здравствуйте, Time, Вы писали:

T>Здравствуйте, TarasCo, Вы писали:


TC>>Здравствуйте, Time, Вы писали:


T>>>msdn я читал, но не понял маленько. а VirtualAllocEx тоже дает ошибку 6 — неверный дескрипрот, а как написать иначе чем HANDLE(dwProcessID)


TC>>Получить дескриптор процесс (HAndle) по идентификатору (Pid) можно с помощью OpenProcess


T>Спасибо, я так и сделал, но теперь WriteProcessMemory выдает отказано в доступе


Дескриптор должен иметь разрешения.
MSDN:
hProcess
[in] Handle to the process whose memory is to be modified. The handle must have PROCESS_VM_WRITE and PROCESS_VM_OPERATION access to the process

Укажите их (PROCESS_VM_WRITE | PROCESS_VM_OPERATION) при вызове OpenProcess
Да пребудет с тобою сила
Re[4]: VirtualAllocEx возвращет 0
От: rus blood Россия  
Дата: 18.06.04 09:25
Оценка:
SM>откуда такая уверенность? может HANDLE переопределили мы же не видим всю программу.

99% вероятности, что программа принимает ID в параметрах командной строки, и пытается в указанный процесс что-то впихнуть.

Так что это действительно ID процесса, а не его хендл...
Имею скафандр — готов путешествовать!
Re[5]: VirtualAllocEx возвращет 0
От: SergeMukhin Россия  
Дата: 18.06.04 09:31
Оценка:
Здравствуйте, rus blood, Вы писали:


SM>>откуда такая уверенность? может HANDLE переопределили мы же не видим всю программу.


RB>99% вероятности, что программа принимает ID в параметрах командной строки, и пытается в указанный процесс что-то впихнуть.


RB>Так что это действительно ID процесса, а не его хендл...


я бы дал больше, 99.99%
---
С уважением,
Сергей Мухин
Re[6]: VirtualAllocEx возвращет 0
От: TarasCo  
Дата: 18.06.04 09:35
Оценка:
Здравствуйте, SergeMukhin, Вы писали:

SM>Здравствуйте, rus blood, Вы писали:



SM>>>откуда такая уверенность? может HANDLE переопределили мы же не видим всю программу.


RB>>99% вероятности, что программа принимает ID в параметрах командной строки, и пытается в указанный процесс что-то впихнуть.


RB>>Так что это действительно ID процесса, а не его хендл...


SM>я бы дал больше, 99.99%


А бы столько не дал
Возможно, это вумная прогамма использует EnumProcesses
Да пребудет с тобою сила
Re[7]: VirtualAllocEx возвращет 0
От: rus blood Россия  
Дата: 18.06.04 09:36
Оценка:
TC>А бы столько не дал
TC>Возможно, это вумная прогамма использует EnumProcesses

Нет, не использует.
Исходный PID хранится в строке.
Было бы глупо получив число перевести его в строку, чтобы потом опять перевести в число.
Имею скафандр — готов путешествовать!
Re[8]: VirtualAllocEx возвращет 0
От: Leonid Troyanovsky  
Дата: 18.06.04 10:01
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Исходный PID хранится в строке.

RB>Было бы глупо получив число перевести его в строку, чтобы потом опять перевести в число.

А может оно значит не PID, а унаследованный хендл.
--
С уважением, LVT
Re: Всем огромное спасибо, низкий поклон Вам
От: Time Россия  
Дата: 18.06.04 10:29
Оценка:
Проблема полностью решилась благодаря Вашим советам.
Программа просто получает из Edit строку с PID
и по нему записывает в память процесса.
Очень, очень Вам благодарен.
Re[2]: Всем огромное спасибо, низкий поклон Вам
От: SergeMukhin Россия  
Дата: 18.06.04 10:32
Оценка:
T>Программа просто получает из Edit строку с PID

так! кто сказал, что из командной строки?
---
С уважением,
Сергей Мухин
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.