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

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

Здравствуйте, пишу некий 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.

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

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

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

И у меня все заработало. :-D

Начал разбираться, почему программа не может получить handle процесса игры space rangers и пришел в одному выводу.

Процесс защищен и в CE открывается только с запуском след. lua скрипта.


dbk_initialize()
dbk_useKernelmodeOpenProcess()
autoAssemble(string.format([[
NtOpenProcess:
jmp %x
]],dbk_NtOpenProcess),true)

Вопрос стоит в следующем, как параметра из данного скрипта реализовать на c#, чтобы он смог читать handle процесса?

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

Процесс защищен и в CE открывается только с запуском след. lua скрипта.

Вопрос стоит в следующем, как параметра из данного скрипта реализовать на c#, чтобы он смог читать handle процесса?

От имени администратора не помогает?

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

Запускал от имени администратора и Visual studio'13 и саму игру.

Попытался добавить переменную для getlasterror:

Выдает: Ошибка 1008 - Попытка ссылки на несуществующий токен.

В чем проблема и чем она вызвана?

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

Спасибо, права получил, 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)

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

Адрес и поинтеры значения опыта:


address = 0x00800150;
offsets = new byte[] { 0x38, 0x4, 0x0, 0x3a4};

Выдает ошибку на массиве byte: 0x3a4

byte принимаяет от 0 до 255 (десятичный) или 0 до FF (Hex)

а массив смещение хранит лучше в Int.

к примеру


address = 0x00800150;
int[] offsets = new int[] { 0x38, 0x4, 0x0, 0x3a4};

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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

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

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