Synapsehome Опубликовано 29 июня, 2011 Поделиться Опубликовано 29 июня, 2011 Одну тему я вроде создавал, но черт с ней. Побаловался, намулевал простенький трейнер для (спасибо MasterGH, что разрулил мои проблемы с чекбоксами) HL2:Хотя после обновы перестали работать беск хп Я хочу перенести его хотя бы в VS, не всё же время на CE сидеть, нужно что-то менять. Туторы, которые я нашел, мне малость неонятны - например, автор находит адрес с хп, пишет программку за полминуты, и вставляет туда этот адрес (DMA! ), и, мол, готово. Адрес изменится после перезапуска в любом случае. Так вот, это на первое. На второе - пончик у меня адрес с освещением (все вокруг подсвечивается равномерно, т.е. нет теней и пр. темных и страшных закоулков) статичен и имеет вид типа materialsystem.dll+ED5A8Как правильно сделать инжектор к нему? Лучше, если на C++ CLI, неуправлялку я знаю, но использовать не хочу, т.к. люблю повозиться с интерфесом Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 29 июня, 2011 Поделиться Опубликовано 29 июня, 2011 Тебе нужно знать программирование под Windows. Нужно знать как работать с WinApi функиями чтения, записи в память. Через чтение можно осуществлять чтение цепочек указателей. Нужно знать как изменить блок защиты памяти с защиты чтения на защиту записи, чтобы писать в него без исключений...Нужно знать работу с поиском dll-ок и принадлежности их к процессам. Нужно знать как сделать поиск процесса по названию его окна или по имени процесса, подключение к процессу. Нужно знать где закрывать дескрипторы. Нужно знать работу с обработкой сообщений чек боксов. Если будешь писать на C++, то нужно знать как создавать окно и привязывать функцию к этому окну.Тебе оно надо? Это ещё не все. Тебе надо будет самостоятельно искать примеры или самому написать "правильный инжект в выделенную память". Ссылка на комментарий Поделиться на другие сайты Поделиться
Synapsehome Опубликовано 14 июля, 2011 Автор Поделиться Опубликовано 14 июля, 2011 В 29.06.2011 в 11:28, MasterGH сказал: Тебе оно надо? Да, все что написано выше я знаю Как я понял, нужно найти адрес DLL и к нему прибавить оффсет - правильно? Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 14 июля, 2011 Поделиться Опубликовано 14 июля, 2011 Если ты это знаешь, тогда странно что ты не уверен в своих предположениях. Проверь их и ты узнаешь ответ по результату. Я твоей конечной цели не знаю и не вижу кода, и не могу сказать правильно или нет. Ссылка на комментарий Поделиться на другие сайты Поделиться
Synapsehome Опубликовано 14 июля, 2011 Автор Поделиться Опубликовано 14 июля, 2011 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 недопустимо. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 14 июля, 2011 Поделиться Опубликовано 14 июля, 2011 Цитата 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) Ссылка на комментарий Поделиться на другие сайты Поделиться
Synapsehome Опубликовано 14 июля, 2011 Автор Поделиться Опубликовано 14 июля, 2011 Опять ругается на IntPtr:PS. Прикрутил проект сверху. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 14 июля, 2011 Поделиться Опубликовано 14 июля, 2011 Я перепутал с другим языком и забыл параметр 16.Попробуй так.WriteProcessMemory(HL2WriteProcess.Handle, Convert.ToUInt32(AddressWith0X.Text, 16) as IntPtr, pBytes, pBytes.Length, 0) Ссылка на комментарий Поделиться на другие сайты Поделиться
Synapsehome Опубликовано 14 июля, 2011 Автор Поделиться Опубликовано 14 июля, 2011 Нет, теперь ругается на все:Тот адрес (AddressWith0X) уже имеет вид 0xXXXXXXX, может я не понял, ты хотел из 10-ного в 16-ный конвертировать? Или нет... я запутался. У кого стоит HL2, попробуйте сделать - для активации в найденный адрес AddressWith0X записать 1, для деактивации 0. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 14 июля, 2011 Поделиться Опубликовано 14 июля, 2011 (изменено) Из текстового 16-ричного формата я перевожу.А там уже возможна ещё другая ошибка, нужно объявить переменную возвращающую значение:Dim lpNumberOfBytesWrittenWriteProcessMemory(HL2WriteProcess.Handle, Convert.ToUInt32(AddressWith0X.Text, 16) as IntPtr, pBytes, pBytes.Length, lpNumberOfBytesWritten)На скрине ошибка по поводу pBytes. Я плохо знаю VB у меня он не установлен. Разберись почему pBytes вызывает ошибку. Поищи примеры... Я VB не использую и могу много чего насоветовать и это может быть неправильно. Изменено 14 июля, 2011 пользователем MasterGH Ссылка на комментарий Поделиться на другие сайты Поделиться
Synapsehome Опубликовано 15 июля, 2011 Автор Поделиться Опубликовано 15 июля, 2011 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 Все работает. Сейчас выложу полный сурс 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)Всё! Разобрался! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения