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

Вопрос по уроку HackingMemory [C# sigskaner]


RockHammer

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

Всем привет!

 

Итак, решил написать трейнер по уроку Hacking Memory. Сканер сигнатур на Си - вполне заманчиво.

Написал. Ошибок при компиляции не возникло.

Однако... Есть непонятная ошибка в работе программы, которую я совсем не понимаю.

lRRHYRvoYvM.jpg

 

Не исключаю рукожопость при изготовлении трейнера, поэтому код под спойлером

У кого какие идеи? Что это может быть? Как это решить?

Может быть я превысил количество байтов в сигнатуре?

Заранее спасибо :)


P.s. как увеличить число сигнатур? Т.е. как добавить вторую, третью, четвертую... 

using System;using System.Diagnostics;using System.Runtime.InteropServices;namespace ConsoleC_sharp{    class Function    {        //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);        int GetProcessID()        {            foreach (Process proc in Process.GetProcessesByName("Game"))//тут имя процесса                return proc.Id;            return -1;        }        public void WriteBytes()        {            var handle = OpenProcess(0x001F0FFF, false, GetProcessID());            byte[] buffer = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }; //байты нупов            var dammy = new UIntPtr();            var address = FindSignature();            if (address!= -1)            WriteProcessMemory(handle, (IntPtr)address, buffer, (uint)buffer.Length, out dammy);            CloseHandle(handle);            Console.WriteLine("Cheat is activated!");        }        private int FindSignature()        {            int[] signature = { 0xF3, 0x0F, 0x11, 0x95, -1, -1, -1, -1, 0xF3, 0x0F, 0x10, 0x52, 0x74, 0xF3, 0x0F, 0x58, 0xC7, 0xF3, 0x0F, 0x58, 0xD0 }; //Тут сигнатура            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("Process ID : {0}", GetProcessID().ToString());            Console.WriteLine("Handle process : {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;        }    }} 
Ссылка на комментарий
Поделиться на другие сайты

1. Ты не превысил количество байтов в сигнатуре, ты "вылетел" за ее пределы. То есть, у тебя индекс получает значение больше размера самой сигнатуры.

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

1. Ты не превысил количество байтов в сигнатуре, ты "вылетел" за ее пределы. То есть, у тебя индекс получает значение больше размера самой сигнатуры.

 

Понятно. Я писал по уроку, а в уроке было помоему 4 байта... 

Теперь не понятно как это пофиксить)

Да, и... Есть ли у кого исходный код этого урока? (всей серии этих уроков, там помоему 4 урока)

Получается... Что нужно сделать, чтобы пофиксить баг? 

Вот еще скриншот полного описания функции:

9Xev8p_XjZM.jpg

Решение найдено! (на ответах мейл)

Добрые люди посоветовали заменить это:

for (int q = 0; q < signature.Length; q++)

на это:

for (int q = 0; q < signature.Length && i + q < buffer.Length; q++)
Изменено пользователем RockHamer
Ссылка на комментарий
Поделиться на другие сайты

В последних видео по C# этот недочет был убран, советую посмотреть. 

 

Демонстрация чита на Far Cry 1 (интересен процесс изготовления, которого нет на канале), защита, взлом .net приложений, создание сетевого чата... 

Можно ссылочку на новый урок, в котором нет этого недостатка?) Или серии уроков. 

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

Демонстрация чита на Far Cry 1 (интересен процесс изготовления, которого нет на канале), защита, взлом .net приложений, создание сетевого чата... 

Можно ссылочку на новый урок, в котором нет этого недостатка?) Или серии уроков.

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

 

Было бы неплохо сделать урок по поиску и записи сразу нескольких сигнатур. Т.е. допустим 3 разных поиска - 3 разных сигнатуры. (к примеру, отдача разброс и патроны)

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

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

 

Нет, чтоб хотябы шаблон сделал для остальных читов. Т.е. показал как "размножить" эту функцию и как ее потом включать отдельно от остальных. Не думаю что это так уж прям долго. Минуты 2-3...

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

Нет, чтоб хотябы шаблон сделал для остальных читов. Т.е. показал как "размножить" эту функцию и как ее потом включать отдельно от остальных. Не думаю что это так уж прям долго. Минуты 2-3...

В смысле размножить? У него же есть функция FindSignature или как-то так - вот и вызывай ее когда нужно. А вообще писать трейнеры на .NET это просто полнейшее безумие, лучше уж на дельфях попробуй.

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

В смысле размножить? У него же есть функция FindSignature или как-то так - вот и вызывай ее когда нужно. А вообще писать трейнеры на .NET это просто полнейшее безумие, лучше уж на дельфях попробуй.

На дельфинарии? Дак на этом языке почти нет уроков по gamehackin'у...

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

Любой код можно с правками перенести на любой из ЯП (с оговорками). После НГ планирую цикл уроков по созданию трейнеров под С++ и Delphi. Буду стараться каждый из аспектов объяснять максимально подробно.

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

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

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

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