Перейти к содержанию

Пишем трейнер на VC# 2010


Рекомендуемые сообщения

В этой статье я покажу как сделать трейнер , используя Visual C#..

Набрал немного опыта по этому языку по написанию трейнера, и сегодня я с вами поделюсь с опытом.

в нашем трейнере будет одна функция добавляем х-количество Трутниц.

Игра Amnesia: The Dark Deskent.

Что такое трутница, трутница это по моему порошок для, скажем служат для разжигания огня.

Количество трутниц в игре как всегда любой другой предмет мало.( Это не только мое мнение и мнение других Геймхакеров в игре всегда все мало.)

Вот что нам понадобится, а точнее нам понадобилось :

1. Amnesia: The Dark Deskent . Сама игра

1. Cheat Engine 6.1 Программа для поиска нужных нам значение в игре.

2. Visual Studio C#2010 среда разработки, на языке C# мы создадим наш трейнер

3. Мозг

Итак приступаем.

Для начала соберем необходимую нам информацию, а именно найдем адреса в которых лежат нужные нам значения, с программой Cheat Engine.

Я нашел нужный адрес и конечно он динамический при каждом запуске меняется, далее что делать!

Мы не будем писать Ассемблерный скрипт, а просто находим статичный адрес указателя и Офсеты (Смещение) или иначе говорят Пойнтеры.

Как надо найти статичный адрес указателя и смещение боле подробно в форуме.

Так далее, нашли статичный адрес указателя плюс смещение (офсеты) Рис_1 и Рис_1,1.

post-1568-1322223061,34_thumb.jpg post-1568-1322223082,56_thumb.jpg

Запускаем VC#

Создаем новый проект выбираем Приложение Windows Forms назначаем нужное имя и жмем окей и получаем готовую форму.

Далее добавляем на форму один button (кнопка) один Timer и два Label. Рис 2.1

post-1568-1322223145,37_thumb.jpg

В свойствах кнопки изменяем:

где Text убираем button1 пишем Добавить. Рис 2.2

а в свойствах Timer1 где Enabled поменяем значение с False на True

в Label1 где Text пишем Игра Не Запущена

а Label2 где Text просто стираем имя и все, оставляем пустое. После всего этого, наша форма будет смотреться так Рис 2.3

post-1568-1322223188,4_thumb.jpg post-1568-1322223199,9_thumb.jpg

Далее два раза кликаем по кнопке Добавить переходим к написанию кода. В пространстве имен добавим следующие имена:


using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Globalization;
using System.Threading;

Далее пишем под public partial class Form1 : Form вот этот код:


Memory oMemory = new Memory();
bool gamehacklab = true;

Далее в обработчик кнопки пишем следующий код:


Process[] aProcesses = Process.GetProcessesByName("Amnesia"); //Имя процесса игры в памяти, пишем без "exe"
if (aProcesses.Length != 0)
{
oMemory.ReadProcess = aProcesses[0];
oMemory.Open();

int myGame_Address = Addr.ToDec("0072836C"); // Статичный адрес указателя
int[] myGame_Offsets = { 0x84, 0x78 }; // Офсеты, смещение пишем в виде 0х--
int bytesWritten; //
byte[] bValue_To_Write = BitConverter.GetBytes(999); //3аписиваем 999 количество трутниц
string sWritten_Address = oMemory.PointerWrite((IntPtr)myGame_Address, bValue_To_Write, myGame_Offsets, out bytesWritten);

if (bytesWritten == bValue_To_Write.Length)
label1.Text = ("Добавлено 999Трутниц." + "!"); // Выводим текст если изменяется значение
else
label1.Text = ("Не Добавлено (Ошибка!). " + ".");// Выводим текст если ничего не получится

oMemory.CloseHandle();

Два раза кликаем по Timer1 и пишем следующий код:


Process[] aProcesses = Process.GetProcessesByName("Amnesia");
if (aProcesses.Length != 0)
{
gamehacklab = true;
label2.Text = "Игра запущена";

}

else
{
gamehacklab = false;
label2.Text = "Игра Не запущена";
}

И так пришло время писать класс чтобы программа имела доступ и изменение значение в памяти игры назовем клас по имени GmeHackLab. Нажимаем кнопку Проект далее Добавить класс в появившемся окне выбираем класс пишем имя класса GmeHackLab далее Добавить.

Здесь тоже в пространстве имен добавим следующие имена:


using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Globalization;
using System.Threading;

Получится вот такой код:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Globalization;
using System.Threading;


namespace trainer2
{
class GmeHackLab

{


[Flags]
public enum ProcessAccessType
{
PROCESS_TERMINATE = (0x0001),
PROCESS_CREATE_THREAD = (0x0002),
PROCESS_SET_SESSIONID = (0x0004),
PROCESS_VM_OPERATION = (0x0008),
PROCESS_VM_READ = (0x0010),
PROCESS_VM_WRITE = (0x0020),
PROCESS_DUP_HANDLE = (0x0040),
PROCESS_CREATE_PROCESS = (0x0080),
PROCESS_SET_QUOTA = (0x0100),
PROCESS_SET_INFORMATION = (0x0200),
PROCESS_QUERY_INFORMATION = (0x0400)
}

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);

[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(IntPtr hObject);

[DllImport("kernel32.dll")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);

[DllImport("kernel32.dll")]
public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten);
}

public class Memory
{
public Memory()
{
}

public Process ReadProcess
{
get
{
return m_ReadProcess;
}
set
{
m_ReadProcess = value;
}
}
private Process m_ReadProcess = null;
private IntPtr m_hProcess = IntPtr.Zero;

public void Open()
{
GmeHackLab.ProcessAccessType access = GmeHackLab.ProcessAccessType.PROCESS_VM_READ
| GmeHackLab.ProcessAccessType.PROCESS_VM_WRITE
| GmeHackLab.ProcessAccessType.PROCESS_VM_OPERATION;
m_hProcess = GmeHackLab.OpenProcess((uint)access, 1, (uint)m_ReadProcess.Id);
}

public void CloseHandle()
{
int iRetValue;
iRetValue = GmeHackLab.CloseHandle(m_hProcess);
if (iRetValue == 0)
throw new Exception("CloseHandle Failed");
}

public byte[] Read(IntPtr MemoryAddress, uint bytesToRead, out int bytesRead)
{
byte[] buffer = new byte[bytesToRead];
IntPtr ptrBytesRead;
GmeHackLab.ReadProcessMemory(m_hProcess, MemoryAddress, buffer, bytesToRead, out ptrBytesRead);
bytesRead = ptrBytesRead.ToInt32();
return buffer;
}

public byte[] PointerRead(IntPtr MemoryAddress, uint bytesToRead, int[] Offset, out int bytesRead)
{
int iPointerCount = Offset.Length - 1;
IntPtr ptrBytesRead;
bytesRead = 0;
byte[] buffer = new byte[4]; //DWORD to hold an Address
int tempAddress = 0;

if (iPointerCount == 0)
{
GmeHackLab.ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesRead);
tempAddress = Addr.ToDec(Addr.Make(buffer)) + Offset[0]; //Final Address

buffer = new byte[bytesToRead];
GmeHackLab.ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, bytesToRead, out ptrBytesRead);

bytesRead = ptrBytesRead.ToInt32();
return buffer;
}

for (int i = 0; i <= iPointerCount; i++)
{
if (i == iPointerCount)
{
GmeHackLab.ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesRead);
tempAddress = Addr.ToDec(Addr.Make(buffer)) + Offset[i]; //Final Address

buffer = new byte[bytesToRead];
GmeHackLab.ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, bytesToRead, out ptrBytesRead);

bytesRead = ptrBytesRead.ToInt32();
return buffer;
}
else if (i == 0)
{
GmeHackLab.ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesRead);
tempAddress = Addr.ToDec(Addr.Make(buffer)) + Offset[1];
}
else
{
GmeHackLab.ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesRead);
tempAddress = Addr.ToDec(Addr.Make(buffer)) + Offset[i];
}
}

return buffer;
}

public void Write(IntPtr MemoryAddress, byte[] bytesToWrite, out int bytesWritten)
{
IntPtr ptrBytesWritten;
GmeHackLab.WriteProcessMemory(m_hProcess, MemoryAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);
bytesWritten = ptrBytesWritten.ToInt32();
}

public string PointerWrite(IntPtr MemoryAddress, byte[] bytesToWrite, int[] Offset, out int bytesWritten)
{
int iPointerCount = Offset.Length - 1;
IntPtr ptrBytesWritten;
bytesWritten = 0;
byte[] buffer = new byte[4]; //DWORD to hold an Address
int tempAddress = 0;

if (iPointerCount == 0)
{
GmeHackLab.ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesWritten);
tempAddress = Addr.ToDec(Addr.Make(buffer)) + Offset[0]; //Final Address
GmeHackLab.WriteProcessMemory(m_hProcess, (IntPtr)tempAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);

bytesWritten = ptrBytesWritten.ToInt32();
return Addr.ToHex(tempAddress);
}

for (int i = 0; i <= iPointerCount; i++)
{
if (i == iPointerCount)
{
GmeHackLab.ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesWritten);
tempAddress = Addr.ToDec(Addr.Make(buffer)) + Offset[i]; //Final Address
GmeHackLab.WriteProcessMemory(m_hProcess, (IntPtr)tempAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);

bytesWritten = ptrBytesWritten.ToInt32();
return Addr.ToHex(tempAddress);
}
else if (i == 0)
{
GmeHackLab.ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesWritten);
tempAddress = Addr.ToDec(Addr.Make(buffer)) + Offset[i];
}
else
{
GmeHackLab.ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesWritten);
tempAddress = Addr.ToDec(Addr.Make(buffer)) + Offset[i];
}
}

return Addr.ToHex(tempAddress);
}

public int PID()
{
return m_ReadProcess.Id;
}

public string BaseAddressH()
{
return Addr.ToHex(m_ReadProcess.MainModule.BaseAddress.ToInt32());
}

public int BaseAddressD()
{
return m_ReadProcess.MainModule.BaseAddress.ToInt32();
}
}

public class Addr
{
public static string Make(byte[] buffer)
{
string sTemp = "";

for (int i = 0; i < buffer.Length; i++)
{
if (Convert.ToInt16(buffer[i]) < 10)
sTemp = "0" + ToHex(buffer[i]) + sTemp;
else
sTemp = ToHex(buffer[i]) + sTemp;
}

return sTemp;
}

public static string ToHex(int Decimal)
{
return Decimal.ToString("X"); //Convert Decimal to Hexadecimal
}

public static int ToDec(string Hex)
{
return int.Parse(Hex, NumberStyles.HexNumber); //Convert Hexadecimal to Decimal
}
}
}

Скопируйте код в свой проект.

Запускаем трейнер (программу) и естественно игру, нажимаем кнопку Добавить получаем нужное количество Трутниц.

post-1568-1322225262,53_thumb.jpg

Вот и всё.

  • Плюс 3
Ссылка на комментарий
Поделиться на другие сайты

ZOCKIR, помоему все усложненно, особенно Pointer(Read/Write) я правда на C# не писал, не знаю как там с типами (в частности с указателями), но примерно так.


public byte[] PointerRead(IntPtr MemoryAddress, uint bytesToRead, int[] Offset, out int bytesRead)
{
int iPointerCount = Offset.Length - 1;
int ptrBytesRead;
int buffer = new byte[bytesToRead];

for (int i = 0; i < iPointerCount; i++)
{
GmeHackLab.ReadProcessMemory(m_hProcess, (IntPtr)MemoryAddress, (IntPtr)MemoryAddress, 4, out ptrBytesRead);
MemoryAddress += Offset[i];
}

GmeHackLab.ReadProcessMemory(m_hProcess, (IntPtr)MemoryAddress, (IntPtr)buffer, bytesToRead, out ptrBytesRead);
return buffer;
}

Вот так бы это выглядело на Delphi


procedure ReadMemory(Address: Pointer; Offsets: array of Word; Buffer: Pointer; Size: Integer);
var
I: Integer;
bytesRead: Iteger;
begin
for I := 0 to High(Offsets) do
begin
if ReadProcessMemory(h_Process, Address, @Address, bytesRead) then
Inc(Address, Offsets[I]);
end;
ReadProcessMemory(h_Process, Address, Buffer, Size);
end;

Ссылка на комментарий
Поделиться на другие сайты

GodGame я сам не разобрался с этим кодом мне один иностранный чувак из чиетенжине подсказал точнее подправил код.

Это оптимальный вариант для внедрения кода на c#, работа с офсетами. :grin:

(Я не программист, пока у меня средний уровень знание этого языка)

По Дельфи особо не интересовался.

Если кто покажет данный код более облегченно на c# ,будем обсуждать.

Ссылка на комментарий
Поделиться на другие сайты

Если кто покажет данный код более облегченно на c# ,будем обсуждать.

Ну как-бы я выше написал как можно упростить функцию PointerRead, с PointerWrite практически аналогично, единственное типы у переменных надо доработать.

Ссылка на комментарий
Поделиться на другие сайты

GodGame я сам не разобрался с этим кодом мне один иностранный чувак из чиетенжине подсказал точнее подправил код.

Это оптимальный вариант для внедрения кода на c#, работа с офсетами. :grin:

(Я не программист, пока у меня средний уровень знание этого языка)

По Дельфи особо не интересовался.

Если кто покажет данный код более облегченно на c# ,будем обсуждать.

Во-первых, как-то странно выкладывать статью, код которой ты не до конца понял. O-=

Во-вторых, покажи места, которые тебе не понятны - попробуем объяснить\оптимизировать. :lol:

Ссылка на комментарий
Поделиться на другие сайты

keng я же не (пока) программист :-D писал то что знаю как это делается, а любой программист без учебника ноль без палки,

Мне просто помогли с класс Memory по набрал в сети много чего полезного а,

На днях сделал горяч. клавиш к трейнеру и конечно все с учебника.

Если ты себя считаешь программистом посмотри этот код, что он из себя выдает?

Код я сам писал, пример в сети.


public class Memory
{
private Process m_ReadProcess = null;
private IntPtr m_hProcess = IntPtr.Zero;

public Process ReadProcess
{
get
{
return m_ReadProcess;
}
set
{
m_ReadProcess = value;
}
}

public void Open()
{
ProcessAccessType access = ProcessAccessType.PROCESS_VM_READ
| ProcessAccessType.PROCESS_VM_WRITE
| ProcessAccessType.PROCESS_VM_OPERATION;
m_hProcess = OpenProcess((uint)access, 1, (uint)m_ReadProcess.Id);
}

public void CloseHandle()
{
int iRetValue;
iRetValue = CloseHandle(m_hProcess);
if (iRetValue == 0)
{
throw new Exception("CloseHandle Failed");
}
}

public byte[] Read(IntPtr MemoryAddress, uint bytesToRead, out int bytesRead)
{
byte[] buffer = new byte[bytesToRead];
IntPtr ptrBytesRead;
ReadProcessMemory(m_hProcess, MemoryAddress, buffer, bytesToRead, out ptrBytesRead);
bytesRead = ptrBytesRead.ToInt32();
return buffer;
}

public byte[] PointerRead(IntPtr MemoryAddress, uint bytesToRead, int[] Offset, out int bytesRead)
{
int iPointerCount = Offset.Length - 1;
IntPtr ptrBytesRead;
bytesRead = 0;
byte[] buffer = new byte[4]; //DWORD to hold an Address
int tempAddress = 0;

if (iPointerCount == 0)
{


ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesRead);
tempAddress = ToDec(Make(buffer)) + Offset[0]; //Final Address

buffer = new byte[bytesToRead];
ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, bytesToRead, out ptrBytesRead);

bytesRead = ptrBytesRead.ToInt32();

//MessageBox.Show(bytesRead.ToString());

return buffer;


}

for (int i = 0; i <= iPointerCount; i++)
{
if (i == iPointerCount)
{
ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesRead);
tempAddress = ToDec(Make(buffer)) + Offset[i]; //Final Address

buffer = new byte[bytesToRead];
ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, bytesToRead, out ptrBytesRead);

bytesRead = ptrBytesRead.ToInt32();
return buffer;
}
else if (i == 0)
{
ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesRead);
tempAddress = ToDec(Make(buffer)) + Offset[1];
}
else
{
ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesRead);
tempAddress = ToDec(Make(buffer)) + Offset[i];
}
}

return buffer;
}

public void Write(IntPtr MemoryAddress, byte[] bytesToWrite, out int bytesWritten)
{
IntPtr ptrBytesWritten;
WriteProcessMemory(m_hProcess, MemoryAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);
bytesWritten = ptrBytesWritten.ToInt32();
}

public string PointerWrite(IntPtr MemoryAddress, byte[] bytesToWrite, int[] Offset, out int bytesWritten)
{
int iPointerCount = Offset.Length - 1;
IntPtr ptrBytesWritten;
bytesWritten = 0;
byte[] buffer = new byte[4]; //DWORD to hold an Address
int tempAddress = 0;

if (iPointerCount == 0)
{
ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesWritten);
tempAddress = ToDec(Make(buffer)) + Offset[0]; //Final Address
WriteProcessMemory(m_hProcess, (IntPtr)tempAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);

bytesWritten = ptrBytesWritten.ToInt32();
return ToHex(tempAddress);
}

//only necessary for multiple OFFSETS
for (int i = 0; i <= iPointerCount; i++)
{
if (i == iPointerCount)
{
ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesWritten);
tempAddress = ToDec(Make(buffer)) + Offset[i]; //Final Address
WriteProcessMemory(m_hProcess, (IntPtr)tempAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);

bytesWritten = ptrBytesWritten.ToInt32();
return ToHex(tempAddress);
}
else if (i == 0)
{
ReadProcessMemory(m_hProcess, MemoryAddress, buffer, 4, out ptrBytesWritten);
tempAddress = ToDec(Make(buffer)) + Offset[i];
}
else
{
ReadProcessMemory(m_hProcess, (IntPtr)tempAddress, buffer, 4, out ptrBytesWritten);
tempAddress = ToDec(Make(buffer)) + Offset[i];
}
}

return ToHex(tempAddress);
}

public int PID()
{
return m_ReadProcess.Id;
}

public string BaseAddressH()
{
return ToHex(m_ReadProcess.MainModule.BaseAddress.ToInt32());
}

public int BaseAddressD()
{
return m_ReadProcess.MainModule.BaseAddress.ToInt32();
}

[Flags]
public enum ProcessAccessType
{
PROCESS_TERMINATE = (0x0001),
PROCESS_CREATE_THREAD = (0x0002),
PROCESS_SET_SESSIONID = (0x0004),
PROCESS_VM_OPERATION = (0x0008),
PROCESS_VM_READ = (0x0010),
PROCESS_VM_WRITE = (0x0020),
PROCESS_DUP_HANDLE = (0x0040),
PROCESS_CREATE_PROCESS = (0x0080),
PROCESS_SET_QUOTA = (0x0100),
PROCESS_SET_INFORMATION = (0x0200),
PROCESS_QUERY_INFORMATION = (0x0400)
}

public static string Make(byte[] buffer)
{
string sTemp = "";

for (int i = 0; i < buffer.Length; i++)
{
if (Convert.ToInt16(buffer[i]) < 10)
{
sTemp = "0" + ToHex(buffer[i]) + sTemp;
}
else
{
sTemp = ToHex(buffer[i]) + sTemp;
}
}
return sTemp;
}

public static string ToHex(int Decimal)
{
return Decimal.ToString("X"); //Convert Decimal to Hexadecimal
}

public static int ToDec(string Hex)
{
return int.Parse(Hex, NumberStyles.HexNumber); //Convert Hexadecimal to Decimal
}

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);

[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(IntPtr hObject);

[DllImport("kernel32.dll")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);

[DllImport("kernel32.dll")]
public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten);

}
}

Ссылка на комментарий
Поделиться на другие сайты

Класс реализует поддержку WINApi-функций для чтения и записи байт в память, а так же - реализует работу с указателями, в том числе и многоуровневыми. Методы Write()\Read() и PointerWrite()\PointerRead() я бы объединил, т.к. они отличаются между собой всего парой строчек, т.е. вместо двух пар практически одинаковых методов оставил бы MemoryReadWrite(bool rw) и PointerReadWrite(bool rw), а в дальнейшем вообще объединил всё в один метод, которому бы пихались в виде аргументов адрес памяти, оффсеты (если есть - то это указатель), булевый флаг - читать или писать и набор байт, который нужно прочитать или записать в память. Будет удобно, красиво и универсально.

PS: Я не считаю себя программистом, но я им работаю. (:

Ссылка на комментарий
Поделиться на другие сайты

Просто написание статьи подразумевает изучение предметной области этой статьи, а следовательно - надо быть готовым отвечать на вопросы по охватываемому материалу. А тут вопросы задаёт сам автор статьи. :lol:

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

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Записал на VC# несколько трейнеров.

Исходный код трейнера к игре Amnesia: The Dark Deskent. тут боле разборчиво с кодом.

Train.rar

После компиляции трейнер весит ~50клб, + в трейнере звуковое сопровождение.

Вопрос нашим товарищам как упаковать exe приложение с winupackom или upack как то так называется упаковщик, NET приложение?

Эти упаковщики хорошо выполняют свою работу записанные приложение на asm,delphi и т.д.

Ссылка на комментарий
Поделиться на другие сайты

Записал на VC# несколько трейнеров.

Исходный код трейнера к игре Amnesia: The Dark Deskent. тут боле разборчиво с кодом.

Train.rar

После компиляции трейнер весит ~50клб, + в трейнере звуковое сопровождение.

Вопрос нашим товарищам как упаковать exe приложение с winupackom или upack как то так называется упаковщик, NET приложение?

Эти упаковщики хорошо выполняют свою работу записанные приложение на asm,delphi и т.д.

ЕХЕ-файлы под .NET - это не совсем обычные PE-формата бинарники, так что стандартными пакерами они жмутся вроде как фиговенько. Насколько я помню, можно поиграться с настройками компилятора - тогда размер будет меньше.

Ссылка на комментарий
Поделиться на другие сайты

Получается надо как то настроить компилятор чтоб не компилировал ненужные коды в екзешнике и т.д сжымать ресурсы.

Думаю можно выиграть из этого, будет меньше на 15клб, ну это мало конечно.

Ссылка на комментарий
Поделиться на другие сайты

Получается надо как то настроить компилятор чтоб не компилировал ненужные коды в екзешнике и т.д сжымать ресурсы.

Думаю можно выиграть из этого, будет меньше на 15клб, ну это мало конечно.

Ну и не мегабайт, опять же! :D

Как вариант - запихать какие-нибудь из функций во внешнии DLL, которые написать не на решётках, а на плюсах, к примеру - они уже на ура пожмутся. Ещё довольно много места занимают картинки, например.

Ссылка на комментарий
Поделиться на другие сайты

PS: На пакеры многие антивирусы любят ругаться - мол, hack-tool и вообще не торт - православные PE Executables сжимать чем-то. Имей ввиду, если будешь ими пользоваться. Вечером качну сорцы трейнера - может, посоветую чего.

PPS: Очень надеюсь, что музыка там не в виде wav-файла. :lol:

Ссылка на комментарий
Поделиться на другие сайты

ты совершенно прав там wav аудио :grin: другим способом пока не делаю, експресверсия тока так может а другой модуль подключать требует помоему проффесональную версию требует.

С лоада убрал музон, музон тока действует при активации и деактивации трейнера.

Ссылка на комментарий
Поделиться на другие сайты

ты совершенно прав там wav аудио :grin: другим способом пока не делаю, експресверсия тока так может а другой модуль подключать требует помоему проффесональную версию требует.

С лоада убрал музон, музон тока действует при активации и деактивации трейнера.

poker-face.jpg

[Держы], например! Проигрыватель .xm-файлов под .NET, там вроде даже примеры есть. По сути - порт оригинального fmod, который используется в большинстве кейгенов\патчей\трейнеров.

Ссылка на комментарий
Поделиться на другие сайты

fmod.dll я как то загружал в свой проект, воспроизвести хм, но в трейнере как то были затруднение.

спс за ссылку на днях посмотрю.

Ссылка на комментарий
Поделиться на другие сайты

fmod.dll я как то загружал в свой проект, воспроизвести хм, но в трейнере как то были затруднение.

спс за ссылку на днях посмотрю.

Могу показать, как с длл-кой это делается - там вроде ничего сверхъестественного нету.

Ссылка на комментарий
Поделиться на другие сайты

Загружать длл в проект работать с ним я знаю, в сети много пре :grin: ктов.

Ну чтож внедряем в проект(трейнер) хм-трек посмотрем что у меня получится.

:grin:

Ссылка на комментарий
Поделиться на другие сайты

Да, по поводу пакеров. Сейчас накидал простенькое WinForms-приложение - формочка с двумя кнопками, умеющая рожать MessageBox'ы. Без ресурсов, правда. Использовал настройки, как на скриншоте в аттаче, результат сжатия можно лицезреть там же. laugh.gif

PS: [Вот ещё парочка пакеров], чисто доцнетовских.

post-6695-1323941727,4_thumb.png

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Данный код не работает.

После того как тыкаешь, чтобы изменить значение, вылетает ошибка на строке

if (iRetValue == 0)

throw new Exception("CloseHandle Failed");

}

Вот моя Form1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Globalization;
using System.Threading;
using trainer2;

namespace IE
{
public partial class Form1 : Form
{
trainer2.Memory oMemory = new Memory();
bool gamehacklab = true;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Process[] aProcesses = Process.GetProcessesByName("war3"); //Имя процесса игры в памяти, пишем без "exe"
if (aProcesses.Length != 0)
{
oMemory.ReadProcess = aProcesses[0];
oMemory.Open();

int myGame_Address = Addr.ToDec("52C0000"); // Статичный адрес указателя
int[] myGame_Offsets = { 0x42CA1A }; // Офсеты, смещение пишем в виде 0х--
int bytesWritten; //
byte[] bValue_To_Write = BitConverter.GetBytes(15); //3аписиваем 999 количество трутниц
string sWritten_Address = oMemory.PointerWrite((IntPtr)myGame_Address, bValue_To_Write, myGame_Offsets, out bytesWritten);

if (bytesWritten == bValue_To_Write.Length)
label1.Text = ("MapHack Enabled." + "!"); // Выводим текст если изменяется значение
else
label1.Text = ("MapHack Disabled (Error!). " + ".");// Выводим текст если ничего не получится

oMemory.CloseHandle();
}
}

private void timer1_Tick(object sender, EventArgs e)
{
Process[] aProcesses = Process.GetProcessesByName("war3");
if (aProcesses.Length != 0)
{
gamehacklab = true;
label2.Text = "Игра запущена";

}

else
{
gamehacklab = false;
label2.Text = "Игра Не запущена";
}
}
}
}

В чём проблема?

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

У кого то есть пример поиска в памяти процесса значения по маске байтов?

Буду благодарен.

[Тык]. По ссылке - видеоурок с английскими пояснениями, плагин для создания сигнатур для ollydbg + код функции на С++. Код простой и небольшой, так что перевести его на решётки будет легко.

Ссылка на комментарий
Поделиться на другие сайты

Ссылку глянул. Я новичок в си, насколько я понял по видеоуроку, там просиходит инекция длл. Функция что там описана, можете ее синтаксис расписать? Или может есть способ попроще для поиска адреса по известным байтам?


using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Globalization;
using System.Threading;
using System.Media;

namespace Train
{
public partial class Form1 : Form
{
string text = " RomaN predstavlyaet ";
Memory oMemory = new Memory();
Process[] oProcess;
bool GameRunning = false;

///Код функции вставлять сюда?

bool UnlimitedHelath = false;
string HealthPointer = "0072836C";
int[] HealthOffset = { 0x84, 0x64 };
int HealthToFill = 999;

bool UnlimitedSanity = false;
string SanityPointer = "0072836C";
int[] SanityOffset = { 0x84, 0x68 };
int SanityToFill = 999;

bool UnlimitedOilLevel = false;
string OilPointer = "0072836c ";
int[] OilOffset = { 0x84, 0x6C };
int OilToFill = 102;

bool UnlimitedTinderboxes = false;
string TinderboxesPointer = "0072836C";
int[] TinderboxesOffset = { 0x84, 0x78 };
int TinderboxesToFill = 999;

public Form1()
{
InitializeComponent();
}

private readonly SoundPlayer _soundPlayer = new SoundPlayer();
private void GameRunningTMR_Tick(object sender, EventArgs e)
{
oProcess = Process.GetProcessesByName("FlashEx_Client");
if (oProcess.Length != 0)
{
GameRunning = true;
label5.Text = "Game Running";
}
else
{
GameRunning = false;
label5.Text = "The Game Is Not Running";
}
}

private void label1_Click(object sender, EventArgs e)
{
if (GameRunning)
{
if (UnlimitedTinderboxes)
{
UnlimitedTinderboxes = false;
label1.Text = "F1---- Unlimited Tinderboxes on/off";
}
else
{
UnlimitedTinderboxes = true;
label1.Text = "F1---- Unlimited Tinderboxes on/off";

}

}
}

private void label2_Click(object sender, EventArgs e)
{
if (GameRunning)
{
if (UnlimitedHelath)
{
UnlimitedHelath = false;
label2.Text = "F2---- Unlimited Health on/off";
}
else
{
UnlimitedHelath = true;
label2.Text = "F2---- Unlimited Health on/off";

}

}
}

private void label3_Click(object sender, EventArgs e)
{
if (GameRunning)
{
if (UnlimitedSanity)
{
UnlimitedSanity = false;
label3.Text = "F3--- Unlimited Sanity on/off";
}
else
{
UnlimitedSanity = true;
label3.Text = "F3--- Unlimited Sanity on/off";

}
}
}

private void label4_Click(object sender, EventArgs e)
{
if (GameRunning)
{
if (UnlimitedOilLevel)
{
UnlimitedOilLevel = false;
label4.Text = "F4---- Unlimited Oil Level on/off";
}
else
{
UnlimitedOilLevel = true;
label4.Text = "F4---- Unlimited Oil Level on/off";

}
}
}

private void UnlimitedHealthTMR_Tick(object sender, EventArgs e)
{
Process[] aProcessces = Process.GetProcessesByName("FlashEx_Client");
if (UnlimitedHelath)
{

oMemory.ReadProcess = oProcess[0];
oMemory.Open();

int pointerAdress = Addr.ToDec(HealthPointer);
int[] pointerOffset = HealthOffset;

int bytesWritten;
byte[] valueToWrite = BitConverter.GetBytes((float)HealthToFill);
string sWritten_Address = oMemory.PointerWrite((IntPtr)pointerAdress, valueToWrite, pointerOffset, out bytesWritten);

// if (bytesWritten == valueToWrite.Length)
// label7.Text = ("Health Activation");
//else
// label7.Text = ("Health Deactivation");



oMemory.CloseHandle();
}
Process[] aProcesses = Process.GetProcessesByName("FlashEx_Client");
if (UnlimitedSanity)
{
oMemory.ReadProcess = oProcess[0];
oMemory.Open();

int pointerAdress = Addr.ToDec(SanityPointer);
int[] pointerOffset = SanityOffset;

int bytesWritten;
byte[] valueToWrite = BitConverter.GetBytes((float)SanityToFill);
string sWritten_Address = oMemory.PointerWrite((IntPtr)pointerAdress, valueToWrite, pointerOffset, out bytesWritten);

oMemory.CloseHandle();
}
Process[] aProcessses = Process.GetProcessesByName("FlashEx_Client");
if (UnlimitedOilLevel)
{
oMemory.ReadProcess = oProcess[0];
oMemory.Open();

int pointerAdress = Addr.ToDec(OilPointer);
int[] pointerOffset = OilOffset;

int bytesWritten;
byte[] valueToWrite = BitConverter.GetBytes((float)OilToFill);
string sWritten_Address = oMemory.PointerWrite((IntPtr)pointerAdress, valueToWrite, pointerOffset, out bytesWritten);

oMemory.CloseHandle();
}
Process[] aProcesssces = Process.GetProcessesByName("FlashEx_Client");
if (UnlimitedTinderboxes)
{
oMemory.ReadProcess = oProcess[0];
oMemory.Open();

int pointerAdress = Addr.ToDec(TinderboxesPointer);
int[] pointerOffset = TinderboxesOffset;

int bytesWritten;
byte[] valueToWrite = BitConverter.GetBytes(TinderboxesToFill);
string sWritten_Address = oMemory.PointerWrite((IntPtr)pointerAdress, valueToWrite, pointerOffset, out bytesWritten);

oMemory.CloseHandle();
}
}

private void Form1_Load(object sender, EventArgs e)
{
KeyboardHook.CreateHook(KeyReader);
}
public void KeyReader(IntPtr wParam, IntPtr lParam)
{
int key = Marshal.ReadInt32(lParam);
KeyboardHook.VK vk = (KeyboardHook.VK)key;
String temp = "";

switch (vk)
{
case KeyboardHook.VK.VK_F1: temp = "<-F1->";
break;
case KeyboardHook.VK.VK_F2: temp = "<-F2->";
break;
case KeyboardHook.VK.VK_F3: temp = "<-F3->";
break;
case KeyboardHook.VK.VK_F4: temp = "<-F4->";
break;
case KeyboardHook.VK.VK_F5: temp = "<-F5->";
break;
case KeyboardHook.VK.VK_F6: temp = "<-F6->";
break;
case KeyboardHook.VK.VK_F7: temp = "<-F7->";
break;
case KeyboardHook.VK.VK_F8: temp = "<-F8->";
break;
case KeyboardHook.VK.VK_F9: temp = "<-F9->";
break;
case KeyboardHook.VK.VK_F10: temp = "<-F10->";
break;
case KeyboardHook.VK.VK_F11: temp = "<-F11->";
break;
case KeyboardHook.VK.VK_F12: temp = "<-F12->";
break;
case KeyboardHook.VK.VK_NUMLOCK: temp = "<-numlock->";
break;
case KeyboardHook.VK.VK_SCROLL: temp = "<-scroll>";
break;
case KeyboardHook.VK.VK_LSHIFT: temp = "<-left shift->";
break;
case KeyboardHook.VK.VK_RSHIFT: temp = "<-right shift->";
break;
case KeyboardHook.VK.VK_LCONTROL: temp = "<-left control->";
break;
case KeyboardHook.VK.VK_RCONTROL: temp = "<-right control->";
break;
case KeyboardHook.VK.VK_SEPERATOR: temp = "|";
break;
case KeyboardHook.VK.VK_SUBTRACT: temp = "-";
break;
case KeyboardHook.VK.VK_ADD: temp = "+";
break;
case KeyboardHook.VK.VK_DECIMAL: temp = ".";
break;
case KeyboardHook.VK.VK_DIVIDE: temp = "/";
break;
case KeyboardHook.VK.VK_NUMPAD0: temp = "0";
break;
case KeyboardHook.VK.VK_NUMPAD1: temp = "1";
break;
case KeyboardHook.VK.VK_NUMPAD2: temp = "2";
break;
case KeyboardHook.VK.VK_NUMPAD3: temp = "3";
break;
case KeyboardHook.VK.VK_NUMPAD4: temp = "4";
break;
case KeyboardHook.VK.VK_NUMPAD5: temp = "5";
break;
case KeyboardHook.VK.VK_NUMPAD6: temp = "6";
break;
case KeyboardHook.VK.VK_NUMPAD7: temp = "7";
break;
case KeyboardHook.VK.VK_NUMPAD8: temp = "8";
break;
case KeyboardHook.VK.VK_NUMPAD9: temp = "9";
break;
case KeyboardHook.VK.VK_Q: temp = "q";
break;
case KeyboardHook.VK.VK_W: temp = "w";
break;
case KeyboardHook.VK.VK_E: temp = "e";
break;
case KeyboardHook.VK.VK_R: temp = "r";
break;
case KeyboardHook.VK.VK_T: temp = "t";
break;
case KeyboardHook.VK.VK_Y: temp = "y";
break;
case KeyboardHook.VK.VK_U: temp = "u";
break;
case KeyboardHook.VK.VK_I: temp = "i";
break;
case KeyboardHook.VK.VK_O: temp = "o";
break;
case KeyboardHook.VK.VK_P: temp = "p";
break;
case KeyboardHook.VK.VK_A: temp = "a";
break;
case KeyboardHook.VK.VK_S: temp = "s";
break;
case KeyboardHook.VK.VK_D: temp = "d";
break;
case KeyboardHook.VK.VK_F: temp = "f";
break;
case KeyboardHook.VK.VK_G: temp = "g";
break;
case KeyboardHook.VK.VK_H: temp = "h";
break;
case KeyboardHook.VK.VK_J: temp = "j";
break;
case KeyboardHook.VK.VK_K: temp = "k";
break;
case KeyboardHook.VK.VK_L: temp = "l";
break;
case KeyboardHook.VK.VK_Z: temp = "z";
break;
case KeyboardHook.VK.VK_X: temp = "x";
break;
case KeyboardHook.VK.VK_C: temp = "c";
break;
case KeyboardHook.VK.VK_V: temp = "v";
break;
case KeyboardHook.VK.VK_B: temp = "b";
break;
case KeyboardHook.VK.VK_N: temp = "n";
break;
case KeyboardHook.VK.VK_M: temp = "m";
break;
case KeyboardHook.VK.VK_0: temp = "0";
break;
case KeyboardHook.VK.VK_1: temp = "1";
break;
case KeyboardHook.VK.VK_2: temp = "2";
break;
case KeyboardHook.VK.VK_3: temp = "3";
break;
case KeyboardHook.VK.VK_4: temp = "4";
break;
case KeyboardHook.VK.VK_5: temp = "5";
break;
case KeyboardHook.VK.VK_6: temp = "6";
break;
case KeyboardHook.VK.VK_7: temp = "7";
break;
case KeyboardHook.VK.VK_8: temp = "8";
break;
case KeyboardHook.VK.VK_9: temp = "9";
break;
case KeyboardHook.VK.VK_SNAPSHOT: temp = "<-print screen->";
break;
case KeyboardHook.VK.VK_INSERT: temp = "<-insert->";
break;
case KeyboardHook.VK.VK_DELETE: temp = "<-delete->";
break;
case KeyboardHook.VK.VK_BACK: temp = "<-backspace->";
break;
case KeyboardHook.VK.VK_TAB: temp = "<-tab->";
break;
case KeyboardHook.VK.VK_RETURN: temp = "<-enter->";
break;
case KeyboardHook.VK.VK_PAUSE: temp = "<-pause->";
break;
case KeyboardHook.VK.VK_CAPITAL: temp = "<-caps lock->";
break;
case KeyboardHook.VK.VK_ESCAPE: temp = "<-esc->";
break;
case KeyboardHook.VK.VK_SPACE: temp = " "; //was <-space->
break;
case KeyboardHook.VK.VK_PRIOR: temp = "<-page up->";
break;
case KeyboardHook.VK.VK_NEXT: temp = "<-page down->";
break;
case KeyboardHook.VK.VK_END: temp = "<-end->";
break;
case KeyboardHook.VK.VK_HOME: temp = "<-home->";
break;
case KeyboardHook.VK.VK_LEFT: temp = "<-arrow left->";
break;
case KeyboardHook.VK.VK_UP: temp = "<-arrow up->";
break;
case KeyboardHook.VK.VK_RIGHT: temp = "<-arrow right->";
break;
case KeyboardHook.VK.VK_DOWN: temp = "<-arrow down->";
break;
default: break;
}
#region Key triggers

if (temp == "<-F1->")
{
if (GameRunning)
{
if (UnlimitedTinderboxes)
{
UnlimitedTinderboxes = false;
label1.Text = "F1---- Unlimited Tinderboxes off";
_soundPlayer.Stream = Properties.Resources.deactivated;
_soundPlayer.Play();
}
else
{
UnlimitedTinderboxes = true;
label1.Text = "F1---- Unlimited Tinderboxes on";
_soundPlayer.Stream = Properties.Resources.activated;
_soundPlayer.Play();
}
}
}


if (temp == "<-F2->")
{
if (GameRunning)
{
if (UnlimitedHelath)
{
UnlimitedHelath = false;
label2.Text = "F2---- Unlimited Health off";
_soundPlayer.Stream = Properties.Resources.deactivated;
_soundPlayer.Play();
}
else
{
UnlimitedHelath = true;
label2.Text = "F2---- Unlimited Health on";
_soundPlayer.Stream = Properties.Resources.activated;
_soundPlayer.Play();
}
}
}


if (temp == "<-F3->")
{
if (GameRunning)
{
if (UnlimitedSanity)
{

UnlimitedSanity = false;
label3.Text = "F3---- Unlimited Sanity off";
_soundPlayer.Stream = Properties.Resources.deactivated;
_soundPlayer.Play();
}
else
{
UnlimitedSanity = true;
label3.Text = "F3---- Unlimited Sanity on";
_soundPlayer.Stream = Properties.Resources.activated;
_soundPlayer.Play();
}
}
}

if (temp == "<-F4->")
{
if (GameRunning)
{
if (UnlimitedOilLevel)
{

UnlimitedOilLevel = false;
label4.Text = "F4---- Unlimited Oil Level off";
_soundPlayer.Stream = Properties.Resources.deactivated;
_soundPlayer.Play();
}
else
{
UnlimitedOilLevel = true;
label4.Text = "F4---- Unlimited Oil Level on";
_soundPlayer.Stream = Properties.Resources.activated;
_soundPlayer.Play();

}
#endregion
}
}
}

private void timer1_Tick(object sender, EventArgs e)
{
text = text.Substring(1) + text[0];
label6.Text = text;
}
}
}
using System;

Чем скрывать код не нашел.

Изменено пользователем Xipho
Тэгом спойлера. Достаточно процитировать любое сообщение с этим тегом, и посмотреть, как он описывается.
Ссылка на комментарий
Поделиться на другие сайты

А что тут расписывать?

У тебя есть паттерн (строчка байт, которую нужно найти), маска (строчка байт вида "000xxx00xxx00xxx"), длина этой маски.

Ты берёшь адрес начала сканирования - StartAddress.

Адрес конца сканирования - EndAddress.

Читаешь кусочек памяти (через ReadProcessMemory) длиной в паттерн, сравниваешь побайтно прочитанное с паттерном, наложив на него маску - т.е. в моём примере 0 - нужный байт, x - любой.

Как только нашёлся кусок данных, равный паттерну (с наложенной маской) - возвращаешь адрес сканирования, это и будет нужный адрес

Вот пример из моего кода:

Паттерн: 0FFh,08Ch,088h,000h,000h,000h,000h,0A1h,000h,000h,000h,000h,083h,078h,070h,001h,075h,00Bh

Маска: "xxx0000x0000xxxxxx"

Приложил скриншот, приглядись там к опкодам. А потом посмотри на паттерн и маску.

post-6695-1330948171,66_thumb.png

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.