Devil9313 Опубликовано 22 апреля, 2015 Поделиться Опубликовано 22 апреля, 2015 Здравствуйте уважаемые GameHacker'ы мне нужна помощь у меня есть готовый класс VAmemory Показать контент using System;using System.Diagnostics;using System.Runtime.CompilerServices;using System.Runtime.InteropServices;using System.Text;using System.Windows.Forms;public class VAMemory{private IntPtr baseAddress;public static bool debugMode;private Process[] mainProcess;private IntPtr processHandle;private ProcessModule processModule;public VAMemory(){}public VAMemory(string pProcessName){this.processName = pProcessName;}public bool CheckProcess(){if (this.processName != null){this.mainProcess = Process.GetProcessesByName(this.processName);if (this.mainProcess.Length == 0){this.ErrorProcessNotFound(this.processName);return false;}this.processHandle = OpenProcess(0x1f0fff, false, this.mainProcess[0].Id);if (this.processHandle == IntPtr.Zero){this.ErrorProcessNotFound(this.processName);return false;}return true;}MessageBox.Show("Programmer, define process name first!");return false;}[DllImport("kernel32.dll")]private static extern bool CloseHandle(IntPtr hObject);private void ErrorProcessNotFound(string pProcessName){MessageBox.Show(this.processName + " is not running or has not been found. Please check and try again", "Process Not Found", MessageBoxButtons.OK, MessageBoxIcon.Hand);}[DllImport("kernel32.dll")]private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);public bool ReadBoolean(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToBoolean(this.ReadByteArray(pOffset, 1), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadByte" + exception.ToString());}return false;}}public byte ReadByte(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.ReadByteArray(pOffset, 1)[0];}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadByte" + exception.ToString());}return 0;}}public byte[] ReadByteArray(IntPtr pOffset, uint pSize){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{uint num;VirtualProtectEx(this.processHandle, pOffset, (UIntPtr) pSize, 4, out num);byte[] lpBuffer = new byte[pSize];ReadProcessMemory(this.processHandle, pOffset, lpBuffer, pSize, 0);VirtualProtectEx(this.processHandle, pOffset, (UIntPtr) pSize, num, out num);return lpBuffer;}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadByteArray" + exception.ToString());}return new byte[1];}}public char ReadChar(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToChar(this.ReadByteArray(pOffset, 1), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadChar" + exception.ToString());}return ' ';}}public double ReadDouble(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToDouble(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadDouble" + exception.ToString());}return 0.0;}}public float ReadFloat(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToSingle(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadFloat" + exception.ToString());}return 0f;}}public short ReadInt16(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt16(this.ReadByteArray(pOffset, 2), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInt16" + exception.ToString());}return 0;}}public int ReadInt32(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt32(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInt32" + exception.ToString());}return 0;}}public long ReadInt64(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt64(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInt64" + exception.ToString());}return 0L;}}public int ReadInteger(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt32(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInteger" + exception.ToString());}return 0;}}public long ReadLong(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt64(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadLong" + exception.ToString());}return 0L;}}[DllImport("kernel32.dll", SetLastError=true)]private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint dwSize, uint lpNumberOfBytesRead);public short ReadShort(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt16(this.ReadByteArray(pOffset, 2), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInt16" + exception.ToString());}return 0;}}public string ReadStringASCII(IntPtr pOffset, uint pSize){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return Encoding.ASCII.GetString(this.ReadByteArray(pOffset, pSize), 0, (int) pSize);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadStringASCII" + exception.ToString());}return "";}}public string ReadStringUnicode(IntPtr pOffset, uint pSize){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return Encoding.Unicode.GetString(this.ReadByteArray(pOffset, pSize), 0, (int) pSize);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadStringUnicode" + exception.ToString());}return "";}}public ushort ReadUInt16(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt16(this.ReadByteArray(pOffset, 2), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUInt16" + exception.ToString());}return 0;}}public uint ReadUInt32(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt32(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUInt32" + exception.ToString());}return 0;}}public ulong ReadUInt64(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt64(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUInt64" + exception.ToString());}return 0L;}}public uint ReadUInteger(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt32(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUInteger" + exception.ToString());}return 0;}}public long ReadULong(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return (long) BitConverter.ToUInt64(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadULong" + exception.ToString());}return 0L;}}public ushort ReadUShort(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt16(this.ReadByteArray(pOffset, 2), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUShort" + exception.ToString());}return 0;}}[DllImport("kernel32.dll", SetLastError=true, ExactSpelling=true)]private static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);[DllImport("kernel32.dll")]private static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);public bool WriteBoolean(IntPtr pOffset, bool pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteBoolean" + exception.ToString());}return false;}}public bool WriteByte(IntPtr pOffset, byte pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes((short) pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteByte" + exception.ToString());}return false;}}public bool WriteByteArray(IntPtr pOffset, byte[] pBytes){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{uint num;VirtualProtectEx(this.processHandle, pOffset, (UIntPtr) pBytes.Length, 4, out num);bool flag = WriteProcessMemory(this.processHandle, pOffset, pBytes, (uint) pBytes.Length, 0);VirtualProtectEx(this.processHandle, pOffset, (UIntPtr) pBytes.Length, num, out num);return flag;}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteByteArray" + exception.ToString());}return false;}}public bool WriteChar(IntPtr pOffset, char pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteChar" + exception.ToString());}return false;}}public bool WriteDouble(IntPtr pOffset, double pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteDouble" + exception.ToString());}return false;}}public bool WriteFloat(IntPtr pOffset, float pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteFloat" + exception.ToString());}return false;}}public bool WriteInt16(IntPtr pOffset, short pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteInt16" + exception.ToString());}return false;}}public bool WriteInt32(IntPtr pOffset, int pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteInt32" + exception.ToString());}return false;}}public bool WriteInt64(IntPtr pOffset, long pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteInt64" + exception.ToString());}return false;}}public bool WriteInteger(IntPtr pOffset, int pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteInt" + exception.ToString());}return false;}}public bool WriteLong(IntPtr pOffset, long pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteLong" + exception.ToString());}return false;}}[DllImport("kernel32.dll")]private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, uint lpNumberOfBytesWritten);public bool WriteShort(IntPtr pOffset, short pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteShort" + exception.ToString());}return false;}}public bool WriteStringASCII(IntPtr pOffset, string pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, Encoding.ASCII.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteStringASCII" + exception.ToString());}return false;}}public bool WriteStringUnicode(IntPtr pOffset, string pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, Encoding.Unicode.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteStringUnicode" + exception.ToString());}return false;}}public bool WriteUInt16(IntPtr pOffset, ushort pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteUInt16" + exception.ToString());}return false;}}public bool WriteUInt32(IntPtr pOffset, uint pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteUInt32" + exception.ToString());}return false;}}public bool WriteUInt64(IntPtr pOffset, ulong pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteUInt64" + exception.ToString());}return false;}}public bool WriteUInteger(IntPtr pOffset, uint pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteUInt" + exception.ToString());}return false;}}public bool WriteULong(IntPtr pOffset, ulong pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteULong" + exception.ToString());}return false;}}public bool WriteUShort(IntPtr pOffset, ushort pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteShort" + exception.ToString());}return false;}}public long getBaseAddress{get{this.baseAddress = IntPtr.Zero;this.processModule = this.mainProcess[0].MainModule;this.baseAddress = this.processModule.BaseAddress;return (long) this.baseAddress;}}public string processName { get; set; }[Flags]private enum ProcessAccessFlags : uint{All = 0x1f0fff,CreateThread = 2,DupHandle = 0x40,QueryInformation = 0x400,SetInformation = 0x200,Synchronize = 0x100000,Terminate = 1,VMOperation = 8,VMRead = 0x10,VMWrite = 0x20}private enum VirtualMemoryProtection : uint{PAGE_EXECUTE = 0x10,PAGE_EXECUTE_READ = 0x20,PAGE_EXECUTE_READWRITE = 0x40,PAGE_EXECUTE_WRITECOPY = 0x80,PAGE_GUARD = 0x100,PAGE_NOACCESS = 1,PAGE_NOCACHE = 0x200,PAGE_READONLY = 2,PAGE_READWRITE = 4,PAGE_WRITECOPY = 8,PROCESS_ALL_ACCESS = 0x1f0fff}}как записывать по статическому адресу байты я знаю int No_Flash = 0x776130; GameName.WriteByteArray((IntPtr)No_Flash, new byte[1] { 0xC3 }); а вот как работать с указателями я не знаю не могли бы вы мне помочь ?базовый адрес 6D459BУказатель - c1Указатель - 66cУказатель - 37bУказатель - 18мне нужно прочитать указатели и по полученному адресу уже писать байты буду очень благодарен вам за помощь Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 22 апреля, 2015 Поделиться Опубликовано 22 апреля, 2015 Привет! Воспользуйся поиском по форуму - есть несколько, по сути, однотипных тем про работу с указателями в различных языках программирования. PS: Думаю, пора создавать ЧАВО с подобными темами. Ссылка на комментарий Поделиться на другие сайты Поделиться
Devil9313 Опубликовано 22 апреля, 2015 Автор Поделиться Опубликовано 22 апреля, 2015 В 22.04.2015 в 19:56, keng сказал: Привет! Воспользуйся поиском по форуму - есть несколько, по сути, однотипных тем про работу с указателями в различных языках программирования. PS: Думаю, пора создавать ЧАВО с подобными темами.Мне нужно именно с этим классом VAMemory Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 22 апреля, 2015 Поделиться Опубликовано 22 апреля, 2015 Гм. У меня есть статья на тему указателей, вот [ссылка], там все довольно подробно расписано. Думаю, этого хватит для начала. Ссылка на комментарий Поделиться на другие сайты Поделиться
Devil9313 Опубликовано 23 апреля, 2015 Автор Поделиться Опубликовано 23 апреля, 2015 Мне нужно использовать функцию чтения указателей с данного класса который у меня Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 23 апреля, 2015 Поделиться Опубликовано 23 апреля, 2015 В 23.04.2015 в 00:20, Devil9313 сказал: Мне нужно использовать функцию чтения указателей с данного класса который у меняИ в чем проблема заключается? Поиск по форуму работает, эту тему подробно разбирали неоднократно (как на C++, так и на Delphi, так и на остальных языках). Все, что тебе нужно - воспользоваться поиском, прочитать сообщения, понять их смысл, и ты сможешь самостоятельно написать нужные функции (или даже модифицировать существующие). Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 23 апреля, 2015 Поделиться Опубликовано 23 апреля, 2015 Наверно, так VAM = new VAMemory("game"); IntPtr address = (IntPtr)0x6D459B; address = (IntPtr)(VAM.ReadULong(address)+0xc1) address = (IntPtr)(VAM.ReadULong(address)+0x66c) address = (IntPtr)(VAM.ReadULong(address)+0x37b) address = (IntPtr)(VAM.ReadULong(address)+0x18) VAM.WriteByteArray(address, new byte[1] { 0xC3 });Здесь нет проверок на 1) разрядность системы2) на существования адреса Если это 64 битное приложение, то адреса надо считать иначе.Если указатели бывают null, то будет исключение перед попыткой добавить смещение к null Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 23 апреля, 2015 Поделиться Опубликовано 23 апреля, 2015 В 23.04.2015 в 04:11, MasterGH сказал: Наверно, так Если каждый раз предоставлять готовое решение, пользователи сами думать не будут, и ничему не научатся. Ссылка на комментарий Поделиться на другие сайты Поделиться
Devil9313 Опубликовано 24 апреля, 2015 Автор Поделиться Опубликовано 24 апреля, 2015 В 23.04.2015 в 04:11, MasterGH сказал: Наверно, так VAM = new VAMemory("game"); IntPtr address = (IntPtr)0x6D459B; address = (IntPtr)(VAM.ReadULong(address)+0xc1) address = (IntPtr)(VAM.ReadULong(address)+0x66c) address = (IntPtr)(VAM.ReadULong(address)+0x37b) address = (IntPtr)(VAM.ReadULong(address)+0x18) VAM.WriteByteArray(address, new byte[1] { 0xC3 });Здесь нет проверок на 1) разрядность системы2) на существования адреса Если это 64 битное приложение, то адреса надо считать иначе.Если указатели бывают null, то будет исключение перед попыткой добавить смещение к nullНе работает !А я то думал здесь помогают !Все то мне нужно было узнать как работать с указателями исползуя данный класс VAMemoryЗачем тогда вообще учить кого то ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 24 апреля, 2015 Поделиться Опубликовано 24 апреля, 2015 В 24.04.2015 в 14:16, Devil9313 сказал: Не работает !А ты к советам прислушался? Поискал причину, почему не работает? С классом разобрался, хотя-бы? В 24.04.2015 в 14:16, Devil9313 сказал: А я то думал здесь помогают !Помогают, но конкретно тебе - ничто не поможет, почему? Потому что ты скачиваешь готовый класс, и не хочешь разобраться, как он работает, и более того - не хочешь использовать поиск по форуму, и ждешь готовый код. В 24.04.2015 в 14:16, Devil9313 сказал: Все то мне нужно было узнать как работать с указателями исползуя данный класс VAMemoryВ чем проблема? Вопрос, как работать с указателями - не один десяток раз поднимался на нашем форуме, всего-то нужно использовать поиск по форуму. В 24.04.2015 в 14:16, Devil9313 сказал: Зачем тогда вообще учить кого то ?А ты хочешь научиться? Что-то не видно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 24 апреля, 2015 Поделиться Опубликовано 24 апреля, 2015 В 24.04.2015 в 14:16, Devil9313 сказал: Все то мне нужно было узнать как работать с указателями исползуя данный класс VAMemoryНе обманывай. Как я вижу, тебе нужен готовый код. И учиться ты ничему не хочешь. Тебе дали вариант. Отталкиваясь от него, модифицируй под свои нужды. А ты даже не трудишься объяснить, что именно у тебя не срабатывает. Ссылка на комментарий Поделиться на другие сайты Поделиться
Devil9313 Опубликовано 24 апреля, 2015 Автор Поделиться Опубликовано 24 апреля, 2015 В 24.04.2015 в 15:23, Xipho сказал: Не обманывай.Это как понимать то ? Короче спасибо за помощь всем пока всем удачного разуплотнения игр [terminus]/* keng: Ненормативная лексика - это плохо и за нее нужно мыть рот с мылом. */[/terminus] Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 24 апреля, 2015 Поделиться Опубликовано 24 апреля, 2015 Товарищ, подожди. Я же тебе ссылку на статью дал. Тебе всего-то ее прочитать, взять из нее готовый метод и вставить в класс, исходник которого ты привел в шапке. Что в этом сложного? Ссылка на комментарий Поделиться на другие сайты Поделиться
Devil9313 Опубликовано 24 апреля, 2015 Автор Поделиться Опубликовано 24 апреля, 2015 (изменено) Здравствуйте keng такой вопрос а в данном классе VAMemory получается нет функции чтения указателей или всё таки есть ? Изменено 24 апреля, 2015 пользователем Devil9313 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 24 апреля, 2015 Поделиться Опубликовано 24 апреля, 2015 (изменено) Так. Давай я скопирую в следующем посте твой класс и будем с ним постепенно разбираться, так как там почти тысяча строк кода. Для начала я приведу в порядок форматирование, потому что в текущем виде читать его невозможно.Исходный код класса:using System;using System.Diagnostics;using System.Runtime.CompilerServices;using System.Runtime.InteropServices;using System.Text;using System.Windows.Forms; public class VAMemory{private IntPtr baseAddress;public static bool debugMode;private Process[] mainProcess;private IntPtr processHandle;private ProcessModule processModule; public VAMemory(){} public VAMemory(string pProcessName){this.processName = pProcessName;} public bool CheckProcess(){if (this.processName != null){this.mainProcess = Process.GetProcessesByName(this.processName);if (this.mainProcess.Length == 0){this.ErrorProcessNotFound(this.processName);return false;}this.processHandle = OpenProcess(0x1f0fff, false, this.mainProcess[0].Id);if (this.processHandle == IntPtr.Zero){this.ErrorProcessNotFound(this.processName);return false;}return true;}MessageBox.Show("Programmer, define process name first!");return false;} [DllImport("kernel32.dll")]private static extern bool CloseHandle(IntPtr hObject);private void ErrorProcessNotFound(string pProcessName){MessageBox.Show(this.processName + " is not running or has not been found. Please check and try again", "Process Not Found", MessageBoxButtons.OK, MessageBoxIcon.Hand);} [DllImport("kernel32.dll")]private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);public bool ReadBoolean(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToBoolean(this.ReadByteArray(pOffset, 1), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadByte" + exception.ToString());}return false;}} public byte ReadByte(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.ReadByteArray(pOffset, 1)[0];}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadByte" + exception.ToString());}return 0;}} public byte[] ReadByteArray(IntPtr pOffset, uint pSize){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{uint num;VirtualProtectEx(this.processHandle, pOffset, (UIntPtr) pSize, 4, out num);byte[] lpBuffer = new byte[pSize];ReadProcessMemory(this.processHandle, pOffset, lpBuffer, pSize, 0);VirtualProtectEx(this.processHandle, pOffset, (UIntPtr) pSize, num, out num);return lpBuffer;}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadByteArray" + exception.ToString());}return new byte[1];}} public char ReadChar(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToChar(this.ReadByteArray(pOffset, 1), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadChar" + exception.ToString());}return ' ';}} public double ReadDouble(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToDouble(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadDouble" + exception.ToString());}return 0.0;}} public float ReadFloat(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToSingle(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadFloat" + exception.ToString());}return 0f;}} public short ReadInt16(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt16(this.ReadByteArray(pOffset, 2), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInt16" + exception.ToString());}return 0;}} public int ReadInt32(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt32(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInt32" + exception.ToString());}return 0;}} public long ReadInt64(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt64(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInt64" + exception.ToString());}return 0L;}} public int ReadInteger(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt32(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInteger" + exception.ToString());}return 0;}} public long ReadLong(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt64(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadLong" + exception.ToString());}return 0L;}} [DllImport("kernel32.dll", SetLastError=true)]private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint dwSize, uint lpNumberOfBytesRead);public short ReadShort(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToInt16(this.ReadByteArray(pOffset, 2), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadInt16" + exception.ToString());}return 0;}} public string ReadStringASCII(IntPtr pOffset, uint pSize){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return Encoding.ASCII.GetString(this.ReadByteArray(pOffset, pSize), 0, (int) pSize);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadStringASCII" + exception.ToString());}return "";}} public string ReadStringUnicode(IntPtr pOffset, uint pSize){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return Encoding.Unicode.GetString(this.ReadByteArray(pOffset, pSize), 0, (int) pSize);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadStringUnicode" + exception.ToString());}return "";}} public ushort ReadUInt16(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt16(this.ReadByteArray(pOffset, 2), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUInt16" + exception.ToString());}return 0;}} public uint ReadUInt32(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt32(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUInt32" + exception.ToString());}return 0;}} public ulong ReadUInt64(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt64(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUInt64" + exception.ToString());}return 0L;}} public uint ReadUInteger(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt32(this.ReadByteArray(pOffset, 4), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUInteger" + exception.ToString());}return 0;}} public long ReadULong(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return (long) BitConverter.ToUInt64(this.ReadByteArray(pOffset, 8), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadULong" + exception.ToString());}return 0L;}} public ushort ReadUShort(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToUInt16(this.ReadByteArray(pOffset, 2), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadUShort" + exception.ToString());}return 0;}} [DllImport("kernel32.dll", SetLastError=true, ExactSpelling=true)]private static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);[DllImport("kernel32.dll")]private static extern bool VirtualProtectEx(IntPtr hProcess, IntPtr lpAddress, UIntPtr dwSize, uint flNewProtect, out uint lpflOldProtect);public bool WriteBoolean(IntPtr pOffset, bool pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteBoolean" + exception.ToString());}return false;}} public bool WriteByte(IntPtr pOffset, byte pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes((short) pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteByte" + exception.ToString());}return false;}} public bool WriteByteArray(IntPtr pOffset, byte[] pBytes){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{uint num;VirtualProtectEx(this.processHandle, pOffset, (UIntPtr) pBytes.Length, 4, out num);bool flag = WriteProcessMemory(this.processHandle, pOffset, pBytes, (uint) pBytes.Length, 0);VirtualProtectEx(this.processHandle, pOffset, (UIntPtr) pBytes.Length, num, out num);return flag;}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteByteArray" + exception.ToString());}return false;}} public bool WriteChar(IntPtr pOffset, char pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteChar" + exception.ToString());}return false;}} public bool WriteDouble(IntPtr pOffset, double pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteDouble" + exception.ToString());}return false;}} public bool WriteFloat(IntPtr pOffset, float pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteFloat" + exception.ToString());}return false;}} public bool WriteInt16(IntPtr pOffset, short pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteInt16" + exception.ToString());}return false;}} public bool WriteInt32(IntPtr pOffset, int pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteInt32" + exception.ToString());}return false;}} public bool WriteInt64(IntPtr pOffset, long pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteInt64" + exception.ToString());}return false;}} public bool WriteInteger(IntPtr pOffset, int pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteInt" + exception.ToString());}return false;}} public bool WriteLong(IntPtr pOffset, long pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteLong" + exception.ToString());}return false;}} [DllImport("kernel32.dll")]private static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, uint lpNumberOfBytesWritten);public bool WriteShort(IntPtr pOffset, short pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteShort" + exception.ToString());}return false;}} public bool WriteStringASCII(IntPtr pOffset, string pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, Encoding.ASCII.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteStringASCII" + exception.ToString());}return false;}} public bool WriteStringUnicode(IntPtr pOffset, string pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, Encoding.Unicode.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteStringUnicode" + exception.ToString());}return false;}} public bool WriteUInt16(IntPtr pOffset, ushort pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteUInt16" + exception.ToString());}return false;}} public bool WriteUInt32(IntPtr pOffset, uint pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteUInt32" + exception.ToString());}return false;}} public bool WriteUInt64(IntPtr pOffset, ulong pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteUInt64" + exception.ToString());}return false;}} public bool WriteUInteger(IntPtr pOffset, uint pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteUInt" + exception.ToString());}return false;}} public bool WriteULong(IntPtr pOffset, ulong pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteULong" + exception.ToString());}return false;}} public bool WriteUShort(IntPtr pOffset, ushort pData){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.WriteByteArray(pOffset, BitConverter.GetBytes(pData));}catch (Exception exception){if (debugMode){Console.WriteLine("Error: WriteShort" + exception.ToString());}return false;}} public long getBaseAddress{get{this.baseAddress = IntPtr.Zero;this.processModule = this.mainProcess[0].MainModule;this.baseAddress = this.processModule.BaseAddress;return (long) this.baseAddress;}} public string processName { get; set; } [Flags]private enum ProcessAccessFlags : uint{All = 0x1f0fff,CreateThread = 2,DupHandle = 0x40,QueryInformation = 0x400,SetInformation = 0x200,Synchronize = 0x100000,Terminate = 1,VMOperation = 8,VMRead = 0x10,VMWrite = 0x20} private enum VirtualMemoryProtection : uint{PAGE_EXECUTE = 0x10,PAGE_EXECUTE_READ = 0x20,PAGE_EXECUTE_READWRITE = 0x40,PAGE_EXECUTE_WRITECOPY = 0x80,PAGE_GUARD = 0x100,PAGE_NOACCESS = 1,PAGE_NOCACHE = 0x200,PAGE_READONLY = 2,PAGE_READWRITE = 4,PAGE_WRITECOPY = 8,PROCESS_ALL_ACCESS = 0x1f0fff}} Показать контент Гм. Интересное дело - форматирование кода совсем никак не работает. Возможно,из-за спойлера. Будем разбирать код по кускам. Начнем с самого верха: Директива using используется для того, чтобы подключить какие-то внешниефункции и классы в твою программу. Это все то неимоверно и жутко необходимоедля корректной работы класса.-------------------------------------------------------------------------------Далее у нас идет определение тела и имени класса:Внутри будут лежать его методы и свойства.-------------------------------------------------------------------------------Ниже идет вот такой код:Это, собственно, свойства, то есть некоторые переменные, к которым можнообращаться.У них есть (слева направо) модификатор доступа, тип и имя. Подробнее промодификаторы доступа можно почитать на MSDN.-------------------------------------------------------------------------------Следующим идет вот такой чудо-кусок:Это - конструктор класса. Он вызывается в первую очередь, когда создаетсяобъект класса.-------------------------------------------------------------------------------А вот это - тоже конструктор, но с аргументом pProcessName. То есть можновызвать этот класс при создании объекта класса, сообщив ему аргумент. Все, чтоон делает - говорит, что переменная класса processName равна аргументу.-------------------------------------------------------------------------------Дальше идет метод, которая возвращает значение типа bool:using System;using System.Diagnostics;using System.Runtime.CompilerServices;using System.Runtime.InteropServices;using System.Text;using System.Windows.Forms;public class VAMemory{}private IntPtr baseAddress;public static bool debugMode;private Process[] mainProcess;private IntPtr processHandle;private ProcessModule processModule;public VAMemory(){}public VAMemory(string pProcessName){this.processName = pProcessName;} Показать контент Что этот метод делает? А вот так вот:0. Проверяем, что у нас есть имя процесса.1. Если есть, то:2. Получаем идентификатор этого процесса.3. Если не получилось, то:4. Говорим, что произошла ошибка и выходим.5. Если получилось, то открываем процесс для чтения\записи.6. Если не открылся, то:7. Выводим сообщение об ошибке и выходим.8. Выходим, возвращая успешный результат выполнения.-------------------------------------------------------------------------------Дальше идет вот это:Это - описание WinAPI-функции для закрытия идентификатора процесса. Закрыватьиспользованные идентификаторы - это круто!-------------------------------------------------------------------------------Теперь вот:Этот метод выводит сообщение о том, что процесс с таким-то именем найден небыл.-------------------------------------------------------------------------------Описание другой WinAPI-функции - на этот раз, для открытия процесса.-------------------------------------------------------------------------------public bool CheckProcess(){if (this.processName != null){this.mainProcess = Process.GetProcessesByName(this.processName);if (this.mainProcess.Length == 0){this.ErrorProcessNotFound(this.processName);return false;}this.processHandle = OpenProcess(0x1f0fff, false, this.mainProcess[0].Id);if (this.processHandle == IntPtr.Zero){this.ErrorProcessNotFound(this.processName);return false;}return true;}MessageBox.Show("Programmer, define process name first!");return false;}[DllImport("kernel32.dll")]private static extern bool CloseHandle(IntPtr hObject);private void ErrorProcessNotFound(string pProcessName){MessageBox.Show(this.processName +" is not running or has not been found. Please check and try again","Process Not Found", MessageBoxButtons.OK, MessageBoxIcon.Hand);}[DllImport("kernel32.dll")]private static extern IntPtr OpenProcess(uint dwDesiredAccess,bool bInheritHandle, int dwProcessId); Показать контент Чудо-метод для чтения значения типа bool, принимающий некий оффсет и boolвозвращающий.0. Если у нас нет идентификатора процесса, то1. Вызываем некий метод CheckProcess, до которого я еще не дочитал.2. Иначе возвращаем bool, который пытаемся сделать из результата работыметода ReadByteArray, которому мы скормили оффсет и единичку.3. Если что-то пошло не так и свойство debugMode установлено в true, товыводим сообщение об ошибке и выходим.-------------------------------------------------------------------------------О, а вот и некий метод ReadByte:public bool ReadBoolean(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return BitConverter.ToBoolean(this.ReadByteArray(pOffset, 1), 0);}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadByte" + exception.ToString());}return false;}} Показать контент Принимает на входе оффсет, возвращает байт. Я начинаю догадываться, что оффсет- это адрес памяти.0. Проверка идентификатора процесса.1. Если все ОК, то возвращаем первый результат работы метода ReadByteArray.Судя из названия, на выходе из него приедет массив байт, а второй его аргумент- это сколько же байт нужно прочитать.2. Если что-то пошло не так, то все очень плохо.-------------------------------------------------------------------------------NullAlex: ровно месяц назад (27 апреля) я просил keng вставить теги спойлера и кода в это сообщение - он так ничего и не сделал. Почему форматирование не работает? Потому, что нужно использовать тег кода.public byte ReadByte(IntPtr pOffset){if (this.processHandle == IntPtr.Zero){this.CheckProcess();}try{return this.ReadByteArray(pOffset, 1)[0];}catch (Exception exception){if (debugMode){Console.WriteLine("Error: ReadByte" + exception.ToString());}return 0;}} Изменено 27 мая, 2015 пользователем NullAlex Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 25 апреля, 2015 Поделиться Опубликовано 25 апреля, 2015 (изменено) В общем чтобы устроить тех, кто желает учиться C# и тех, кто не желает учиться C# я предоставляю на выбор два варианта. Это заглянуть под спойлер или не заглядывать под него до написания своего решения. Показать контент Актаульно для указателя [[[[00645390]+0c]+14]]+18Для приложения Tutorial-i386.exe (Step 8) в папке с Cheat Engine 6.4/* * Created by SharpDevelop. * User: MasterGH * Date: 25.04.2015 */using System;namespace TestReadPointer{ class Program { public static void Main(string[] args) { Console.WriteLine("Hello World!"); // TODO: Implement Functionality Here //[[[[00645390]+0c]+14]]+18 for Cheat Engine 6.4, Tutorial-i386.exe VAMemory VAM = new VAMemory("Tutorial-i386"); IntPtr address = (IntPtr)0x00645390; address = (IntPtr)(VAM.ReadUInteger(address)+0x0c); address = (IntPtr)(VAM.ReadUInteger(address)+0x14); address = (IntPtr)(VAM.ReadUInteger(address)); address = (IntPtr)(VAM.ReadUInteger(address)+0x18); VAM.WriteByteArray(address, new byte[1] { 0xff }); //Console.Write("Press any key to continue . . . "); //Console.ReadKey(true); } }} Показать контент VAMemory VAM = new VAMemory("GAME"); // вместо GAME поставь свое названиеIntPtr address = (IntPtr)0x6D459B;address = (IntPtr)(VAM.ReadUInteger(address)+0xC1);address = (IntPtr)(VAM.ReadUInteger(address)+0x66C);address = (IntPtr)(VAM.ReadUInteger(address)+0x37B);address = (IntPtr)(VAM.ReadUInteger(address)+0x18);VAM.WriteByteArray(address, new byte[1] { 0xff }); Изменено 25 апреля, 2015 пользователем MasterGH Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения