59 / 56 / 8
Регистрация: 22.07.2011
Сообщений: 436
1

Объясните как пользоваться WriteProcessMemory()

22.07.2011, 23:59. Показов 17761. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем обитателям этого форума=)
Объясните пожалуйста как пользоваться WriteProcessMemory(). То что нужно сначала найти процесс, потом открыть его - это я знаю. Меня больше интерисует вот что:
C++
1
2
3
4
5
6
7
BOOL WriteProcessMemory(
  HANDLE hProcess,
  LPVOID lpBaseAddress,
  LPCVOID lpBuffer,
  SIZE_T nSize,
  SIZE_T* lpNumberOfBytesWritten
);
где lpBaseAddress - УКАЗАТЕЛЬ НА БАЗОВЫЙ АДРЕС в заданном процессе, в который должны быть записаны данные. Т.е. я должен найти указатель на адрес перезаписываемого значения. Так я и сделал. Но значение не изменяется. Я попробовал в IpBaseAddress указать адрес перезаписываемого значения (не указатель) и всё получилось. Всё было бы хорошо, если бы после перезапуска процесса адреса оставались прежними, а не менялись. Подскажите что делать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2011, 23:59
Ответы с готовыми решениями:

объясните как пользоваться Visual Studio 2008 а именно работу с С++?
Доброго времени суток. Не сочтите за труд помочь новичку. Извините за такой вопрос, и он весьма...

как пользоваться программатором для Whirlpool, раздобыл программатор, а как им пользоваться я не знаю
подскажите плиз

WriteProcessMemory
Не работает код ,всегда возращает False .Все права вроде получаю using System; using...

WriteProcessMemory
нужно изменит байты с чего начать помогите пожалуйста

5
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
23.07.2011, 00:14 2
ну тут ничего не поделаешь - расположение данных в процессе может от раза к разу меняться, и вы не можете на это повлиять
0
59 / 56 / 8
Регистрация: 22.07.2011
Сообщений: 436
23.07.2011, 01:00  [ТС] 3
Цитата Сообщение от alex_x_x Посмотреть сообщение
ну тут ничего не поделаешь - расположение данных в процессе может от раза к разу меняться, и вы не можете на это повлиять
А каким же образом тогда пишут разные трейнеры на игры, в которых расположение значений меняется после перезапуска?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
23.07.2011, 01:10 4
в трейнерах типа ArtMoney пользователь вводит значение переменной в памяти и потом ее измененное значение через некоторое время. Трейнер сканирует память процесса и ищет расположение переменной, потом меняет значение, конечно попутно анализируя права на страницы виртуальной памяти, расположение в памяти
в трейнерах, патчах под определенные игры, думаю, путем дизассемблирования устанавливают в ходе выполнения программы где должна появиться переменная, и меняют значение
2
59 / 56 / 8
Регистрация: 22.07.2011
Сообщений: 436
23.07.2011, 01:39  [ТС] 5
Цитата Сообщение от alex_x_x Посмотреть сообщение
в трейнерах типа ArtMoney пользователь вводит значение переменной в памяти и потом ее измененное значение через некоторое время. Трейнер сканирует память процесса и ищет расположение переменной, потом меняет значение, конечно попутно анализируя права на страницы виртуальной памяти, расположение в памяти
в трейнерах, патчах под определенные игры, думаю, путем дизассемблирования устанавливают в ходе выполнения программы где должна появиться переменная, и меняют значение
Я думал всё намного проще=) А есть ли какие нибудь API функции для сканирования памяти?

Добавлено через 11 минут
И кстати. В артмани поиск значения идёт полностью в ручную, т.е. нельзя задать какой либо алгоритм. А в других тренерах, где нужно просто нажать кнопочку, поиск не ведётся. Значит адреса заранее известны.
0
59 / 56 / 8
Регистрация: 22.07.2011
Сообщений: 436
27.07.2011, 01:47  [ТС] 6
Чуть чуть поковырялся и нашёл сам ответ))
Кроме как просто указателей, есть ещё смещение (Блин, как будто без меня этого не знают=)
Например:
Указатель 0x10493AC при смещении +0x1 указывает на адресс 0x1314CFB0. при смещении +0x2 этот же указатель будет указывать на 0x1314CFB1.
те вот что надо было сделать в моём случае:

C++
1
2
3
4
5
6
7
8
9
10
11
const int Offset = 0x1; //смещение
const int PAdress = 0x012DFC; //адрес указателя на адрес переменной, которая нам нужна
int Adress; //переменная для адреса, нужной нам переменной
int Data; //переменная которая нам нужна
ReadProcessMemory(ProcessHandle,&PAdress, &Adress, sizeof(int), &ReadBytes); //читаем из указателя адресс переменной, которая нам нужна, и записываем в Adress
Adress += Offset;// добавляем к адресу смещение
ReadProcessMemory(ProcessHandle,&Adress, &Data, sizeof(int), &ReadBytes) // Читаем значение переменной, которая нам нужна.
 
Data += 10000; //Прибавляем к нужной переменной 10000
 
WriteProcessMemory(ProcessHandle, (void*)Adress, &Data, sizeof(int), NULL); //и переписываем
вот вроде и всё.
2
27.07.2011, 01:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2011, 01:47
Помогаю со студенческими работами здесь

WriteProcessMemory - lpBuffer
BOOL WINAPI WriteProcessMemory( _In_ HANDLE hProcess, _In_ LPVOID lpBaseAddress, _In_ ...

Проблемы с ReadProcessMemory, WriteProcessMemory
Приветствую всех. Ребят, проблема − нужно подцепиться к стороннему процессу, прочитать кусок...

Segfault после WriteProcessMemory
#include <windows.h> #include <string> using namespace std; int main() { string s =...

WriteProcessMemory нюансы использования
Доброго времени суток! Возникла такая проблема, при запуске проекта из VS2015 все компилируется,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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