Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для xxXAKEPxx
2 / 2 / 2
Регистрация: 30.01.2013
Сообщений: 150

Управление памятью другой программы

25.10.2015, 21:19. Показов 1354. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Необходим постоянно устанавливать значение переменной в другой запущенной программе в 0.
Ну это понятно, что значение надо менять в цикле, с задержкой ( Sleep(int) ).
Суть не в этом.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int speed;
    HWND hWin;
    DWORD ProcId;
    HANDLE hProc;
    DWORD NBW;
    int Adress;
    DWORD readwrite;
    
    hWin = FindWindow(NULL, "Program");
    cout << "hWin: " << hWin << endl;
    
    if (hWin = 0)
    {   return -1;
     } 
    
    speed = 666;
    
    DWORD f=4;
    GetWindowThreadProcessId(hWin, &ProcId);
    cout << "ProcId: " << ProcId << endl;  //ЗДЕСЬ ВСЕГДА ВЫВОДИТ 30, а в диспетчере задач ИД процесса 18860
    hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, ProcId);
    cout << "hProc Error: " << GetLastError() << endl; //ЗДЕСЬ ВЫВОДИТ 87
    cout << "hProc: " << hProc << endl; //А ЗДЕСЬ ВЫВОДИТ 0
    DWORD start=0x0E480144; //адрес указателя на адрес переменной
    ReadProcessMemory(hProc, (LPVOID)start, &Adress, f, 0);
    cout << "Adress: " << Adress << endl;
    Adress = Adress + 78;
    cout << "Adress: " << Adress << endl;
    
    WriteProcessMemory(hProc, (LPVOID)Adress, (LPVOID)&speed, f, 0);
    CloseHandle(hProc);
 
    system("PAUSE");
    return EXIT_SUCCESS;
Что я не так делаю?
Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2015, 21:19
Ответы с готовыми решениями:

Реализовать алгоритм работы планировщика. Управление виртуальной памятью. Управление файловой системой
Разработка программы менеджера памяти. Свопинг. Сегментная схема организации памяти. Управление виртуальной памятью. Глобальное и локальное...

Управление другой программой: после открытия программы, в дальнейшем Handle теряется
Если прога изначально работает, а потом мы ищем ее с помощью FindWindow, тогда handle есть. почему же после открытия программы, в...

Управление памятью для массивов
Наверное я был не туда написал или что... Помогите кто может,надо написать прогу Управление памятью для массивов или что то такое,через...

5
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
25.10.2015, 21:48
C++
1
if (hWin = 0)
"=" - присваивание
"==" - сравнение
0
 Аватар для xxXAKEPxx
2 / 2 / 2
Регистрация: 30.01.2013
Сообщений: 150
25.10.2015, 22:17  [ТС]
О. Какая глупая ошибка, досадно.
Просто с Pascal'я переносил, вот и получилось так.

Добавлено через 21 минуту
Однако, теперь при "ProcId: 18860", все равно "hProc: 0" и "hProc Error: 5".
Я нашёл, что значит этот код:
"ERROR_ACCESS_DENIED
5 (0x5)
Access is denied." (Доступ запрещён)
Возникает вопрос почему??? Это не системный процесс и есть все права администратора!
0
59 / 71 / 2
Регистрация: 04.12.2014
Сообщений: 176
25.10.2015, 23:14
хм, а почему GetWindowThreadProcessId? Она же вроде возвращает id потока, породившего окно?
в Вашем случае по-моему было бы правильнее использовать GetProcessId
0
 Аватар для xxXAKEPxx
2 / 2 / 2
Регистрация: 30.01.2013
Сообщений: 150
26.10.2015, 10:45  [ТС]
GetProcessId() возвращает Id процесса на основе его хэндела, а мне нужно как раз получить хэндл.

Добавлено через 37 минут
Нашёл ответ на другом форуме:
"Ошибка 5 означает что всё ок, только закрыт доступ, я нашел решение первого вопроса через добавления флага доступа пользователю SE_DEBUG_NAME, кода побольше но зато работает, хочу заметить что этот флаг включен по умолчанию в винде, просто мою винду поимели пару вирусов =(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
HANDLE NEW_OpenProcess(DWORD dwProcessId)
{
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
        
        if (hProcess == NULL)
        {
            TOKEN_PRIVILEGES Priv, PrivOld;
            DWORD cbPriv = sizeof(PrivOld);
            HANDLE hToken;
 
            // получаем токен текущего потока
            if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, FALSE, &hToken))
            {
                // используем токен процесса, если потоку не назначено
                // никакого токена
                OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES, &hToken);
            }
 
            Priv.PrivilegeCount = 1;
            Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
            LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Priv.Privileges[0].Luid);
 
            // попробуем включить привилегию
            AdjustTokenPrivileges(hToken, FALSE, &Priv, sizeof(Priv), &PrivOld, &cbPriv);
    
            // попробуем открыть описатель процесса еще раз
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
        
            // восстанавливаем исходное состояние привилегии
            AdjustTokenPrivileges(hToken, FALSE, &PrivOld, sizeof(PrivOld), NULL, NULL);
            CloseHandle(hToken);
        }
 
        return hProcess;
}
"
И далее в моём коде, вместо OpenProcess() вызываем NEW_OpenProcess().
0
59 / 71 / 2
Регистрация: 04.12.2014
Сообщений: 176
26.10.2015, 11:22
для 32-битного процесса PID и хэндл можно выковырять еще вот таким образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <Windows.h>
#include <iostream>
#include <TlHelp32.h>
 
using namespace std;
 
int main()
{
    HANDLE hProc = NULL;
    PROCESSENTRY32 pe = { 0 };
    pe.dwSize = sizeof(PROCESSENTRY32);
 
 
    HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(snap, &pe) == TRUE)
    {
        while (Process32Next(snap, &pe) == TRUE)
        {
            if (_wcsicmp(pe.szExeFile, TEXT("notepad.exe")) == 0)
            {
                hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
// хэндл получен, можно куралесить
                cout << GetProcessId(hProc) << endl;
                            
                CloseHandle(hProc);
            }
        }
    }
 
    CloseHandle(snap);
 
    return 0;
}
на 64-разрядном процессе нет возможности протестить, но судя по описанию CreateToolhelp32Snapshot на мсдн (да и по ее названию ) нифига не получится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2015, 11:22
Помогаю со студенческими работами здесь

Управление другой программой!!
Доброго времени суток. Такая проблемка--&gt; Нужно сделать програмку, а точнее диск с автомотической установкой программы. Есть инсталяшка...

Управление другой программой
Есть сторонняя программа, в окне которой размещены различные элементы, которыми нужно управлять. Например ComboBox. Необходимо менять...

Управление другой программой через интерфейс пользователя
В общем есть проблема, а именно огромное время, кот тратится на одну онлайн игру, соотв хотелось бы написать программу-бот, которая за меня...

Управление объектом динамического массива с другой формы
Есть форма на которой массив изображений. Обращаюсь к объекту с помощью : TImage *kran = (TImage*)FindComponent(((TControl ...

Управление объектом динамического массива с другой формы (this)
По нажатию кнопки на форме 2 , объект TImage на форме 1 должен поменять изображение. Создание динамического массива на Form1: for...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru