alexmarch Опубликовано 25 апреля, 2015 Поделиться Опубликовано 25 апреля, 2015 Код рабочий но почему то не находит сигнатуру. Находит из 73 только 30 байтхотя в читэнжине вижу всеможет неверный адрес вхождения?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 TradingAssisetent{ class MemoryRead { const int PROCESS_WM_READ = 0x0010; // флаг на чтение //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; } // Глобальные переменные public int pID; // PID процесса int startAddress = 0; // Начало файла int sizeToAllocate = 0; // Размер файла byte[] buffer; // Объявление ссылки на массив public int GetProcessID(string nameProc) //Поиск Id процесса { foreach (Process proc in Process.GetProcessesByName(nameProc)) { pID = proc.Id; // запомним ID процесса return proc.Id; } return -1; } public int FindModulesAddress(string nameProc) // Поиск по модулям { if (pID !=0) // если ID процесса найден { foreach (var p in Process.GetProcesses()) { if (p.Id == pID ) // Ищем процеес с нашим ID { foreach (ProcessModule m in p.Modules) { if (m.ModuleName == nameProc + ".exe") { startAddress = (int)m.BaseAddress; // Берем базовый адрес sizeToAllocate = m.ModuleMemorySize; // Размер модуля return 1; } } } } } return -1; } public int FindSignature() // Поиск по сигнатуре { int[] signature = {0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0A, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x3E, 0x3C, 0x69, 0x6E, 0x76, 0x65, 0x6E, 0x74, 0x6F, 0x72, 0x79, 0x3E, 0x3C, 0x69, 0x74, 0x65, 0x6D, 0x3E, 0x3C, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x64, 0x69, 0x74, 0x79, 0x3E}; var handle = OpenProcess(PROCESS_WM_READ, false, pID); // ID процесса if (handle != IntPtr.Zero) // Если хендл не 0, тогда { buffer = new byte[sizeToAllocate]; // Объявляем буфер размером во весь модуль int bytesread; // переменная заглушка ReadProcessMemory(handle, (IntPtr)startAddress, buffer, sizeToAllocate, out bytesread); //Читаем, с начала адресса, в буфер, весь файл, и заглушка CloseHandle(handle); // закрыли хендл var counter = 0; // обьявляем переменную счетчик if (signature.Length <= buffer.Length) { for (var i = 0; i < buffer.Length; i++) { if (buffer[i] == signature[0] | signature [0] == -1 ) { for ( var j =0; j < signature.Length; j++) { var text = buffer[i + j]; if (buffer[i+j]== signature[j] | signature[j] == -1) { counter++; if (counter >=29) { \\максимум было 30 каунтов } if (counter == signature.Length) { var result = i + startAddress; return result; } } else { counter = 0; } } } } } } return -1; } Ссылка на комментарий Поделиться на другие сайты Поделиться
Dison Опубликовано 25 апреля, 2015 Поделиться Опубликовано 25 апреля, 2015 Код нужно под спойлер прятать... Ссылка на комментарий Поделиться на другие сайты Поделиться
alexmarch Опубликовано 25 апреля, 2015 Автор Поделиться Опубликовано 25 апреля, 2015 уже не могу редактировать так бы исправил Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 29 апреля, 2015 Поделиться Опубликовано 29 апреля, 2015 попробуйте этим поискать вашу сигнатуру, там два варианта, потом скажите, в каком варианте находит сигантура пишется как на рисунке. MEMORY_Scaner.7z VirusTotal 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 29 апреля, 2015 Поделиться Опубликовано 29 апреля, 2015 попробуйте этим поискать вашу сигнатуру, там два варианта, потом скажите, в каком варианте находит сигантура пишется как на рисунке.Плюсанул) Программу потестил быстро с поиском по сигнатуре - отлично находит. P.S. #1 Писал на C#? P.S. #2 Добавил в твое сообщение результат сканирования с VirusTotal - вдруг кому интересно будет. Ссылка на комментарий Поделиться на другие сайты Поделиться
Laziz Опубликовано 29 апреля, 2015 Поделиться Опубликовано 29 апреля, 2015 Плюсанул)Программу потестил быстро с поиском по сигнатуре - отлично находит.P.S. #1Писал на C#?P.S. #2Добавил в твое сообщение результат сканирования с VirusTotal - вдруг кому интересно будет.Да, на C# писал. ценю +ы 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения