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

Trial4eg

Стажёры
  • Постов

    11
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Trial4eg

  1. Laziz

    Спасибо, большая часть интерфейса на трейнере настроил и работает.

    Возник вопрос по поводу метода чтения значений:


    public int ReadBytes(int baseAddress, int[] offsets, int size)
    {
    if (pID != 0 && baseAddress !=0 && offsets.Length !=0)
    {
    byte[] buffer = new byte[4];
    int bytesread;
    IntPtr handle;
    handle = OpenProcess(0x001F0FFF, false, pID);
    //int error = Marshal.GetLastWin32Error();
    if (handle != IntPtr.Zero)
    {
    ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, size, out bytesread);
    for (var i = 0; i < offsets.Length; i++)
    {
    baseAddress = BitConverter.ToInt32(buffer, 0);
    baseAddress += offsets[i];
    ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, size, out bytesread);
    }
    result = BitConverter.ToInt32(buffer, 0);
    CloseHandle(handle);
    return BitConverter.ToInt32(buffer, 0);
    }
    }
    return 0;
    }

    Как я понял, значения size отвечает за тип значения который мы читаем.


    //exp - 4 byte
    address = 0x00800150;
    offsets = new int[] { 0x38, 0x4, 0x0, 0x3a4 };
    size = 4;
    ReadBytes(address, offsets, size);
    exp.Text = Convert.ToString(result);

    //race - 1 byte
    address = 0x00800150;
    offsets = new int[] { 0x38, 0x4, 0x0, 0x11 };
    size = 1;
    ReadBytes(address, offsets, size);

    exp - читает правильно

    race - выдает отрицательные значения, Как исправить?

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

    Имеется (пример):


    Textbox.text="50000"; //значение денег который я получил из игры

    //Я хочу ввести свое значение, допустим 250000

    Textbox.text="250000"; //ввели значение через форму

    Как теперь это значение перевести в hex и записать в массив byte[], для последующей записи в память через WriteProcessMemory?

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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