Гость Luckyfog Опубликовано 5 февраля, 2017 Поделиться Опубликовано 5 февраля, 2017 (изменено) Вопрос: Как решить данную проблему? Писал сканер сигнатур на c# по обучающему видео. Вроде бы сделал все правильно, но вылазит ошибка : Необработанное исключение типа "System.IndexOutOfRangeException" Дополнительные сведения: Индекс находился вне границ массива. Прошу вас, помогите справится с этой проблемой ! Вот код: Скрытый текст using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Runtime.InteropServices; namespace Plants_Hack { class Func { //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("PlantsVsZombies")) return proc.Id; return -1; } public void WriteBytes() { var handle = OpenProcess(0x001F0FFF, false, GetProcessID()); byte[] buffer = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }; var dammy = new UIntPtr(); var adress = FindSignature(); if (adress != -1) WriteProcessMemory(handle, (IntPtr)adress, buffer, (uint)buffer.Length, out dammy); CloseHandle(handle); Console.WriteLine("Active чит"); } private int FindSignature() { int[] signature = {0x89,0xB7,-1,-1,-1,-1,0xB0,0x01,0x5E,0xC3,0x8B,0x8F,-1,-1,-1,-1,0x8B,0x01,0x8B,0x15}; long MaxAddress = 0x7fffffff; long address = 0; MEMORY_BASIC_INFORMATION m; var handle = OpenProcess(0x001F0FFF, false, GetProcessID()); m.BaseAddress = IntPtr.Zero; m.RegionSize = IntPtr.Zero; byte[] buffer; Console.WriteLine("ID игры : {0}", GetProcessID().ToString()); Console.WriteLine("Handle игры : {0}", handle.ToString()); 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 dammy = 0; ReadProcessMemory(handle,m.BaseAddress,buffer,(int)m.RegionSize, out dammy); 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 == signature[0]) { for (int q = 0; q < signature.Length; q++) { if (buffer[i + q] == signature[q] || signature[q] == -1) { count++; if(count == signature.Length) { CloseHandle(handle); return 1 + (int)m.BaseAddress; } } else { count = 0; } } } } } } CloseHandle(handle); return -1; } }} В этой строке кода if (buffer[i + q] == signature[q] || signature[q] == -1 программа сообщала об ошибке. Изменено 5 февраля, 2017 пользователем Luckyfog Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 5 февраля, 2017 Поделиться Опубликовано 5 февраля, 2017 41 минуты назад, Luckyfog сказал: if (buffer == signature[0]) if(buffer[i]==signature[0]) 41 минуты назад, Luckyfog сказал: return 1 + (int)m.BaseAddress; return i + (int)m.BaseAddress; 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Luckyfog Опубликовано 5 февраля, 2017 Поделиться Опубликовано 5 февраля, 2017 18 минуту назад, partoftheworlD сказал: if(buffer[i]==signature[0]) return i + (int)m.BaseAddress; Спасибо вам огромное! Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 5 февраля, 2017 Поделиться Опубликовано 5 февраля, 2017 6 минут назад, Luckyfog сказал: Спасибо вам огромное! Не за что Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 5 февраля, 2017 Поделиться Опубликовано 5 февраля, 2017 даже копировать чужой код правильно не можем) Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Luckyfog Опубликовано 5 февраля, 2017 Поделиться Опубликовано 5 февраля, 2017 Вам наверное покажется странным, но через некоторое время, снова выдает такую же ошибку. Хотя я ничего не изменял... Скрытый текст using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Diagnostics; using System.Runtime.InteropServices; namespace Plants_Hack { class Func { //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("PlantsVsZombies")) return proc.Id; return -1; } public void WriteBytes() { var handle = OpenProcess(0x001F0FFF, false, GetProcessID()); byte[] buffer = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }; var dammy = new UIntPtr(); var adress = FindSignature(); if (adress != -1) WriteProcessMemory(handle, (IntPtr)adress, buffer, (uint)buffer.Length, out dammy); CloseHandle(handle); Console.WriteLine("Active"); } private int FindSignature() { int[] signature = {0x89,0xB7,-1,-1,-1,-1,0xB0,0x01,0x5E,0xC3,0x8B,0x8F,-1,-1,-1,-1,0x8B,0x01,0x8B,0x15}; long MaxAddress = 0x7fffffff; long address = 0; MEMORY_BASIC_INFORMATION m; var handle = OpenProcess(0x001F0FFF, false, GetProcessID()); m.BaseAddress = IntPtr.Zero; m.RegionSize = IntPtr.Zero; byte[] buffer; Console.WriteLine("ID игры : {0}", GetProcessID().ToString()); Console.WriteLine("Handle игры : {0}", handle.ToString()); 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 dammy = 0; ReadProcessMemory(handle,m.BaseAddress,buffer,(int)m.RegionSize, out dammy); 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 q = 0; q < signature.Length; q++) { if (buffer[i + q] == signature[q] || signature[q] == -1) { count++; if(count == signature.Length) { CloseHandle(handle); return i + (int)m.BaseAddress; } } else { count = 0; } } } } } } CloseHandle(handle); return -1; } } } Кстати, у меня такое ощущение когда я вставляю сюда код, переменная i заменяется на 1. Скрытый текст Ссылка на комментарий Поделиться на другие сайты Поделиться
Dino Опубликовано 5 февраля, 2017 Поделиться Опубликовано 5 февраля, 2017 (изменено) белым по черному написано же, индекс находится вне границ массива, то есть происходит обращение к ячейке памяти, которая защищена от чтения, либо ее вовсе не существует. Изменено 5 февраля, 2017 пользователем Dino Ссылка на комментарий Поделиться на другие сайты Поделиться
saiberpro Опубликовано 5 февраля, 2017 Поделиться Опубликовано 5 февраля, 2017 Займитесь процессом отладки, изучите состояние переменных на каждом эта программы вплоть до ошибки. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Luckyfog Опубликовано 5 февраля, 2017 Поделиться Опубликовано 5 февраля, 2017 Похоже у меня и впрямь рак головного мозга... Зато всё работает. Благодарю всех вас, кто откликнулся. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения