Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/35: Рейтинг темы: голосов - 35, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65

Не работает поиск сигнатуры

16.03.2012, 21:03. Показов 7603. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Задач - найти адрес в памяти по известной сигнатуре. В Си новичек. Перелопатил нет, из нарытого накодил:
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
60
61
62
63
64
65
#include <iostream>* 
#include <windows.h>
#include <iomanip>
using namespace std;
 
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
        for(;*szMask;++szMask,++pData,++bMask)
                if(*szMask=='x' && *pData!=*bMask )
                        return false;
        return (*szMask) == NULL;
}
 
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen, BYTE *bMask, char * szMask) {
        for(DWORD i=0;i<dwLen;i++)
                if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
                        return (DWORD)(dwAddress+i);
        return (-1);
}
 
int main ()
{ ::setlocale(LC_ALL,"");
   
    DWORD MyAddress = NULL; // Адрес сигнатуры
    
    HWND hWnd = FindWindowA(0,"Timerocketxby");
 
    if (hWnd == 0) {
        cerr << "Запустите Timerocketxby" << endl;
    }else {
            cerr << "процесс найден" << endl;
            DWORD pId;
            GetWindowThreadProcessId(hWnd, &pId);
            HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, 0, pId);
 
            if (!hProc){
            cerr << "не могу открыть процесс" << endl;
            }else{
                                    
                    bool findOffsets();{
        
                        DWORD start = 0x0151D426; //начало сканирования
                        DWORD dwLen = 0x0151D626 - start;   //  Длина модуля сканирования
                        cerr << "Длина модуля = " <<dwLen << endl;
                        
                        MyAddress = dwFindPattern(start, dwLen, (BYTE*)"\x89\xBE\x0A\x02\x00\x00\xE9\x87\x00\x00\x00\x83\xE8\x00\x74\x12", "xxxxxxxxxxxxxxxx"); //ищем адрес по маске
                        cout << "Значение MyAddress = " << MyAddress << endl;
                         if (MyAddress == -1){
                            clog << "Искомой сигнатуры нет" << endl;
                            
                        }else{
                            cerr << "Адрес найден" << endl;
                        }
 
                    }
 
                
                CloseHandle(hProc);
            }
        }
        
    system("pause");
 
    return 0;
}
В результате работы кода, MyAddress присваивается какое-то значение, которое никак не связано с адресами памяти процесса.

Подскажите плз где я ошибся. Возможно у кого-нить есть пример кода для такого сканера памяти.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2012, 21:03
Ответы с готовыми решениями:

Поиск сигнатуры в директории
Как осуществить поиск сигнатуры в директории и поддиректории, на языке Shell. Очень надо)) Кто знает напишите, будьте добры.

Поиск сигнатуры в памяти процесса
как искать сигнатуру в памяти процесса тип такой АА 00 АА 00 00 АА (найдет куча адресов) потом в игре бросит предмет и искать дале в...

Поиск сигнатуры в памяти процесса и подключение к нему
По заголовку темы все понятно. Как сделать, что бы после нажатия на кнопку программа искала во всех процессах сигнатуру или несколько и...

24
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 20:37  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kravam Посмотреть сообщение
да чёрт его знает, навскидку вроде тяжеловато будет, смотри, за поиск в считанном дампе отвечает memchr, это ты должен без считывания если накропать некое подобие memchr, причём всё равно каждый байт ТЫ ОБЯЗАН БУДЕШЬ СЧИТАТЬ, подумай сам- а иначе как ты его распознаешь???. Короче без ReadProcessMemory вряд ли обойдёшся; то есь какой-то промежеточный буфер- файл ли, массив ли всё равно должен быть. Думай, короче.
Ок, спасибо, буду раскуривать...
Но по идее поиск сигнатуры организован этой функцией
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
        for(;*szMask;++szMask,++pData,++bMask)
                if(*szMask=='x' && *pData!=*bMask )
                        return false;
        return (*szMask) == NULL;
}
 
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen, BYTE *bMask, char * szMask) {
        for(DWORD i=0;i<dwLen;i++)
                if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
                        return (DWORD)(dwAddress+i);
        return NULL;
}
Это как раз наверное и есть подобие memchr. Просто выделяется не массив, а пространство сканируемых адресов... Раскрутить логику этой функции мешает недостаток знаний в плюсах и жена... Попробую раскрутить и по возможности улучшить... Сейчас функция отрабатывает, но что-то там затык с маской..
Хотя, эта функция без ReadProcessMemory работать не сможет наверно? Т.е. нужно сначала считать память, а потом искать...
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
18.03.2012, 21:22
При всём том, нокакое-никакое дампирование адресного пространства сторонего процесса должно происходить, а его нет (ReadProcessMemory или чё-нибудь ещё)! Твой код из первого поста- обращаю внимание на одну деталь- ты находишь хэндл процесса- правильно нет, не знаю
hProc
Но в дальнейшем ты его нигде не используешь! Ты только проверяешь его на истинность и вызываешь
C++
1
MyAddress = dwFindPattern(start, dwLen, (BYTE*)"\x89\xBE\x0A\x02\x00\x00\xE9\x87\x00\x00\x00\x83\xE8\x00\x74\x12", "xxxxxxxxxxxxxxxx"); //ищем адрес по маске
И думаешь, что ищешь адрес в СТОРОННЕМ процессе! Вообще НИКАК не обратившись к его памяти Разве может такое быть? Поэтому так, навскидку, максимум, чего можно добиться идя таким путём, это найти (или не найти) сигнатуру в ТЕКУЩЕМ процессе. Кстати, очень может быть, что dwFindPattern как и bDataCompare именно для этого и предназначены- сканировать текущий процесс; я в английском не силён но сходил по ссылке ещё раз и нигде не обнаружил, что сканируется именно сторонний процесс.
1
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 22:10  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
И думаешь, что ищешь адрес в СТОРОННЕМ процессе! Вообще НИКАК не обратившись к его памяти Разве может такое быть?
Вот жешь я нубище!!! Спасибо что глянул код, а то бы я еще долго тупил. Кста, ты единственный из всех к кому я обращался заметил этот МАЛЕНЬКИЙ нюанс... Т.е. остальные код даже не смотрели... (( Ну, ниче, теперь я знаю что исправлять... А та функция на подобии memchr, но она дает возможность осуществлять поиск по маске... У memchr такой возможности как я понимаю нет. Т.е. отыскать сигнатуру внутри которой некоторые значения меняются динамически memchr не сможет. Так?

Еще раз пасиб! ))
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
18.03.2012, 22:19
Ну так оно вроде. Искать сигнатуру, значения которой меняются динамически- ни разу эти мне занимался, но задача достойная.
0
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 22:59  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Искать сигнатуру, значения которой меняются динамически- ни разу эти мне занимался, но задача достойная.
Такое часто встречается при изменении кода игр... Т.е. есть участки сигнатуры с постоянными значениями, а некоторые байты могут изменяться... В таких случаях нужно использовать маску....

алг
Есть паттерн (строчка байт, которую нужно найти), маска (строчка байт вида "000xxx00xxx00xxx"), длина этой маски.

Берёшь адрес начала сканирования - StartAddress.
Адрес конца сканирования - EndAddress.

Читаешь кусочек памяти (через ReadProcessMemory, как я понимаю) длиной в паттерн, сравниваешь побайтно прочитанное с паттерном, наложив на него маску - т.е. в моём примере 0 - нужный байт, x - любой.
Как только нашёлся кусок данных, равный паттерну (с наложенной маской) - возвращаешь адрес сканирования, это и будет нужный адрес.

Паттерн: \x89\xBE\x0A\x02\x00\x00\xE9\x87\x00\x00 \x00\x83\xE8\x00\x74\x12
Маска: "xxx0000x0000xxxx"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2012, 22:59

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

Сигнатуры
Хотел задать такой вопрос! Или даже просьбу о помощи! Этот скрипт ставиться на чекбокс: var Search: TMemorySearch; begin if...

Неправильные сигнатуры МК
Хочу прошить МК, но всё время выдает ошибки. Что делать? avrdude v6.3 (я обновил). Запускал всё с cmd Arduino + tiny13a без кондера...

Антивирусные сигнатуры
Всем привет) Порыл я MSDN на функции получения различной информации о файле. Задача моя довольна простая, программа должна искать по...

Отправка сигнатуры
Доброго времени суток. Собственно сам вопрос, как правильно отправить сигнатуру запроса по POST и GET запросам в https с использованием...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru