BitFlash777 Опубликовано 19 августа, 2014 Поделиться Опубликовано 19 августа, 2014 все время возвращает 192 почему?вот сам код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 WindowsFormsApplication3{ public partial class Form1 : Form { [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(int dwDesiredAsses, 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, int 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); public int pID; public Form1() { InitializeComponent(); GetProcess("ToyDefense2.wrp"); } 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; var adress = 0x00977A60; var ofsets = new byte[] { 0x34 }; ReadProcess(adress, ofsets); } } } return; } public void WriteByte() { var ammoadress = 0x056D0EF4; byte[] ammobytes = { 0x0F, 0x27 }; var size = 2; var dummy = new UIntPtr(); var handle = OpenProcess(0x001F0FFF, false, pID); WriteProcessMemory(handle, (IntPtr)ammoadress, ammobytes, size, out dummy); CloseHandle(handle); } public void ReadProcess(int baseadress, byte[] offset) { byte[] buffer = new byte[6]; int size = 1; int bytespread; var handle = OpenProcess(0x001F0FFF, false, pID); ReadProcessMemory(handle, (IntPtr)baseadress, buffer, size, out bytespread); for (int i = 0; i < offset.Length; i++ ) { baseadress = BitConverter.ToInt32(buffer, 0); baseadress += offset[i]; ReadProcessMemory(handle, (IntPtr)baseadress, buffer, size, out bytespread); } var result = BitConverter.ToInt32(buffer, 0); CloseHandle(handle); label1.Text = Convert.ToString(result); } private void button1_Click(object sender, EventArgs e) { WriteByte(); } public void label1_Click(object sender, EventArgs e) { } }}using System; Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 19 августа, 2014 Поделиться Опубликовано 19 августа, 2014 /*---------------------------------------------------------------------------*/Привет!Меня смущают size=1 и buffer = new byte[6]. Ты читаешь DWORD - это 4 байта,так что size и buffer должны быть по 4 байта. Второй момент:baseadress = BitConverter.ToInt32(buffer, 0);[/font]baseadress += offset[i];Переменную baseadress ты конвертируешь в Int, а offset - всё ещё массив byte,причём в 16-ричной системе счисления./*---------------------------------------------------------------------------*/ Ссылка на комментарий Поделиться на другие сайты Поделиться
BitFlash777 Опубликовано 19 августа, 2014 Автор Поделиться Опубликовано 19 августа, 2014 /*---------------------------------------------------------------------------*/Привет!Меня смущают size=1 и buffer = new byte[6]. Ты читаешь DWORD - это 4 байта, так что size и buffer должны быть по 4 байта./*---------------------------------------------------------------------------*/Спасибо/*---------------------------------------------------------------------------*/вылетает игра при вызове вот этой функции (public void WriteByte() { var adress = 0x00977A60; var ofsets = new byte[] { 0x34 }; int ammoadress = adress + ofsets[0]; byte[] ammobytes = { 0xB3, 0x15 }; var size = 2; var dummy = new UIntPtr(); var handle = OpenProcess(0x001F0FFF, false, pID); WriteProcessMemory(handle, (IntPtr)ammoadress, ammobytes, size, out dummy); CloseHandle(handle); } Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 19 августа, 2014 Поделиться Опубликовано 19 августа, 2014 1-е) Почему ты адрес приводишь к типу IntPtr, а не UIntPtr?2-е) Зачем ты заводишь переменную size, когда в C# и так можно получить размер массива?3-е) Почему у тебя функция WriteByte не принимает входные параметры, а данные задаются внутри?4-е) Почему функция WriteByte записывает 2 байта? Ссылка на комментарий Поделиться на другие сайты Поделиться
BitFlash777 Опубликовано 19 августа, 2014 Автор Поделиться Опубликовано 19 августа, 2014 Проблему решил спасибо! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения