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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.65
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
16.03.2012, 21:03     Не работает поиск сигнатуры #1
Доброго времени суток.
Задач - найти адрес в памяти по известной сигнатуре. В Си новичек. Перелопатил нет, из нарытого накодил:
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++
C++ Антивирусные сигнатуры
C++ Сигнатуры класса и библиотеки
C++ Не работает поиск в структуре
сигнатуры C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Битл
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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
18.03.2012, 22:19     Не работает поиск сигнатуры #24
Ну так оно вроде. Искать сигнатуру, значения которой меняются динамически- ни разу эти мне занимался, но задача достойная.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 22:59     Не работает поиск сигнатуры
Еще ссылки по теме:

поиск не работает C++
Поиск клада. Не работает if. C++
Multimap STL - работает только запись в файл, поиск в файле не работает C++

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

Или воспользуйтесь поиском по форуму:
Битл
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     Не работает поиск сигнатуры
Ответ Создать тему
Опции темы

Текущее время: 06:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru