С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

16.03.2012, 21:03. Просмотров 3214. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2012, 21:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает поиск сигнатуры (C++):

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

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

Multimap STL - работает только запись в файл, поиск в файле не работает - C++
И снова здравствуйте. Снова я прошу вашей помощи. Переделал программу с мапом в мульти мап, но что то пошло не так и работает только запись...

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

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

Изменятся ли сигнатуры функций в программе при обфускации? - C++
Такой вопрос есть необходимо изменить сигнатуры функций в программе ( для обхода античита) изменит ли Обфускация сигнатуры?

24
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.03.2012, 03:35 #2
Всё найдётся; но для затравки один вопрос- ты не ошибся, написав:
C++
1
cout << "Значение MyAddress = " << MyAddress << endl;
Я к тому, что даже если прога отработает правильно, выведется десятеричное
представление MyAddress
0
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 12:10  [ТС] #3
Цитата Сообщение от kravam Посмотреть сообщение
Я к тому, что даже если прога отработает правильно, выведется десятеричное
представление MyAddress
Респект тебе, умный человек! ) Действительно, выводится адрес начала сканирования, но в десятичной системе. Погуглил и терь все норм!
C++
1
cout << "Значение MyAddress = " << hex << MyAddress << endl;
Но дело в том что дальше первого адреса дело не идет. ( При компиляции у меня вываливается:
First-chance exception at 0x01231533 in test.exe: 0xC0000005: Access violation reading location 0x0151d326.
Unhandled exception at 0x01231533 in test.exe: 0xC0000005: Access violation reading location 0x0151d326.
Брякается на 9 строке
C++
1
     if(*szMask=='x' && *pData!=*bMask )
и в вызове стека
test.exe!bDataCompare(const unsigned char * pData, const unsigned char * bMask, const char * szMask) Line 9 + 0xe bytes C++
Т.е. поиска заданной сигнатуры не происходит...
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.03.2012, 14:03 #4
Есть предположения; пока высказывать не буду, скинь мне прогу Timerocketxb
0
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 14:23  [ТС] #5
Есть предположения; пока высказывать не буду, скинь мне прогу Timerocketxb
Да вот тоже думаю, что возможно нужно заюзать ReadProcessMemory.

Если сможешь глянуть, файлик приатачил.

Еще нашел на хабре статью, в ней и код сканера есть, только он кривой, а мои познания в плюсах на данном этапе исправить его не позволяют.... Щас читаю мануалы... Буду благодарен за любую помощь и подсказки.
0
Вложения
Тип файла: rar Timerocketxby_setup.rar (1.05 Мб, 19 просмотров)
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.03.2012, 14:32 #6
Блин, какая-то страшная программа... Чё за программа-то?
0
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 14:40  [ТС] #7
Цитата Сообщение от kravam Посмотреть сообщение
Блин, какая-то страшная программа... Чё за программа-то?
Да что попалось под руку то и взял. Маленькая игрушка. В принципе пробовал и с калькулятором винды. Через СЕ просто выбирал сигнатуру и пытался найти ее адрес. Пока результат ты знаешь. ))
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.03.2012, 15:18 #8
Пока просмотри
Доступ к памяти другого процесса

Добавлено через 11 минут
Пока же предварительный ответ такой: ты сканируешь адреса, которых просто нет. Я щас запустил твою программу и приаттачился к ней отладчиком, наблюдаю такую картину: (адрес участка памяти и размер)
Bash
1
2
98f000 1000
77b30000 1000
Ну там много подобных участков, но адрес который ты сканируешь- его просто нет, как видишь.
Но! Возможно этот адрес появляется в ПРОЦЕССЕ работы программы, я не знаю. Вообще откуда ты взял этот адрес?
2
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 15:24  [ТС] #9
Цитата Сообщение от kravam Посмотреть сообщение
Вообще откуда ты взял этот адрес?
Я атачусь в процессу при помощи СЕ, ищу сигнатуру (89 BE 0A 02 00 00 E9 87 00 00 00 83 E8 00 74 12 - эта есть постоянно). Смотрю ее адрес и относительно его задаю интервал сканирования. В идеале нужно просмотреть все пространство адресов, но пока, чтоб убедится в работоспособности кода я делаю так. Можно просто поискать что-то типа одного бита, но мой код пока не работает...
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.03.2012, 15:45 #10
Интересно, а почему я не могу найти такой сигнатуры 89 BE 0A 02 00 00 E9 87 00 00 00 83 E8 00 74 12? КОГДА ИМЕННО ты приаттачиваешься к процессу? Просто: что мне нужно сделать, на какие кнопи понажимать, куда человечка переставить, чтобы она и у меня появилась?

Добавлено через 15 минут
Короче чуть-чуть продвинулся, может поможет, не знаю; Timerocketxby.exe порождает stdrt.exe, который порождает окно и в адресном пространстве которого действительно присутствует такая сигнатура (правда, у меня по жругому адресу, но не суть); То есть возможно ты приаттачиваешься к stdrt.exe? Так, находждишь адрес, а ПРОГРАММНО ищешь эту сигнатуру в совсем другом процессе, Timerocketxby.exe, где её нет! Может так быть?
0
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 15:59  [ТС] #11
Цитата Сообщение от kravam Посмотреть сообщение
Так, находждишь адрес, а ПРОГРАММНО ищешь эту сигнатуру в совсем другом процессе, Timerocketxby.exe, где её нет! Может так быть?

Вот я блин даю... Ты прав, я аттачился к stdrt.exe Мне стыдно, что сам до этого не допер... Блин... Но всеравно, в этом случае должно было выдаться сообщение, что "Искомой сигнатуры нет", а оно постоянно лепит первый адрес.

Добавлено через 6 минут
Сейчас сделал так:
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
#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 NULL;
}
 
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 = 0x01287A52; //начало сканирования
                        DWORD dwLen = 0x01287F62 - start;   //  Длина модуля сканирования
                        cerr << "Длина модуля = " <<dwLen << endl;
                        MyAddress = dwFindPattern(start, dwLen, (BYTE*)"\x89\xBE", "xx"); //ищем адрес по маске
                        cout << "Значение MyAddress = " << hex << MyAddress << endl;
                         if (MyAddress == -1){
                            clog << "Искомой сигнатуры нет" << endl;
                            
                        }else{
                            cerr << "Адрес найден" << endl;
                        }
 
                    }
 
                
                CloseHandle(hProc);
            }
        }
        
    system("pause");
 
    return 0;
}
Аттачусь уже правильно, я думаю. Длину сигнатуры сократил до 2 байт, но результат тот же - код не работает...

ЗЫ Спасибо большое за примеры... Они мне пригодятся!
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.03.2012, 16:41 #12
Так он и скомпилится работать не будет; какой компилятор вообще это хавает? Теперь по ошибкам:
C++
1
((*szMask) == NULL);
неправильно Ну и прочая. Я бы исправил чтобы компильнулось, но я логику программы понять не могу. Поэтому совет: возьми. чё я тебе скинул, просто и элементарно дампируй нужный участок, который тебе нужен, а потом просто найди (или не найди) нужную сигнатуру, например с помощью функции memchr. Как говорится, простенько и со вкусом.
1
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 18:00  [ТС] #13
Цитата Сообщение от kravam Посмотреть сообщение
Я бы исправил чтобы компильнулось, но я логику программы понять не могу.
Функцию поиска паттерна взял тут
Цитата Сообщение от kravam Посмотреть сообщение
Поэтому совет: возьми. чё я тебе скинул, просто и элементарно дампируй нужный участок, который тебе нужен, а потом просто найди (или не найди) нужную сигнатуру, например с помощью функции memchr. Как говорится, простенько и со вкусом.
Попробую так... Так я думаю даже правильнее будет... Но теперь придется разобраться с тем что ты скинул.. )))

Добавлено через 1 час 0 минут
Перелопатил приведенные тобой примеры. Там то что мне нужно, но... не могу собрать ни один проект - вываливает кучу ошибок.... Некоторые пофиксил, но этого мало... Сорри, но мне пока сложно самостоятельно разобраться... Вижу что код именно такой как нада, но как отладить?

ЗЫ Компилил Microsoft Visual Studio 2010 Express
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
17.03.2012, 18:17 #14
Ну я не знаю, облагородь как-нибудь, уменьши по возможности, дай сюда. Попробую посмотреть. Почему я говорю попробую- я работаю преимущественно в Dev-Cpp, с MSVS (установлена) особо не дружу, но попытаться можно будет.
0
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 19:10  [ТС] #15
Я сам только обратился к плюсам, но как я понимаю MSVS как-то слишком трепетно относится к описанию функций и переменных. Код подправил согласно его требований, но
1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>ra.obj : error LNK2005: "void * __cdecl HandleProcessa(char *)" (?HandleProcessa@@YAPAXPAD@Z) already defined in handle_processa.obj
1>C:\visual studio 2010\Projects\test\Debug\test.exe : fatal error LNK1169: one or more multiply defined symbols found
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// ra.ccp
#include <windows.h>
#include <conio.h> 
 
#include <stdio.h>
#include "handle_processa.cpp"
 
int main ( ) { 
 
 char ima_protcessa [MAX_PATH];
 
 
 //Русский язык
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 //
 
 
 unsigned char sposob_nah_adresov;
 
 
 //!!!!!!!!!З А Г О Л О К   О К Н А!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 char sPath[MAX_PATH]= "прога дампирует участок адресного пространства процесса";
 CharToOem((LPCTSTR)sPath,sPath);
 SetConsoleTitle((LPCTSTR)sPath);
 //!!!!!!!!!К О Н Е Ц   З А Г О Л О К   О К Н А!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 
 
 
 //Первое, что сделааем, это введём имя процесса, который будем перегонять в строку:
 //Ввод имени файла:
 printf ("Вводи имя процесса\n");
 if (!gets (ima_protcessa)) {
  printf ("проблема с водом имени процесса\n");
  system ("pause");
  return 0;   
 };       
 
 
 
 long int NacalniAdres;
 printf ("Вводи адрес, с которого надо дампировать\n");
 scanf ("%x", &NacalniAdres);
 
 
 
 printf ("Если ты знаешь размер дампируемого участка, нажми 1, если знаешь номер \
  конечного байта, нажми 2\n");
 printf ("1         Знаешь размер дампируемого участка\n\
  2        знаешь размер конечного байта\n");
 do {
  sposob_nah_adresov= getch ();
 }
 while (sposob_nah_adresov!= '1' && sposob_nah_adresov!= '2');
 
 
 long int KolichestvoSchitivaemihBait; 
 long int nomer_konechnogo_baita; 
 if (sposob_nah_adresov== '2') {
  printf ("Вводи номер конечного байта\n");
  scanf ("%x", &nomer_konechnogo_baita);
  KolichestvoSchitivaemihBait= nomer_konechnogo_baita- NacalniAdres+ 1;
 }
 else {
  printf ("Вводи количество дампируемых байтов\n");
  scanf ("%x", &KolichestvoSchitivaemihBait);
 }
 
 
 
 
 
 int i, j;
 
 //Ищем хэндл процесса
 HANDLE hProcess= HandleProcessa (ima_protcessa);
 if (!hProcess) {
  printf ("хэндл процесса %s не найден\n", ima_protcessa);
  system ("pause");
  return 0;
 }
 
 /*В эту переменную будет считываться каждый байт, а потом выводиться в файл rez.txt
 Она должня быть именно не сhar, если будет сhar, тогда может вывестись вместо 90 ffffff90
 проверено уже. 
 */
 
 unsigned char  lpBuffer ;
 
 FILE* f_txt;
 FILE* f;
 
 f_txt= fopen ("rez.txt","wb");
 f= fopen ("rez","wb");
 if (!f_txt) {
  printf ("File-rezultat txt ne sozdan\n");
  system ("pause");
  return 0;
 } 
 if (!f) {
  printf ("File-rezultat ne sozdan\n");
  system ("pause");
  return 0;
 } 
 
 //Вот, всё. Такой вот цикл. Выводится значение байта, а рядом- его порядковый номер. 
 //Запишем всё это дело в файл rez.txt
 j= 0;
 for (i= 0; i< KolichestvoSchitivaemihBait; i++) {
  ReadProcessMemory (hProcess, (void*)(NacalniAdres+ i), &lpBuffer, 1, 0  );
  fprintf (f_txt, "0X%-0.2x,%c", lpBuffer, ' ');
  fputc (lpBuffer, f);
  if (j++== 3) {
   putc (10, f_txt);
   j= 0;
  }
 }
 
 
 CloseHandle (hProcess);
 fclose (f_txt);
 fclose (f);
 return 0;
}
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
// handle_processa.cpp
#ifndef uslovni_fail
#define uslovni_fail
 
 
 
#include <stdio.h> 
#include <Windows.h> 
#include <Winnt.h> 
//Здесь определена структура PROCESSENTRY32 и функция CreateToolhelp32Snapshot
#include <tlhelp32.h>
//int main ();
HANDLE HandleProcessa (char* szFilename) {
 
 HANDLE hProcessSnap;
 PROCESSENTRY32 pe32;
 
 //Это мы находим дескриптор снимка процессов
 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
 if (hProcessSnap == INVALID_HANDLE_VALUE)
 return false;
 pe32.dwSize = sizeof(PROCESSENTRY32);
 
 
 do {
  if (!Process32Next(hProcessSnap, &pe32)) // перечисляем процессы
  return FALSE;
 }
 while (lstrcmpi(pe32.szExeFile, (LPCTSTR) szFilename)); // ищем нужный процесс. Его PID будет в поле pe32.th32ProcessID              
 
 
 CloseHandle(hProcessSnap);
 
 //Тот самый хэрдл, который ищем
 HANDLE hProcess;
 
 
 //Функция OpenProcess возвращает дескриптор процесса, а третий принимаемый ею параметр- идентификатор процесса
 // (PID)
 
//Внимание! Не для всех процессов возвращается хэндл, если права доступа PROCESS_ALL_ACCESS
//Приходится использовать только для чтения
 hProcess = OpenProcess(PROCESS_VM_READ, 0, pe32.th32ProcessID);
 
 return hProcess;
};
#endif
0
17.03.2012, 19:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2012, 19:10
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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