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

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

Одну тему я вроде создавал, но черт с ней. Побаловался, намулевал простенький трейнер для (спасибо MasterGH, что разрулил мои проблемы с чекбоксами) HL2:

060c6e03e00ebd71183d13c71c7b9811.jpeg

Хотя после обновы перестали работать беск хп :angry: Я хочу перенести его хотя бы в VS, не всё же время на CE сидеть, нужно что-то менять. Туторы, которые я нашел, мне малость неонятны - например, автор находит адрес с хп, пишет программку за полминуты, и вставляет туда этот адрес (DMA! :ninja: ), и, мол, готово. Адрес изменится после перезапуска в любом случае. Так вот, это на первое. На второе - пончик у меня адрес с освещением (все вокруг подсвечивается равномерно, т.е. нет теней и пр. темных и страшных закоулков) статичен и имеет вид типа

 materialsystem.dll+ED5A8

Как правильно сделать инжектор к нему? Лучше, если на C++ CLI, неуправлялку я знаю, но использовать не хочу, т.к. люблю повозиться с интерфесом :grin:

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

Тебе нужно знать программирование под Windows.

Нужно знать как работать с WinApi функиями чтения, записи в память. Через чтение можно осуществлять чтение цепочек указателей.

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

Нужно знать работу с поиском dll-ок и принадлежности их к процессам.

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

Если будешь писать на C++, то нужно знать как создавать окно и привязывать функцию к этому окну.

Тебе оно надо? :) Это ещё не все. Тебе надо будет самостоятельно искать примеры или самому написать "правильный инжект в выделенную память".

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

  • 2 недели спустя...

Если ты это знаешь, тогда странно что ты не уверен в своих предположениях. Проверь их и ты узнаешь ответ по результату. Я твоей конечной цели не знаю и не вижу кода, и не могу сказать правильно или нет.

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

MasterGH, собаку съел пытаясь использовать CreateToolhelp32Snapshot, но потом нашел более лучшее решение.

Вот на VB:

Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Object, ByVal lpBuffer As Object, ByVal nSize As Long, ByVal lpNumberOfBytesWritten As Long) As Long
Public Shared Function WriteProcessMemory(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal lpBuffer As Byte(), ByVal nSize As UIntPtr, ByRef lpNumberOfBytesWritten As IntPtr) As Boolean
End Function

Код на нажатие кнопки:

Dim HL2WriteProcess As Process = Process.GetProcessesByName("hl2")(0)
Dim ValueToWrite As Integer = 1
Dim pBytes As Byte() = BitConverter.GetBytes(ValueToWrite)
WriteProcessMemory(HL2WriteProcess.Handle, AddressWith0X.Text, pBytes, pBytes.Length, 0)

При записи выдаёт ошибку - Приведение строки 0x01B0250 к типу Long недопустимо. <_<

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

VAM.WriteByte((IntPtr)BaseAddress.text, byte.Parse(NewValue.Text.ToString())):

Нельзя "(IntPtr)" приводить к объекту класса "String".

Так должно быть правильно, если имеем дело с 32-разрядной адресацией:

VAM.WriteByte((IntPtr)(Convert.ToUInt32(BaseAddress.text)), byte.Parse(NewValue.Text.ToString()));

Для кода ниже для AddressWith0X.Text аналогично:

WriteProcessMemory(HL2WriteProcess.Handle, AddressWith0X.Text, pBytes, pBytes.Length, 0)

WriteProcessMemory(HL2WriteProcess.Handle, (IntPtr)(Convert.ToUInt32(AddressWith0X.Text)), pBytes, pBytes.Length, 0)

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

Нет, теперь ругается на все:

769908fb12f7400160c4c8ce9be41dcd.jpeg

Тот адрес (AddressWith0X) уже имеет вид 0xXXXXXXX, может я не понял, ты хотел из 10-ного в 16-ный конвертировать? Или нет... я запутался. У кого стоит HL2, попробуйте сделать - для активации в найденный адрес AddressWith0X записать 1, для деактивации 0. O-=

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

Из текстового 16-ричного формата я перевожу.

А там уже возможна ещё другая ошибка, нужно объявить переменную возвращающую значение:


Dim lpNumberOfBytesWritten
WriteProcessMemory(HL2WriteProcess.Handle, Convert.ToUInt32(AddressWith0X.Text, 16) as IntPtr, pBytes, pBytes.Length, lpNumberOfBytesWritten)

На скрине ошибка по поводу pBytes. Я плохо знаю VB у меня он не установлен. Разберись почему pBytes вызывает ошибку. Поищи примеры... Я VB не использую и могу много чего насоветовать и это может быть неправильно.

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

MasterGH, разобрался:

 Const PAGE_READWRITE = &H4&
Const PROCESS_ALL_ACCESS = &H1F0FFF
Private Declare Function GetWindowThreadProcessId Lib "User32" (ByVal hwnd As Integer, ByRef lpdwProcessId As Integer) As Integer
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer
Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal Classname As String, ByVal WindowName As String) As Integer
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
Private Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
Private Declare Function VirtualProtectEx Lib "kernel32" (ByVal hProcess As Integer, ByRef lpAddress As Object, ByVal dwSize As Integer, ByVal flNewProtect As Integer, ByRef lpflOldProtect As Integer) As Integer
Dim Address(0 To 1) As Integer
Dim vBuffer(0 To 1) As Long
Dim convert(0 To 1) As Integer
Dim byte_array0 As Byte() = Nothing

Все работает. Сейчас выложу полный сурс :rolleyes:

UPD Вот, качайте, смотрите, код можно ужать раз в 10, но этим займусь на досуге. Халва пиратка, так что работать у вас вряд-ли будет, но за пример сгодится/

НО - осталась малюсенька проблемка с записью float.

Если объявить массив:

Dim sBuffer(0 To 1) As Double 

И записать 0,03 - ничего не записывается:

Dim myProcesses As Process() = Process.GetProcessesByName("hl2")
Dim processHandle As IntPtr = OpenProcess(PROCESS_ALL_ACCESS, 0, myProcesses(0).Id)
Address(0) = Address
byte_array0 = BitConverter.GetBytes(vBuffer(0))
convert(0) = BitConverter.ToInt32(byte_array0, 0)
vBuffer(0) = "0,03"
VirtualProtectEx(processHandle, Address(0), 4, PAGE_READWRITE, 0)
WriteProcessMemory(processHandle, Address(0), vBuffer(0), 4, 0)

Всё! Разобрался!

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

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

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

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