black56rus Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Здравствуйте!Я хотел обратиться с таким вопросам.Мы через сигнатуру нашли адрес, как теперь прописать своё значения в этот адрес?public int FindSignature() { var moduleName = "NxCharacter.2.8.1.dll"; var startAddress = 0; var sizeToAllocate = 0; var pattern = new int[] {137, 144, -1, -1, -1, -1, 139, 80, 16, 221, 4, 209, 139, 136, -1, -1, -1, -1}; if (pID != 0) { foreach (var p in Process.GetProcesses()) { if (p.Id ==pID) { foreach (ProcessModule m in p.Modules) { if (m.ModuleName == moduleName) { startAddress = (int)m.BaseAddress; sizeToAllocate = m.ModuleMemorySize; break; } } } } var handle = OpenProcess(0x001F0FFF, false, pID); if (handle != IntPtr.Zero) { byte[] buffer = new byte[sizeToAllocate]; int bytesread; ReadProcessMemory(handle, (IntPtr)startAddress, buffer, sizeToAllocate, out bytesread); CloseHandle(handle); var counter = 0; if (pattern.Length <= buffer.Length) { for (var i = 0; i < buffer.Length; i++) { if (buffer[i] == pattern[0] | pattern[0] == -1) { for (var j = 0; j < pattern.Length; j++) { if (buffer[i + j] == pattern[j] | pattern[j] == -1) { counter++; if (counter == pattern.Length) { var result = i + startAddress; return (int)result; } } else { counter = 0; } } } } } } } return -1; }Заранее благодарю за ответ! Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Привет! Примерно так:var myFoundAddress = FindSignature(); //Вызов возвратит тебе или -1 (если не нашёл), или адрес (если нашёл)if(myFoundAddress!=-1) { //Проверяем, что адрес найден var handle = OpenProcess(All, false, pID); //Получаем хендл процесса с правами на запись в память if(handle!=0) { //Проверяем, что хэндл получен WriteProcessMemory(handle, myFoundAddress, myValues, 0); //Пишем CloseHandle(handle); //Закрываем хэндл }}Псевдокод, но должно быть понятно. Для удобства можно чуть видоизменить метод сканирования - добавить в аргументы имя модуля и сигнатуру, типа того:public int FindSignature(string module, int[] signature) Ссылка на комментарий Поделиться на другие сайты Поделиться
black56rus Опубликовано 30 июня, 2012 Автор Поделиться Опубликовано 30 июня, 2012 Привет! Примерно так:var myFoundAddress = FindSignature(); //Вызов возвратит тебе или -1 (если не нашёл), или адрес (если нашёл)if(myFoundAddress!=-1) { //Проверяем, что адрес найден var handle = OpenProcess(All, false, pID); //Получаем хендл процесса с правами на запись в память if(handle!=0) { //Проверяем, что хэндл получен WriteProcessMemory(handle, myFoundAddress, myValues, 0); //Пишем CloseHandle(handle); //Закрываем хэндл }}Псевдокод, но должно быть понятно. Для удобства можно чуть видоизменить метод сканирования - добавить в аргументы имя модуля и сигнатуру, типа того:public int FindSignature(string module, int[] signature)Keng как байты вставить ?{ 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };WriteProcessMemory(handle, myFoundAddress, myValues, 0); //Пишем Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 У меня ведь в том же (или предыдущем) уроке это было описано. Объявляешь переменную-массив байт:var lalala = new byte[] { 0xC, 0x14, 0x0, 0x18 };И всё. Её и используешь.Вот, для полной ясности: Ссылка на комментарий Поделиться на другие сайты Поделиться
black56rus Опубликовано 30 июня, 2012 Автор Поделиться Опубликовано 30 июня, 2012 Keng Спасибо за ответ сейчас буду разбераться!P.S. Когда спасибку могу ставить?Keng Взгляни ! Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Я три лупы разбил, пока скриншот разглядывал, но:1. В строчке if(handle != 0) переменная handle имеет тип IntPtr, который нельзя сравнивать с типом int, так что поменяй на handle != IntPtr.Zero. Как я уже предупреждал выше, я писал псевдокод, так что компилятор вообще не в курсе, что ты имеешь ввиду под словом "All" в вызове OpenProcess. Согласно [документации], первым её аргументом является тип прав, которые хочется получить. Те, что мы хотим получить - это PROCESS_ALL_ACCESS, которые в 16-ричной системе счисления записываются как 0x1F0FFF. Вот и получается:var handle = OpenProcess(0x1F0FFF, false, pID);Где pID - идентификатор процесса игры, который ты находишь ранее. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
black56rus Опубликовано 30 июня, 2012 Автор Поделиться Опубликовано 30 июня, 2012 Скампилилось нармально но по значению не чего не меняет.Хочу проверить Ставлю брейкпоинт он его не видет просто запускаеться форма.public Asm1() { InitializeComponent(); GetProcess("pointblank.exe"); //525927 //var address = 0x006903B0; //var offsets = new byte[] { 0xC, 0x14, 0x0, 0x18 }; //ReadBytes(address, offsets); FindSignature(); }# region Импорт))[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("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); [DllImportAttribute("user32.dll")] public static extern bool ReleaseCapture(); [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 IntPtr VirtualAlloc(IntPtr lpAddress, UIntPtr dwSize, AllocationType flAllocationType, MemoryProtection flProtect); [DllImport("kernel32.dll", SetLastError = true)] static extern bool VirtualFree(IntPtr lpAddress, UIntPtr dwSize, uint dwFreeType); [Flags()] public enum AllocationType : uint { COMMIT = 0x1000, RESERVE = 0x2000, RESET = 0x80000, LARGE_PAGES = 0x20000000, PHYSICAL = 0x400000, TOP_DOWN = 0x100000, WRITE_WATCH = 0x200000 } [Flags()] public enum MemoryProtection : uint { EXECUTE = 0x10, EXECUTE_READ = 0x20, EXECUTE_READWRITE = 0x40, EXECUTE_WRITECOPY = 0x80, NOACCESS = 0x01, READONLY = 0x02, READWRITE = 0x04, WRITECOPY = 0x08, GUARD_Modifierflag = 0x100, NOCACHE_Modifierflag = 0x200, WRITECOMBINE_Modifierflag = 0x400 } [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr CreateToolhelp32Snapshot(SnapshotFlags dwFlags, uint th32ProcessID); [Flags] public enum SnapshotFlags : uint { HeapList = 0x00000001, Process = 0x00000002, Thread = 0x00000004, Module = 0x00000008, Module32 = 0x00000010, All = (HeapList | Process | Thread | Module), Inherit = 0x80000000, NoHeaps = 0x40000000 } //[DllImport("kernel32.dll")] //static extern bool Module32First(IntPtr hSnapshot, ref MODULEENTRY32 lpme);#endregion 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("Process found!"); return; } } } return; } public void WriteBytes(int address, byte[] bytes) { var dummy = new UIntPtr(); if (pID != 0) { var handle = OpenProcess(0x001F0FFF, false, pID); WriteProcessMemory(handle, (IntPtr)address, bytes, (uint)bytes.Length, out dummy); CloseHandle(handle); } } public int FindSignature() { var moduleName = "NxCharacter.2.8.1.dll"; var startAddress = 0; var sizeToAllocate = 0; var pattern = new int[] {137, 144, -1, -1, -1, -1, 139, 80, 16, 221, 4, 209, 139, 136, -1, -1, -1, -1}; if (pID != 0) { foreach (var p in Process.GetProcesses()) { if (p.Id ==pID) { foreach (ProcessModule m in p.Modules) { if (m.ModuleName == moduleName) { startAddress = (int)m.BaseAddress; sizeToAllocate = m.ModuleMemorySize; break; } } } } var handle = OpenProcess(0x001F0FFF, false, pID); if (handle != IntPtr.Zero) { byte[] buffer = new byte[sizeToAllocate]; int bytesread; ReadProcessMemory(handle, (IntPtr)startAddress, buffer, sizeToAllocate, out bytesread); CloseHandle(handle); var counter = 0; if (pattern.Length <= buffer.Length) { for (var i = 0; i < buffer.Length; i++) { if (buffer[i] == pattern[0] | pattern[0] == -1) { for (var j = 0; j < pattern.Length; j++) { if (buffer[i + j] == pattern[j] | pattern[j] == -1) { counter++; if (counter == pattern.Length) { var result = i + startAddress; return (int)result; } } else { counter = 0; } } } } } } } return -1; } private void button1_Click(object sender, EventArgs e) { var myFoundAddress = FindSignature(); //Вызов возвратит тебе или -1 (если не нашёл), или адрес (если нашёл) if(myFoundAddress!=-1)//Проверяем, что адрес найден { //var handle = OpenProcess(All, false, pID);//Получаем хендл процесса с правами на запись в память //if(handle!=0)//Проверяем, что хэндл получен byte[] myValues = new byte[] { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }; var size = 6; var dummy = new UIntPtr(); var handle = OpenProcess(0x1F0FFF, false, pID); WriteProcessMemory(handle, (IntPtr)myFoundAddress, myValues, (uint)size, out dummy);//Пишем 0) CloseHandle(handle); //Закрываем хэндл } } Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В конструкторе формы:public Asm1() { InitializeComponent(); GetProcess("pointblank.exe"); //525927 //var address = 0x006903B0; //var offsets = new byte[] { 0xC, 0x14, 0x0, 0x18 }; //ReadBytes(address, offsets); FindSignature(); }У тебя вызывается GetProcess(), а затем - FindSignature(). По идее, достаточно вызывать GetProcess(), т.к. весь остальной функционал у тебя повешан в обработчик нажатия на кнопку:private void button1_Click(object sender, EventArgs e)Вот в его начало и ставь брейкпоинт, а затем на кнопку нажимай. Ссылка на комментарий Поделиться на другие сайты Поделиться
black56rus Опубликовано 30 июня, 2012 Автор Поделиться Опубликовано 30 июня, 2012 Вроде всё верно ?myFoundAddress = -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Значит - сигнатуру проверяй, в ней чаще всего ошибки. Ссылка на комментарий Поделиться на другие сайты Поделиться
black56rus Опубликовано 30 июня, 2012 Автор Поделиться Опубликовано 30 июня, 2012 pID = process.Id;pID = 0Не пойму процесс 7564 перечесляет но получаеться не находит. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Попробуй ".exe" из имени процесса убрать. Ссылка на комментарий Поделиться на другие сайты Поделиться
black56rus Опубликовано 30 июня, 2012 Автор Поделиться Опубликовано 30 июня, 2012 exe. в имени процесса нет !Имя pointblank.exe.exeМожет наоборот паставить? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Я про GetProcess("pointblank.exe"); - поменяй на GetProcess("pointblank");. Заодно поставь брейкпоинт на начало метода GetProcess и нажимая F10 пробегись по нему - выяснишь, какое там на самом деле .ProcessName - с ним и надо будет сравнивать. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
black56rus Опубликовано 30 июня, 2012 Автор Поделиться Опубликовано 30 июня, 2012 Полное имя процесса pointblank.exe.exe на конце два exeВидит его как PointBlank.exe С П А С И Б О !!!!!!!!Всё получилось !Keng как поднимать репу?Хочу тебе поднять.Keng ещё вопрос если можно.Как мне прописать нахождения сегнатуры для второй функции? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Как мне прописать нахождения сегнатуры для второй функции?Всему есть предел. Прописать нахождения сигнатуры для второй функции можно по аналогии с первой. Это элементарно.ЗЫ. keng'у выдана медаль за активность и безграничное терпение (я бы уже давно не утерпел от таких элементарных вопросов). Ссылка на комментарий Поделиться на другие сайты Поделиться
black56rus Опубликовано 30 июня, 2012 Автор Поделиться Опубликовано 30 июня, 2012 Всему есть предел. Прописать нахождения сигнатуры для второй функции можно по аналогии с первой. Это элементарно.Тоесть поиск первой положить под кнопку 1 ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Если у тебя обе опции (читы) будут активироваться одной кнопкой - тогда да. Если же нет - тогда прописывать в обработчик другой кнопки. Неужели логики не хватает, чтобы до подобной элементарщины додуматься? Ссылка на комментарий Поделиться на другие сайты Поделиться
black56rus Опубликовано 30 июня, 2012 Автор Поделиться Опубликовано 30 июня, 2012 Всё спасибо ! Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 16 сентября, 2012 Поделиться Опубликовано 16 сентября, 2012 а что нужно использовать для прочтения значения адреса и перезапись в него.. я просто хочу сделать потипу цикла вызываю таймер и в нём выполняется код который с интервалом 1 мс перезаписывает одно и тоже значение...но это я умею только юзаю библиотеку Vamemory...и к сожелению там адрес должен быть , но с указателем не получается работать.... Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Merano Опубликовано 16 сентября, 2012 Поделиться Опубликовано 16 сентября, 2012 HPB, ReadProcessMemory() - читаемWriteProcessMemory() - записываем Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения