Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
21 / 21 / 7
Регистрация: 30.05.2014
Сообщений: 431
.NET 4.x

Сканирование байтов в памяти, и получение начального адреса байтов

04.05.2015, 19:23. Показов 1839. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет форумчане!
У меня вопрос, как просканировать память у процесса так, чтобы получить адрес начала байтов в памяти?
Я попробовал найти готовый код в интернете, но у меня VirtualQueryEx возвращает 0, и код не работает.

Нужно что-то по принципу сканирования байтов , как в Cheat Engine , и получение адресов этих байтов.

Кто знает, как поискать?
Смотрел темы на форуме, так и не нашёл того, что мне нужно.

Добавлено через 47 минут
Написал код, но он очень медленный. Как ускорить?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public int findsignature(int PID, byte[] signature)
        {
            long MaxAddr = 0x7fffffff;
            long Addr = 0;
            MEMORY_BASIC_INFORMATION m;
            var handle = OpenProcess(0x001F0FFF, false, PID);
            m.BaseAddress = IntPtr.Zero;
            m.RegionSize = IntPtr.Zero;
            byte[] buffer;
            while(Addr <= MaxAddr)
            {
                VirtualQueryEx(handle, (IntPtr)Addr, 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 (Addr == (long)m.BaseAddress + (long)m.RegionSize)
                    break;
                int count = 0;
                Addr = (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++)
                            {
                                try
                                {
                                    if (buffer[i + q] == signature[q] || signature[q] == -1)
                                    {
                                        count++;
                                        if (count == signature.Length)
                                        {
                                            return i + (int)m.BaseAddress;
                                        }
                                    }
                                    else
                                    {
                                        count = 0;
                                    }
                                }
                                catch { }
                            }
                        }
                    }
                }
            }
            return 0;
        }
Добавлено через 32 минуты
Начальный адрес сделал не 0, а адрес программы. Что делать дальше - я хз.
Кто знает , как избавиться от кучи циклов этих?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.05.2015, 19:23
Ответы с готовыми решениями:

Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов
Выполнить чтение всех байтов с файла с помощью FileInputStream в массив байтов. Создать строку на основе прочитанного массива байтов и...

Если увеличить объём кластера на флешке с 4048 байтов до 8192 байтов то она будет работать быстрей?
Как думаете если увеличить объём кластера на флешке с 4048 байтов до 8192 байтов то на будет работать быстрей?

Получение битов из байтов
Например есть 8 байт данных. Есть стартовый байт и стартовый бит - откуда нужно взять информацию, а также длина в битах(сколько нужно...

2
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.05.2015, 08:35
попробуйте так, только тут идет поиск по основному модулю процесса (но переделать не сложно)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public unsafe uint Find(byte[] pattern, string mask = "")
{
    if (this.Process == null)
        throw new Exception("Process exists");
 
    if (mask == "")
    {
        mask = new string('x', pattern.Length);
    }
    else
    {
        if (pattern.Length != mask.Length)
            throw new ArgumentException("Pattern and Mask lengths must be the same.");
 
        foreach (char c in mask)// check mask
        {
            if (c != 'x' && c != '!' && c != '?')
            {
                throw new ArgumentException("Bad sumbol: '" + c + "'", "mask");
            }
        }
    }
 
    var bytesRead = 0;
    var found = false;
    var size = Process.MainModule.ModuleMemorySize;
    var dataLenght = size - pattern.Length;
 
    var buffer = Marshal.AllocHGlobal(size);
 
    ReadProcessMemory(this.Handle, this.BaseAddress, (void*)buffer, size, out bytesRead);
 
    if (bytesRead != size)
        throw new Exception("ModuleMemorySize and BytesRead lengths must be the same.");
 
    var offset = 0u;
 
    for (; offset < dataLenght; offset++)
    {
        found = true;
        for (int index = 0; index < pattern.Length; index++)
        {
            byte element = ((byte*)buffer)[offset + index];
 
            if ((mask[index] == 'x' && pattern[index] != element)
             || (mask[index] == '!' && pattern[index] == element))
            {
                found = false;
                break;
            }
        }
 
        if (found)
            break;
    }
 
    Marshal.FreeHGlobal(buffer);
    return found ? offset + BaseAddress : 0u;
}
0
21 / 21 / 7
Регистрация: 30.05.2014
Сообщений: 431
05.05.2015, 12:17  [ТС]
Цитата Сообщение от Konctantin Посмотреть сообщение
только тут идет поиск по основному модулю процесса
дело в том, что мне надо искать в динамической памяти у процесса, которая не имеет модуля
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.05.2015, 12:17
Помогаю со студенческими работами здесь

Получение битов и байтов от значения
Здравствуйте! И так, дано к примеру значение формата 0x0000FF00 . Как получить 2 байт данного значение? или 5 бит? Прошу подробно...

Получение начального адреса процесса
Здравствуйте! Запущен процесс пытаюсь получить его адрес по аналогии с dll модулями MODULEINFO GetModuleInfo(char *szModule) { ...

Получение байтов из пакета, принятого в WSARecv
Здравствуйте, хочу спросить, как получить байты полученого пакета с функции WSARecv int WINAPI WSARecv(SOCKET s, LPWSABUF lpBuffers,...

Проверка IP адреса на валидность, если в одном из байтов есть начальный нуль
Добрый день. Считываю параметры из текстового файла, в т.ч. и IP-адрес. Столкнулся с тем, что IPAddress.Parse(string RemoteIpServer)...

Проверка IP адреса на валидность, если в одном из байтов есть начальный нуль
Добрый день. Считываю параметры из текстового файла, в т.ч. и IP-адрес. Столкнулся с тем, что IPAddress.Parse(string RemoteIpServer)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru