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

Сканер сигнатуре на C#(помогите)


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

Здравствуйте , я сделал сканер сигнатур по видео все разобрал, но вот у меня не находит адрес.

Сигнатура верна, проверял ее много раз через 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;        }    }}
Ссылка на комментарий
Поделиться на другие сайты

Всё просто.

У тебя в функции 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. Тебе нет нужды постоянно открывать и закрывать хэндл на процесс игры, один раз открывай - пользуйся им и закрывай  (когда он не нужен).

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

Всё просто.

У тебя в функции 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. Тебе нет нужды постоянно открывать и закрывать хэндл на процесс игры, один раз открывай - пользуйся им и закрывай  (когда он не нужен).

Спасибо , попробую разобраться. 

Т.е я искал сигнатуру  в своем процессе ?Оо

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

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 значения )))

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

Давно не видел людей которые использую Integer вместо HEX значения )))

 

Я тебе больше скажу, были целые серии видео уроков на тему сигнатур, в которых использовался как раз integer)

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

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

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

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