Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
#1

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

16.03.2012, 21:03. Просмотров 3032. Ответов 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 присваивается какое-то значение, которое никак не связано с адресами памяти процесса.

Подскажите плз где я ошибся. Возможно у кого-нить есть пример кода для такого сканера памяти.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2012, 21:03     Не работает поиск сигнатуры
Посмотрите здесь:

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

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

Сигнатуры класса и библиотеки - C++
Доброго времени суток. Недавно взялся за изучение C++ и после C# и Java с классами работать немного непривычно... Вопрос такой, есть класс...

Уточнения сигнатуры функции для std::function - C++
Добрый день, как в таких случаях уточнить какую именно перегрузку функции random я передаю в std::function ? #include &lt;iostream&gt; ...

Поиск не работает - C++
Помогите пожалуйста, понять и исправить функцию поиска в линейном списке . Не понимаю, почему прога вылетает((( #include &lt;iostream&gt; ...

Не работает поиск в структуре - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cstring&gt; #include &lt;windows.h&gt; #include &lt;limits&gt; using namespace std; ...

Поиск по вектору не работает - C++
Есть класс и контейнер-вектор, надо отсортировать контейнер вектор,выполнить поиск #include &lt;iostream&gt; #include &lt;vector&gt; #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 20:37  [ТС]     Не работает поиск сигнатуры #21
Цитата Сообщение от 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 работать не сможет наверно? Т.е. нужно сначала считать память, а потом искать...
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
18.03.2012, 21:22     Не работает поиск сигнатуры #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 именно для этого и предназначены- сканировать текущий процесс; я в английском не силён но сходил по ссылке ещё раз и нигде не обнаружил, что сканируется именно сторонний процесс.
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 22:10  [ТС]     Не работает поиск сигнатуры #23
Цитата Сообщение от kravam Посмотреть сообщение
И думаешь, что ищешь адрес в СТОРОННЕМ процессе! Вообще НИКАК не обратившись к его памяти Разве может такое быть?
Вот жешь я нубище!!! Спасибо что глянул код, а то бы я еще долго тупил. Кста, ты единственный из всех к кому я обращался заметил этот МАЛЕНЬКИЙ нюанс... Т.е. остальные код даже не смотрели... (( Ну, ниче, теперь я знаю что исправлять... А та функция на подобии memchr, но она дает возможность осуществлять поиск по маске... У memchr такой возможности как я понимаю нет. Т.е. отыскать сигнатуру внутри которой некоторые значения меняются динамически memchr не сможет. Так?

Еще раз пасиб! ))
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
18.03.2012, 22:19     Не работает поиск сигнатуры #24
Ну так оно вроде. Искать сигнатуру, значения которой меняются динамически- ни разу эти мне занимался, но задача достойная.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 22:59     Не работает поиск сигнатуры
Еще ссылки по теме:

Поиск клада. Не работает if. - C++
Всем доброго времени суток! вот программа, которая определяет в зависимости от координат положения, найден ли клад или нет: ...

Не работает поиск в программе - C++
#include &lt;iostream&gt; //cin, cout #include &lt;iomanip&gt; //setw(), cout.setf(), cout.unsetf() #include &lt;string&gt; //стандартный класс...

Не работает поиск односвязный список - C++
Здравствуйте! В чем мой косяк. Не работает поиск по стране Остальное все работает

Не работает программа поиск в файле - C++
Почему не работает программа пишет ошибку Unit1.cpp(47): E2034 Cannot convert 'char' to 'char *'пометил где //ошибку И файл закинул по...

Неправильно работает поиск в массиве - C++
max=Arr; for(i=0;i&lt;15;i++) { if(Arr%2==0) if(max&lt;Arr) max=Arr; } cout&lt;&lt;max; программа работает не...


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

Или воспользуйтесь поиском по форуму:
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 22:59  [ТС]     Не работает поиск сигнатуры #25
Цитата Сообщение от kravam Посмотреть сообщение
Искать сигнатуру, значения которой меняются динамически- ни разу эти мне занимался, но задача достойная.
Такое часто встречается при изменении кода игр... Т.е. есть участки сигнатуры с постоянными значениями, а некоторые байты могут изменяться... В таких случаях нужно использовать маску....

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

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

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

Паттерн: \x89\xBE\x0A\x02\x00\x00\xE9\x87\x00\x00\x00\x83\xE8\x00\x74\x12
Маска: "xxx0000x0000xxxx"
Yandex
Объявления
18.03.2012, 22:59     Не работает поиск сигнатуры
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru