Nickitee
28.11.2011, 12:12
Вступление
Всем привет! Сегодня мы будем учиться работать с памятью на C# (СиШарп), а именно "обходить" DMA (Dynamic Memory Allocation) это плохая вещь в играх и не только, когда адрес нужного нам значение в памяти, при каждом запуске игры меняется. Игру я взял AceOfSpades(AOS), в ней можно через CE менять значение к примеру патронов, и это будет не визуально, НО, при каждом новом запуске адрес другой. Этот гайд будет без VAMemory, для него вообще ничего не надо будет, кроме одного класса, который мы добавим в проэкт.
p.s. использовать статический адрес можно не только для изменения,а ещё к примеру для чтения при создании бота.
Что нам понадобиться:
1. Компилятор C#, я советую MVS 2010.
2. Класс для работы с памятью ([Ссылки могут видеть только зарегистрированные и активированные пользователи]).
3. CE.
4. Базовые знания C#.
Поехали...
1. Создадим проэкт.
2. Сохраним, изменим версию .net framerwork-a на 2.0
3. Удалим все не поддерживаемые библиотеки после этого и "using System.Linq"
4. [Ссылки могут видеть только зарегистрированные и активированные пользователи]
5. Теперь после
public Main() // тут будет название вашей формы
{
InitializeComponent();
}
Пишем:
ProcessMemoryReaderLib.ProcessMemoryReader MemoryWorker = new ProcessMemoryReaderLib.ProcessMemoryReader();
6. Используем такое:
using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
7. Теперь будем учиться работать с DMA, на пример я взял хак кубов для строения.
7.1 Запускаем AOS через сайт (выбираем сервер), запускаем CE, выбираем в CE "client.exe" (AceOfSpades)
7.2 Смотрим сколько у нас кубов - 50
7.3 Ставим 1 куб в игре, отсеиваем - 49
7.4 Делаем это пока не получим 1 адрес
7.5 Переносим адрес вниз
7.6 [Ссылки могут видеть только зарегистрированные и активированные пользователи]
7.7 Если вылезло окошко с кнопкой "Ок" - жмём, появилось окошко мини дебагера с кнопкой "Stop" в углу справа.
7.8 Переходим в игру, ставим ещё один блок
7.9 В нашем дебагере появилось первая строчка, щёлкаем на неё 2 раза.
7.10 [Ссылки могут видеть только зарегистрированные и активированные пользователи] 1 - EAX Будет равен значению по адресу 0x017dbb84
2 - EAX Равен EAX * 0x000003a0
3 - Отнять у [EAX+Pointer]
4 - Pointer
p.s. Немного от меня, если число в скобочках (пример [000000F]) - то это адрес, если без (пример 000000F) - то это число
Тут главное понять как это работает + подучить ASM :)
8. Теперь нам надо воплотить это в C#, создаём кнопку, кидаем на неё код:
Process[] myprocess = Process.GetProcessesByName("client");
if (myprocess.Length != 0)
{
MemoryWorker.ReadProcess = myprocess[0];
MemoryWorker.OpenProcess();
int byteswritten;
int bytesread;
byte[] memory;
int pointerbase;
int value;
int eax;
int FinishedAdress;
pointerbase = 0x004A7F9C;
memory = MemoryWorker.ReadProcessMemory((IntPtr)0x017dbb84, 4, out bytesread);
eax = BitConverter.ToInt32(memory, 0);
FinishedAdress = eax * 0x000003a0;
FinishedAdress = FinishedAdress += pointerbase;
value = 100;
memory = BitConverter.GetBytes(value);
MemoryWorker.WriteProcessMemory((IntPtr)FinishedAd ress, memory, out byteswritten);
}
Как видно, всё ужжжжасно легко.
9.Это всё :). С вами был Nickitee.
Специально для Zhyk.ru
Права на гайд принадлежат Nickitee
Автор не несёт ответственности за злодеяния информацией
Всем привет! Сегодня мы будем учиться работать с памятью на C# (СиШарп), а именно "обходить" DMA (Dynamic Memory Allocation) это плохая вещь в играх и не только, когда адрес нужного нам значение в памяти, при каждом запуске игры меняется. Игру я взял AceOfSpades(AOS), в ней можно через CE менять значение к примеру патронов, и это будет не визуально, НО, при каждом новом запуске адрес другой. Этот гайд будет без VAMemory, для него вообще ничего не надо будет, кроме одного класса, который мы добавим в проэкт.
p.s. использовать статический адрес можно не только для изменения,а ещё к примеру для чтения при создании бота.
Что нам понадобиться:
1. Компилятор C#, я советую MVS 2010.
2. Класс для работы с памятью ([Ссылки могут видеть только зарегистрированные и активированные пользователи]).
3. CE.
4. Базовые знания C#.
Поехали...
1. Создадим проэкт.
2. Сохраним, изменим версию .net framerwork-a на 2.0
3. Удалим все не поддерживаемые библиотеки после этого и "using System.Linq"
4. [Ссылки могут видеть только зарегистрированные и активированные пользователи]
5. Теперь после
public Main() // тут будет название вашей формы
{
InitializeComponent();
}
Пишем:
ProcessMemoryReaderLib.ProcessMemoryReader MemoryWorker = new ProcessMemoryReaderLib.ProcessMemoryReader();
6. Используем такое:
using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
7. Теперь будем учиться работать с DMA, на пример я взял хак кубов для строения.
7.1 Запускаем AOS через сайт (выбираем сервер), запускаем CE, выбираем в CE "client.exe" (AceOfSpades)
7.2 Смотрим сколько у нас кубов - 50
7.3 Ставим 1 куб в игре, отсеиваем - 49
7.4 Делаем это пока не получим 1 адрес
7.5 Переносим адрес вниз
7.6 [Ссылки могут видеть только зарегистрированные и активированные пользователи]
7.7 Если вылезло окошко с кнопкой "Ок" - жмём, появилось окошко мини дебагера с кнопкой "Stop" в углу справа.
7.8 Переходим в игру, ставим ещё один блок
7.9 В нашем дебагере появилось первая строчка, щёлкаем на неё 2 раза.
7.10 [Ссылки могут видеть только зарегистрированные и активированные пользователи] 1 - EAX Будет равен значению по адресу 0x017dbb84
2 - EAX Равен EAX * 0x000003a0
3 - Отнять у [EAX+Pointer]
4 - Pointer
p.s. Немного от меня, если число в скобочках (пример [000000F]) - то это адрес, если без (пример 000000F) - то это число
Тут главное понять как это работает + подучить ASM :)
8. Теперь нам надо воплотить это в C#, создаём кнопку, кидаем на неё код:
Process[] myprocess = Process.GetProcessesByName("client");
if (myprocess.Length != 0)
{
MemoryWorker.ReadProcess = myprocess[0];
MemoryWorker.OpenProcess();
int byteswritten;
int bytesread;
byte[] memory;
int pointerbase;
int value;
int eax;
int FinishedAdress;
pointerbase = 0x004A7F9C;
memory = MemoryWorker.ReadProcessMemory((IntPtr)0x017dbb84, 4, out bytesread);
eax = BitConverter.ToInt32(memory, 0);
FinishedAdress = eax * 0x000003a0;
FinishedAdress = FinishedAdress += pointerbase;
value = 100;
memory = BitConverter.GetBytes(value);
MemoryWorker.WriteProcessMemory((IntPtr)FinishedAd ress, memory, out byteswritten);
}
Как видно, всё ужжжжасно легко.
9.Это всё :). С вами был Nickitee.
Специально для Zhyk.ru
Права на гайд принадлежат Nickitee
Автор не несёт ответственности за злодеяния информацией