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

Процессы и потоки - C++

Восстановить пароль Регистрация
 
Nalik
 Аватар для Nalik
44 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 582
02.12.2014, 12:22     Процессы и потоки #1
Здравствуйте, КиберФорумчане!)
Начал разбираться с процессами и потоками. Представление об этом небольшое, потому сразу хотелось бы выпросить у вас, ссылочки на полезные материалы. Или может книги авторов.. Если дочитаете сообщение дальше и поможете разобраться буду благодарен очень, если вам не хочется разбираться, то хотя бы ссылочки пожалуйста

Как подопытного кролика использую игру "Counter Strike" с ботами.
Пока поставил себе задачу написать трейнер. Увеличение HP, увеличение денег и т.д., подумал это будет хорошее начало для изучения, практическое прямое взаимодействие с процессами на примере игры. Если вы помните с чего начинали, буду рад услышать советы!

Благодаря примерам других кодов в сети получилось изменить количество HP у персонажа в игре:
Кликните здесь для просмотра всего текста
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
HANDLE  hProcess; //хендел потока
int i;
        
 
 
/* Определение окна по хендел */
private: System::Void backgroundWorker1_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e)
{
                 
    DWORD   ProcessID; //Переменная, в которую возвращается идентификатор процесса (PID) указанного окна
    HWND WinAA1 = FindWindow(L"Counter Strike", nullptr);
    if (WinAA1)
    {
        textBox1->Text = "Counter Strike запущен";
        GetWindowThreadProcessId(WinAA1, &ProcessID); //получаем идентификатор процесса у WinAA1
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID); //открываем процесс для чтения или записи (получаем хендел потока)
                     
        DWORD data = 120;
        WriteProcessMemory(hProcess, (LPVOID)0x00B7CE50, &data, 4, 0);
        ProcessID = i; //заносим содержимое ProcessID в переменную i
        String^ ProcessID_text = System::Convert::ToString(i); //конвертируем переменные
 
        textBox2->Text = ProcessID_text; //выводим ID потока в поле textbox
    }
    else
    {
        textBox1->Text = "окно закрыто";
    }
}

Делал я это так:
В Cheat Engine ввёл количество жизней, потом упал в игре, чтобы жизни отнялись, ввёл сколько жизней осталось. Так я нашел что код "0x00B7CE50" отвечает за количество жизней (кстати что это за код, PID? Индетификатор процесса? Идентификатор потока? Не пойму..что он делает?)

Пройдемся немного по коду, честно говоря я совершенно не понимаю что в нем происходит, результат есть - знаний нет, хотелось бы разобраться.

C++
1
GetWindowThreadProcessId(WinAA1, &ProcessID);
я начитался умных выражений, что тут мы получаем идентификатор процесса, но понять конкретно, что здесь происходит не смог, пытался вывести в textbox то что заносится в переменную, но постоянно пишет 0..
Вопрос 1: Что же всё таки находится в переменной ProcessID?

C++
1
hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID); //открываем процесс для чтения или записи (получаем хендел потока)
здесь я так понимаю мы открываем процесс чтобы была возможность работать с ним, надеюсь я понял это правильно (я понимаю так, в предыдущей строчке мы находим саму игру, в этой строчке мы говорим программе, что мы будем работать с этой игрой)
Вопрос 2: Что за хендел потока? ЧТо заносится в переменную hProcess? Вывести в textBox у меня так же не получилось, всегда пишет 0..

C++
1
DWORD data = 120;
- тут мы вводим количество жизней
C++
1
WriteProcessMemory(hProcess, (LPVOID)0x00B7CE50, &data, 4, 0);
- вот эту строчку я не понимаю вообще.. Мы посылаем какому-то неведомому для меня хендлу, в какой-то непонятный адрес 0x00B7CE50 отвечающий за жизни (который я выяснил через Cheat Engine), значение 120.. При чем адрес этих жизней не постоянный, стоит мне перезапустить игру, как он становится другим и естественно программа работать перестает.

Вопрос 3: 0x00B7CE50 что это за адрес такой? И почему он всегда меняется при следующем запуске игры и как этого избежать?

Уважаемые форумчане, объясните пожалуйста мне глупому, что же делает этот код.. как сделать так, чтобы программа работала всегда и не была "одноразовой" как сейчас, что при перезапуске игры она работать перестает. И пожалуйста посоветуйте, где мне узнать больше про это все, процессы, потоки, идинтификаторы, пиды, что это вообще все такое!

Я верю в вашу доброту
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
02.12.2014, 13:35     Процессы и потоки #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Nalik Посмотреть сообщение
вот эту строчку я не понимаю вообще..
записать в память процессе hProcess, по адресу (LPVOID)0x00B7CE50, данные data, размером 4 байта

Добавлено через 5 минут
Цитата Сообщение от Nalik Посмотреть сообщение
где мне узнать больше про это все, процессы, потоки, идинтификаторы, пиды, что это вообще все такое!
книги по WinApi

Добавлено через 2 минуты
Цитата Сообщение от Nalik Посмотреть сообщение
0x00B7CE50 что это за адрес такой? И почему он всегда меняется при следующем запуске игры и как этого избежать?
вообще гововря подобные вещи должны быть константными, т.е всегда используются постоянный оффсеты, правда CS быть может, имеют свою специфику
Вы кстати когда в CheatEngine искали адрес где хранится ХП, он в списке найденных был один?, или Вы взяли первый попавшийся

Добавлено через 54 секунды
Цитата Сообщение от aLarman Посмотреть сообщение
0x00B7CE50 что это за адрес такой?
а это собсно, адрес переменной где хранится кол-во ХП персонажа
Nalik
 Аватар для Nalik
44 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 582
02.12.2014, 14:52  [ТС]     Процессы и потоки #3
Цитата Сообщение от aLarman Посмотреть сообщение
вообще гововря подобные вещи должны быть константными, т.е всегда используются постоянный оффсеты, правда CS быть может, имеют свою специфику
Вы кстати когда в CheatEngine искали адрес где хранится ХП, он в списке найденных был один?, или Вы взяли первый попавшийся
Нет, там было несколько адресов, методом "перебора" и просмотра результата я вычислил что это именно тот адрес, который мне нужен (правда именно этот адрес меняет количество ХП только визуально, но мне разницы нет что изменять для понимания)
Т.е. это динамический адрес я так понимаю. Кстати говоря, когда я через CheatEngine копирую этот адрес, у меня копируется вот это: client.dll+1206D8, вместо 0x098A06D8 (сейчас уже такой, сорри в том коде адрес от GTA San Andres, я и на её примере пытался разобраться). Заметил одну особенность, что адрес всегда заканчивается на "06D8". Может вместо
C++
1
WriteProcessMemory(hProcess, (LPVOID)[B]0x00B7CE50[/B], &data, 4, 0);
нужно
C++
1
WriteProcessMemory(hProcess, (LPVOID)[B]client.dll+1206D8[/B], &data, 4, 0);
но компилятор так ругается..


Добавлено через 54 секунды
Цитата Сообщение от aLarman Посмотреть сообщение
а это собсно, адрес переменной где хранится кол-во ХП персонажа
то есть структура такая:
есть процесс, у этого процесса есть PID (кстати я уже разобрался что это такое), по этому PIDу мы находим Название процесса если я правильно понял (hProcess это типа cs_strike.exe, правильно понимаю?) и в это окно в область памяти 0x00B7CE50 мы посылаем значения которые нужно изменить)

Схема такая:
Определить PID процесса -> Определить название процесса -> Записать или читать данные из определенной области памяти.

Но тогда я не понимаю, зачем вообще PID нужно узнавать, если можно явно указать что название cs_strike.exe и запросы посылать в него (хотя тут может быть изменено название и программа уже не работает)


Вообще спасибо вам большое, что вас заинтересовала эта тема и вы на неё ответили!
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
02.12.2014, 15:30     Процессы и потоки #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
cкорее по названию процесса мы определяем PID, по нему открываем процесс и пишем в его память

Добавлено через 18 минут
Цитата Сообщение от Nalik Посмотреть сообщение
Может вместо
нет там должен быть адрес, очень странно что он непостоянный, попробуйте почитать на форуме zhuk кажется, там быть может что то есть про адреса для СS
Nalik
 Аватар для Nalik
44 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 582
03.12.2014, 12:21  [ТС]     Процессы и потоки #5
Цитата Сообщение от aLarman Посмотреть сообщение
нет там должен быть адрес, очень странно что он непостоянный, попробуйте почитать на форуме zhuk кажется, там быть может что то есть про адреса для СS
Разобрался. Это динамическая ячейка памяти, нужно искать указатель на статический адрес (это уже сам разберусь)
Спасибо!
Пойду создавать новую тему, не знаю как переменную из ReadProcessMemory вывести в текстбокс))

C++
1
2
3
4
5
6
DWORD data;
int i;
ReadProcessMemory(hProcess, (LPVOID)0x0AD0EDC8, &data, 4, 0); //патроны
data = i; //заносим содержимое data в переменную i
String^ text = System::Convert::ToString(i); //конвертируем переменные
textBox2->Text = text;
в textBox2 заносится всегда 0, а должно быть нормальное число от 0 до 24))
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
03.12.2014, 12:26     Процессы и потоки #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Nalik Посмотреть сообщение
data = i; //заносим содержимое data в переменную i
наоборот же
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2014, 16:41     Процессы и потоки
Еще ссылки по теме:

Потоки и процессы C++
C++ Потоки и процессы
Процессы в c++ C++

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

Или воспользуйтесь поиском по форуму:
Nalik
 Аватар для Nalik
44 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 582
03.12.2014, 16:41  [ТС]     Процессы и потоки #7
Спасибо вам большое, от души! Все вопросы в рамках этой темы решены!
Yandex
Объявления
03.12.2014, 16:41     Процессы и потоки
Ответ Создать тему
Опции темы

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