CybioZ Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 Здравствуйте , я сделал сканер сигнатур по видео все разобрал, но вот у меня не находит адрес.Сигнатура верна, проверял ее много раз через CE.//NullAlex: аппрувнул тему, и заключил код в спойлер, т.к. код слишком большой.using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Diagnostics;using System.Runtime.InteropServices;namespace Trainerheroes{ class Hack { //ReadProcessMemory [DllImport("kernel32.dll", SetLastError = true)] static extern bool ReadProcessMemory( IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead ); //OpenProcess // Flag = All = 0x001F0FFF [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); // CloseHandle [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr hObject); [StructLayout(LayoutKind.Sequential)] public struct MEMORY_BASIC_INFORMATION { public IntPtr BaseAddress; public IntPtr AllocationBase; public uint AllocationProtect; public IntPtr RegionSize; public uint State; public uint Protect; public uint Type; } // VirtualQueryEx [DllImport("kernel32.dll")] static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength); //WriteProcessMemory [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 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, uint nSize, UIntPtr lpNumberOfBytesWritten); private int GetProcessID() { foreach (Process proc in Process.GetProcessesByName("Heroes3")) return proc.Id; return -1; } public void WriteBytes() { var handle = OpenProcess(0x001F0FFF, false, GetProcessID()); byte[] buffer = { 0xE0, 0x2E }; // значение на которое заменяю var dummy =new UIntPtr(); var address = FindSignature(); // вот тут адрес и не находит Console.WriteLine(address); if (address != -1) WriteProcessMemory(handle, (IntPtr)address, buffer, (uint)buffer.Length, out dummy); Console.WriteLine("Чит Активирован!"); CloseHandle(handle); Console.ReadKey(); } private int FindSignature() { int[] signature = { 224, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, 108, 97, 121, 101, 114, -1, 114, -1, -1, -1 }; long MaxAddress = 0x100000; long address = 0; MEMORY_BASIC_INFORMATION m; var handle = OpenProcess(0x001F0FFF, false, GetProcessID()); m.BaseAddress = IntPtr.Zero; m.RegionSize = IntPtr.Zero; byte[] buffer; while(address<=MaxAddress) { VirtualQueryEx(System.Diagnostics.Process.GetCurrentProcess().Handle, (IntPtr)address, out m, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION))); buffer = new byte[(uint)m.RegionSize]; int dummy = 0; ReadProcessMemory(handle, m.BaseAddress,buffer,(int)m.RegionSize,out dummy); if(address == (long)m.BaseAddress + (long)m.RegionSize) break; int count = 0; address = (long)m.BaseAddress+(long)m.RegionSize; if (buffer.Length > signature.Length) { for ( int i =0 ; i<buffer.Length;i++) { if ( buffer[i]==signature[0]) { for(int b = 0; b < signature.Length; b++) { if (buffer[i + b]==signature[b] || signature[b]==-1) { count++; if (count == signature.Length) { CloseHandle(handle); return i + (int)m.BaseAddress; } } else { count = 0; Console.WriteLine("err"); } } } } } } CloseHandle(handle); return -1; } }} Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 Всё просто.У тебя в функции FindSignature выполняется VirtualQueryEx к твоему процессу если что:VirtualQueryEx(System.Diagnostics.Process.GetCurrentProcess().Handle,А здесь должен быть процесс Heroes 3. Вот и думай теперь, почему у тебя не получается.И во первых, FindSignature должен возвращать не int, так как адреса у нас хранятся в виде unsigned int - uint.Во вторых FindSignature по логике твоего кода - первым параметром должен получать хэндл на открытый процесс Heroes 3 и вторым параметром сигнатуру.uint FindSignature(HANDLE hProcess, byte[] signature)....P.S. Тебе нет нужды постоянно открывать и закрывать хэндл на процесс игры, один раз открывай - пользуйся им и закрывай (когда он не нужен). Ссылка на комментарий Поделиться на другие сайты Поделиться
CybioZ Опубликовано 8 января, 2015 Автор Поделиться Опубликовано 8 января, 2015 Всё просто.У тебя в функции FindSignature выполняется VirtualQueryEx к твоему процессу если что:VirtualQueryEx(System.Diagnostics.Process.GetCurrentProcess().Handle,А здесь должен быть процесс Heroes 3. Вот и думай теперь, почему у тебя не получается.И во первых, FindSignature должен возвращать не int, так как адреса у нас хранятся в виде unsigned int - uint.Во вторых FindSignature по логике твоего кода - первым параметром должен получать хэндл на открытый процесс Heroes 3 и вторым параметром сигнатуру.uint FindSignature(HANDLE hProcess, byte[] signature)....P.S. Тебе нет нужды постоянно открывать и закрывать хэндл на процесс игры, один раз открывай - пользуйся им и закрывай (когда он не нужен).Спасибо , попробую разобраться. Т.е я искал сигнатуру в своем процессе ?Оо Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 Спасибо , попробую разобраться. Т.е я искал сигнатуру в своем процессе ?ОоИменно Ссылка на комментарий Поделиться на другие сайты Поделиться
CybioZ Опубликовано 8 января, 2015 Автор Поделиться Опубликовано 8 января, 2015 (изменено) Именнотеперь другая ошибка...http://prntscr.com/5pv790 Изменено 8 января, 2015 пользователем CybioZ Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 Чуть ниже в окне IDE будет написано в чем проблема. Ссылка на комментарий Поделиться на другие сайты Поделиться
CybioZ Опубликовано 8 января, 2015 Автор Поделиться Опубликовано 8 января, 2015 (изменено) не находит адрес :/ просто -1 возвращает, не понимаю что делать.http://prntscr.com/5pvjvx Изменено 8 января, 2015 пользователем CybioZ Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 У тебя в CE сигнатуре нигде нет 0xFF (-1), а у тебя за место нулей идут идут -1. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость MrKirbyTM Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 (изменено) int[] signature = { 224, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, 108, 97, 121, 101, 114, -1, 114, -1, -1, -1 }; Давно не видел людей которые использую Integer вместо HEX значения ))) Изменено 8 января, 2015 пользователем MrKirbyTM Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 9 января, 2015 Поделиться Опубликовано 9 января, 2015 Давно не видел людей которые использую Integer вместо HEX значения ))) Я тебе больше скажу, были целые серии видео уроков на тему сигнатур, в которых использовался как раз integer) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения