Цель: опредлить участок памяти процесса и записать туды значение.
Что сделано:
в в переменную 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.
Здравствуйте, Time, Вы писали:
T>И еще, если Вас не затруднит, объясните поля у VirtualAllocEx а точнее LPVOID lpAddress, SIZE_T dwSize. В msdn я почитал T>но не понял в каком случае и сколько туда передавать? T>С уважением, Time.
1. хорошо бы ошибку выдавать сразу после VirtualAllocEx, а это ошибка WriteProcessMemory
2, первым параметром нужен handle процесса с соотв привилегиями, я не уверен, что HANDLE(dwProcessId) это то что надо
3. если ты хочешь захватить кусок памяти в другом процессе, то лучше lpAddress == NULL
а dwSize — сколько тебе надо в байтах (не забывая о округлении).
Здравствуйте, Time, Вы писали:
T>msdn я читал, но не понял маленько. а VirtualAllocEx тоже дает ошибку 6 — неверный дескрипрот, а как написать иначе чем HANDLE(dwProcessID)
Получить дескриптор процесс (HAndle) по идентификатору (Pid) можно с помощью OpenProcess
SM>2, первым параметром нужен handle процесса с соотв привилегиями, я не уверен, что HANDLE(dwProcessId) это то что надо
Я вот уверен, что это абсолютно не то, что надо
Здравствуйте, TarasCo, Вы писали:
TC>Здравствуйте, Time, Вы писали:
T>>msdn я читал, но не понял маленько. а VirtualAllocEx тоже дает ошибку 6 — неверный дескрипрот, а как написать иначе чем HANDLE(dwProcessID)
TC>Получить дескриптор процесс (HAndle) по идентификатору (Pid) можно с помощью OpenProcess
Спасибо, я так и сделал, но теперь WriteProcessMemory выдает отказано в доступе
Здравствуйте, Vamp, Вы писали:
SM>>2, первым параметром нужен handle процесса с соотв привилегиями, я не уверен, что HANDLE(dwProcessId) это то что надо V>Я вот уверен, что это абсолютно не то, что надо
откуда такая уверенность? может HANDLE переопределили мы же не видим всю программу.
Здравствуйте, 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
SM>>откуда такая уверенность? может HANDLE переопределили мы же не видим всю программу.
RB>99% вероятности, что программа принимает ID в параметрах командной строки, и пытается в указанный процесс что-то впихнуть.
RB>Так что это действительно ID процесса, а не его хендл...
Здравствуйте, SergeMukhin, Вы писали:
SM>Здравствуйте, rus blood, Вы писали:
SM>>>откуда такая уверенность? может HANDLE переопределили мы же не видим всю программу.
RB>>99% вероятности, что программа принимает ID в параметрах командной строки, и пытается в указанный процесс что-то впихнуть.
RB>>Так что это действительно ID процесса, а не его хендл...
SM>я бы дал больше, 99.99%
А бы столько не дал
Возможно, это вумная прогамма использует EnumProcesses
Здравствуйте, rus blood, Вы писали:
RB>Исходный PID хранится в строке. RB>Было бы глупо получив число перевести его в строку, чтобы потом опять перевести в число.
А может оно значит не PID, а унаследованный хендл.
Проблема полностью решилась благодаря Вашим советам.
Программа просто получает из Edit строку с PID
и по нему записывает в память процесса.
Очень, очень Вам благодарен.