RockHammer Опубликовано 22 декабря, 2014 Поделиться Опубликовано 22 декабря, 2014 Всем привет! Итак, решил написать трейнер по уроку Hacking Memory. Сканер сигнатур на Си - вполне заманчиво.Написал. Ошибок при компиляции не возникло.Однако... Есть непонятная ошибка в работе программы, которую я совсем не понимаю. Не исключаю рукожопость при изготовлении трейнера, поэтому код под спойлеромУ кого какие идеи? Что это может быть? Как это решить?Может быть я превысил количество байтов в сигнатуре?Заранее спасибо 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; } }} Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 23 декабря, 2014 Поделиться Опубликовано 23 декабря, 2014 1. Ты не превысил количество байтов в сигнатуре, ты "вылетел" за ее пределы. То есть, у тебя индекс получает значение больше размера самой сигнатуры. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 23 декабря, 2014 Автор Поделиться Опубликовано 23 декабря, 2014 (изменено) 1. Ты не превысил количество байтов в сигнатуре, ты "вылетел" за ее пределы. То есть, у тебя индекс получает значение больше размера самой сигнатуры. Понятно. Я писал по уроку, а в уроке было помоему 4 байта... Теперь не понятно как это пофиксить)Да, и... Есть ли у кого исходный код этого урока? (всей серии этих уроков, там помоему 4 урока)Получается... Что нужно сделать, чтобы пофиксить баг? Вот еще скриншот полного описания функции:Решение найдено! (на ответах мейл)Добрые люди посоветовали заменить это:for (int q = 0; q < signature.Length; q++)на это:for (int q = 0; q < signature.Length && i + q < buffer.Length; q++) Изменено 23 декабря, 2014 пользователем RockHamer Ссылка на комментарий Поделиться на другие сайты Поделиться
HackingMemory Опубликовано 24 декабря, 2014 Поделиться Опубликовано 24 декабря, 2014 В последних видео по C# этот недочет был убран, советую посмотреть. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 24 декабря, 2014 Автор Поделиться Опубликовано 24 декабря, 2014 В последних видео по C# этот недочет был убран, советую посмотреть. Демонстрация чита на Far Cry 1 (интересен процесс изготовления, которого нет на канале), защита, взлом .net приложений, создание сетевого чата... Можно ссылочку на новый урок, в котором нет этого недостатка?) Или серии уроков. Ссылка на комментарий Поделиться на другие сайты Поделиться
HackingMemory Опубликовано 24 декабря, 2014 Поделиться Опубликовано 24 декабря, 2014 Демонстрация чита на Far Cry 1 (интересен процесс изготовления, которого нет на канале), защита, взлом .net приложений, создание сетевого чата... Можно ссылочку на новый урок, в котором нет этого недостатка?) Или серии уроков. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 25 декабря, 2014 Автор Поделиться Опубликовано 25 декабря, 2014 Было бы неплохо сделать урок по поиску и записи сразу нескольких сигнатур. Т.е. допустим 3 разных поиска - 3 разных сигнатуры. (к примеру, отдача разброс и патроны) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 25 декабря, 2014 Поделиться Опубликовано 25 декабря, 2014 А зачем? Если для каждого чита процедура повторяется? Не вижу смысла в том, чтобы трижды за один урок выполнять одни и те же действия. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 25 декабря, 2014 Автор Поделиться Опубликовано 25 декабря, 2014 А зачем? Если для каждого чита процедура повторяется? Не вижу смысла в том, чтобы трижды за один урок выполнять одни и те же действия. Нет, чтоб хотябы шаблон сделал для остальных читов. Т.е. показал как "размножить" эту функцию и как ее потом включать отдельно от остальных. Не думаю что это так уж прям долго. Минуты 2-3... Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 25 декабря, 2014 Поделиться Опубликовано 25 декабря, 2014 Нет, чтоб хотябы шаблон сделал для остальных читов. Т.е. показал как "размножить" эту функцию и как ее потом включать отдельно от остальных. Не думаю что это так уж прям долго. Минуты 2-3...В смысле размножить? У него же есть функция FindSignature или как-то так - вот и вызывай ее когда нужно. А вообще писать трейнеры на .NET это просто полнейшее безумие, лучше уж на дельфях попробуй. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 27 декабря, 2014 Автор Поделиться Опубликовано 27 декабря, 2014 В смысле размножить? У него же есть функция FindSignature или как-то так - вот и вызывай ее когда нужно. А вообще писать трейнеры на .NET это просто полнейшее безумие, лучше уж на дельфях попробуй.На дельфинарии? Дак на этом языке почти нет уроков по gamehackin'у... Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 27 декабря, 2014 Поделиться Опубликовано 27 декабря, 2014 Любой код можно с правками перенести на любой из ЯП (с оговорками). После НГ планирую цикл уроков по созданию трейнеров под С++ и Delphi. Буду стараться каждый из аспектов объяснять максимально подробно. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения