Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
xxXAKEPxx
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 147
#1

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

25.10.2015, 21:19. Просмотров 303. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2015, 21:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Управление памятью другой программы (C++):

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

Как передавать данные от одной программы к другой? - C++
Искал темы похожие, не нашел, простите если не туда. Такая задача: написать 2 программы. Первая спрашивает пользователя название файла...

Как ввести текст в поле ввода другой программы? - C++
подскажите каким образом можно ввести текст в поле ввода другой программы? определил HWND но как дальше найти поле ввода и вставить туда...

Работа с оперативной памятью - C++
Доброго дня. Есть интересная задача. Планируется создание чего-то типа сканера оперативной памяти. Необходимо сделать его работающим из под...

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13227 / 7499 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
25.10.2015, 21:48 #2
C++
1
if (hWin = 0)
"=" - присваивание
"==" - сравнение
0
xxXAKEPxx
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 147
25.10.2015, 22:17  [ТС] #3
О. Какая глупая ошибка, досадно.
Просто с Pascal'я переносил, вот и получилось так.

Добавлено через 21 минуту
Однако, теперь при "ProcId: 18860", все равно "hProc: 0" и "hProc Error: 5".
Я нашёл, что значит этот код:
"ERROR_ACCESS_DENIED
5 (0x5)
Access is denied." (Доступ запрещён)
Возникает вопрос почему??? Это не системный процесс и есть все права администратора!
0
Lethorn
45 / 2 / 0
Регистрация: 04.12.2014
Сообщений: 16
Завершенные тесты: 3
25.10.2015, 23:14 #4
хм, а почему GetWindowThreadProcessId? Она же вроде возвращает id потока, породившего окно?
в Вашем случае по-моему было бы правильнее использовать GetProcessId
0
xxXAKEPxx
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 147
26.10.2015, 10:45  [ТС] #5
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
Lethorn
45 / 2 / 0
Регистрация: 04.12.2014
Сообщений: 16
Завершенные тесты: 3
26.10.2015, 11:22 #6
для 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2015, 11:22
Привет! Вот еще темы с ответами:

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

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

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

Управление из другой программы - Java
Помогите, очень нужно! Есть программа, написанная на Java (в ней есть окно, меню, кнопки и т.д.). Нужно из другой программы посылать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.10.2015, 11:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru