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

C++

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

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

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

C++ Builder Управление памятью для массивов
управление памятью C++
Управление калькулятором из другой программы C++
Работа с allocator (управление памятью) C++
Управление окнами другой программы C++
C++ Программирование с использованием ссылок. Управление памятью в С++
C++ Builder Управление другой программой: после открытия программы, в дальнейшем Handle теряется
Управление памятью C++
C++ WinAPI Управление памятью
Управление памятью с использованием malloc и free C++
C++ Управление памятью в C++
C++ Управление памятью

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
 Аватар для Croessmah
12513 / 7075 / 794
Регистрация: 27.09.2012
Сообщений: 17,470
Записей в блоге: 2
Завершенные тесты: 1
25.10.2015, 21:48     Управление памятью другой программы #2
C++
1
if (hWin = 0)
"=" - присваивание
"==" - сравнение
xxXAKEPxx
 Аватар для xxXAKEPxx
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 140
25.10.2015, 22:17  [ТС]     Управление памятью другой программы #3
О. Какая глупая ошибка, досадно.
Просто с Pascal'я переносил, вот и получилось так.

Добавлено через 21 минуту
Однако, теперь при "ProcId: 18860", все равно "hProc: 0" и "hProc Error: 5".
Я нашёл, что значит этот код:
"ERROR_ACCESS_DENIED
5 (0x5)
Access is denied." (Доступ запрещён)
Возникает вопрос почему??? Это не системный процесс и есть все права администратора!
Lethorn
45 / 2 / 0
Регистрация: 04.12.2014
Сообщений: 16
Завершенные тесты: 2
25.10.2015, 23:14     Управление памятью другой программы #4
хм, а почему GetWindowThreadProcessId? Она же вроде возвращает id потока, породившего окно?
в Вашем случае по-моему было бы правильнее использовать GetProcessId
xxXAKEPxx
 Аватар для xxXAKEPxx
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 140
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().
Lethorn
45 / 2 / 0
Регистрация: 04.12.2014
Сообщений: 16
Завершенные тесты: 2
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 на мсдн (да и по ее названию ) нифига не получится.
Yandex
Объявления
26.10.2015, 11:22     Управление памятью другой программы
Ответ Создать тему
Опции темы

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