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

Индекс находился вне границ массива.


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

Вопрос: Как решить данную проблему?

Писал сканер сигнатур на 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 программа сообщала об ошибке.

 

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

Вам наверное покажется странным, но через некоторое время, снова выдает такую же ошибку. Хотя я ничего не изменял...

Скрытый текст

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.

 

Скрытый текст

VvPxAuEipZg.jpg

 

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

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

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

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

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

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