Trial4eg Опубликовано 22 апреля, 2014 Поделиться Опубликовано 22 апреля, 2014 Здравствуйте, пишу некий control centre для игры: Space Ranger HD.Имеется много разработок по оформлению и функциям но я намертво повис на проблеме с hundle процесса.Вот код программы на c# с простым подключением к процессу:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Diagnostics;using System.Runtime.InteropServices;namespace SpaceRangers_ControlCenter{ public partial class Form1 : Form { [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr hObject); [DllImport("kernel32.dll", SetLastError = true)] static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten); [DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead); [DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out, MarshalAs(UnmanagedType.AsAny)] object lpBuffer, int dwSize, out int lpNumberOfBytesRead); [DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int dwSize, out int lpNumberOfBytesRead); public int pID; public Form1() { InitializeComponent(); } public void GetProcess(string name) { var pList = Process.GetProcesses(); if (pList.Count() != 0) { foreach(var process in pList) { if (process.ProcessName == name) { pID = process.Id; MessageBox.Show("Game found!"); button1.Text = name+" found"; return; } } } return; } public int ReadBytes(int baseAddress, byte[] offsets) { if (pID != 0 && baseAddress !=0 && offsets.Length !=0) { byte[] buffer = new byte[4]; int bytesread; var handle = OpenProcess(0x001F0FFF, false, pID); if (handle != IntPtr.Zero) { ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, 4, out bytesread); for (var i = 0; i < offsets.Length; i++) { baseAddress = BitConverter.ToInt32(buffer, 0); baseAddress += offsets[i]; ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, 4, out bytesread); } var result = BitConverter.ToInt32(buffer, 0); CloseHandle(handle); return BitConverter.ToInt32(buffer, 0); } } return 0; } private void button1_Click(object sender, EventArgs e) { GetProcess("Rangers"); var address = 0x0040114C; var offsets = new byte[] {0x38,0x4,0x0,0xf0}; ReadBytes(address, offsets); } }}Проблема в том, что не принимается значение hundle.Может я в чем то ошибся при написание, прошу взглянуть свежим умом на данный код. Ссылка на комментарий Поделиться на другие сайты Поделиться
Trial4eg Опубликовано 23 апреля, 2014 Автор Поделиться Опубликовано 23 апреля, 2014 По размыслив я решил испытать данный код с туториалом из CE.И у меня все заработало. Начал разбираться, почему программа не может получить handle процесса игры space rangers и пришел в одному выводу. Процесс защищен и в CE открывается только с запуском след. lua скрипта.dbk_initialize()dbk_useKernelmodeOpenProcess()autoAssemble(string.format([[NtOpenProcess:jmp %x]],dbk_NtOpenProcess),true)Вопрос стоит в следующем, как параметра из данного скрипта реализовать на c#, чтобы он смог читать handle процесса? Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 24 апреля, 2014 Поделиться Опубликовано 24 апреля, 2014 Процесс защищен и в CE открывается только с запуском след. lua скрипта.Вопрос стоит в следующем, как параметра из данного скрипта реализовать на c#, чтобы он смог читать handle процесса?От имени администратора не помогает? Ссылка на комментарий Поделиться на другие сайты Поделиться
Trial4eg Опубликовано 24 апреля, 2014 Автор Поделиться Опубликовано 24 апреля, 2014 Запускал от имени администратора и Visual studio'13 и саму игру.Попытался добавить переменную для getlasterror:Выдает: Ошибка 1008 - Попытка ссылки на несуществующий токен. В чем проблема и чем она вызвана? Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 25 апреля, 2014 Поделиться Опубликовано 25 апреля, 2014 Получение любых привилегий для процесса на C# может это поможет. И соответственно от имени админа Ссылка на комментарий Поделиться на другие сайты Поделиться
Trial4eg Опубликовано 28 апреля, 2014 Автор Поделиться Опубликовано 28 апреля, 2014 (изменено) Спасибо, права получил, handle процесса получил.Начал разбираться с чтением адресов с указателями.Столкнулся со следующей проблемой:К примеру:Адрес денег и его поинтерыvar address = 0x00800150;var offsets = new byte[] { 0x38, 0x4, 0x0, 0xf0 };С этим проблем нету.Адрес и поинтеры значения опыта:address = 0x00800150;offsets = new byte[] { 0x38, 0x4, 0x0, 0x3a4};Выдает ошибку на массиве byte: 0x3a4Какие параметры указать, чтобы можно было читать и редактировать значения опыта?PS Трейнер пишу по видео уроку, и реализацию чтения делаю через: public int ReadBytes(int baseAddress, byte[] offsets) Изменено 28 апреля, 2014 пользователем Trial4eg Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 28 апреля, 2014 Поделиться Опубликовано 28 апреля, 2014 Адрес и поинтеры значения опыта:address = 0x00800150;offsets = new byte[] { 0x38, 0x4, 0x0, 0x3a4};Выдает ошибку на массиве byte: 0x3a4byte принимаяет от 0 до 255 (десятичный) или 0 до FF (Hex)а массив смещение хранит лучше в Int.к примеруaddress = 0x00800150;int[] offsets = new int[] { 0x38, 0x4, 0x0, 0x3a4}; Ссылка на комментарий Поделиться на другие сайты Поделиться
Trial4eg Опубликовано 28 апреля, 2014 Автор Поделиться Опубликовано 28 апреля, 2014 Спасибо, вопрос решен. Тему можно закрывать Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения