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

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

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

Author24 — интернет-сервис помощи студентам
Добрый день.
Необходим постоянно устанавливать значение переменной в другой запущенной программе в 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2015, 21:19
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 21 минуту
Однако, теперь при "ProcId: 18860", все равно "hProc: 0" и "hProc Error: 5".
Я нашёл, что значит этот код:
"ERROR_ACCESS_DENIED
5 (0x5)
Access is denied." (Доступ запрещён)
Возникает вопрос почему??? Это не системный процесс и есть все права администратора!
0
33 / 40 / 2
Регистрация: 04.12.2014
Сообщений: 87
25.10.2015, 23:14 4
хм, а почему GetWindowThreadProcessId? Она же вроде возвращает id потока, породившего окно?
в Вашем случае по-моему было бы правильнее использовать GetProcessId
0
2 / 2 / 2
Регистрация: 30.01.2013
Сообщений: 150
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
33 / 40 / 2
Регистрация: 04.12.2014
Сообщений: 87
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
26.10.2015, 11:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2015, 11:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru