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

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

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

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

16.03.2012, 21:03. Просмотров 2996. Ответов 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...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
17.03.2012, 03:35     Не работает поиск сигнатуры #2
Всё найдётся; но для затравки один вопрос- ты не ошибся, написав:
C++
1
cout << "Значение MyAddress = " << MyAddress << endl;
Я к тому, что даже если прога отработает правильно, выведется десятеричное
представление MyAddress
Битл
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++
Т.е. поиска заданной сигнатуры не происходит...
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
17.03.2012, 14:03     Не работает поиск сигнатуры #4
Есть предположения; пока высказывать не буду, скинь мне прогу Timerocketxb
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 14:23  [ТС]     Не работает поиск сигнатуры #5
Есть предположения; пока высказывать не буду, скинь мне прогу Timerocketxb
Да вот тоже думаю, что возможно нужно заюзать ReadProcessMemory.

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

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

Добавлено через 11 минут
Пока же предварительный ответ такой: ты сканируешь адреса, которых просто нет. Я щас запустил твою программу и приаттачился к ней отладчиком, наблюдаю такую картину: (адрес участка памяти и размер)
Bash
1
2
98f000 1000
77b30000 1000
Ну там много подобных участков, но адрес который ты сканируешь- его просто нет, как видишь.
Но! Возможно этот адрес появляется в ПРОЦЕССЕ работы программы, я не знаю. Вообще откуда ты взял этот адрес?
Битл
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 - эта есть постоянно). Смотрю ее адрес и относительно его задаю интервал сканирования. В идеале нужно просмотреть все пространство адресов, но пока, чтоб убедится в работоспособности кода я делаю так. Можно просто поискать что-то типа одного бита, но мой код пока не работает...
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
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
Регистрация: 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 байт, но результат тот же - код не работает...

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

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

ЗЫ Компилил Microsoft Visual Studio 2010 Express
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
17.03.2012, 18:17     Не работает поиск сигнатуры #14
Ну я не знаю, облагородь как-нибудь, уменьши по возможности, дай сюда. Попробую посмотреть. Почему я говорю попробую- я работаю преимущественно в Dev-Cpp, с MSVS (установлена) особо не дружу, но попытаться можно будет.
Битл
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
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
17.03.2012, 21:35     Не работает поиск сигнатуры #16
MSVS 2008, создал пустой проект CLR. там два файла main.cpp и handle_processa.h такого содержания:


main.cpp
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
// ra.ccp
#include <windows.h>
#include <conio.h> 
 
#include <stdio.h>
#include "handle_processa.h"
 
int main ( ) { 
 
 char ima_protcessa [MAX_PATH];
 
 
 //Русский язык
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 //
 
 
 unsigned char sposob_nah_adresov;
 
 
 
 
 
 
 //Первое, что сделааем, это введём имя процесса, который будем перегонять в строку:
 //Ввод имени файла:
 printf ("Вводи имя процесса\n");
 if (!gets_s (ima_protcessa)) {
  printf ("проблема с водом имени процесса\n");
  system ("pause");
  return 0;   
 };       
 
 
 
 long int NacalniAdres;
 printf ("Вводи адрес, с которого надо дампировать\n");
 scanf_s ("%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_s ("%x", &nomer_konechnogo_baita);
  KolichestvoSchitivaemihBait= nomer_konechnogo_baita- NacalniAdres+ 1;
 }
 else {
  printf ("Вводи количество дампируемых байтов\n");
  scanf_s ("%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;
 
 fopen_s (&f_txt, "rez.txt","wb");
 fopen_s (&f,"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;
}

handle_processa.h
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


Там кое что подправил, убрал некоторые понты (типа заголовка окна, с котроым не хотелось возиться).
А что не понравилось- что MSVS выдумывает свои функции и заставляет использовать их вместо стандартных, я говою об fopen_s вместо fopen, scanf_s вместо scanf и прочая. То есть стандартные вроде как использовать не воспрещается, но либо любуйся предупреждениями, либо используй специальный ключ компилятора, чтобы их не видеть. Куда ключ писать тоже вопрос. Короче я забил, позаменял имена функций на предлагшаемые. Компилить: "построить решение"; в общем делай. В общем MSVS факт не для консоли, для консоли Dev-Cpp
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 01:17  [ТС]     Не работает поиск сигнатуры #17
Цитата Сообщение от kravam Посмотреть сообщение
А что не понравилось- что MSVS выдумывает свои функции и заставляет использовать их вместо стандартных, я говою об fopen_s вместо fopen, scanf_s вместо scanf и прочая.
Дык я вот тоже когда смотрел твой код, хоть и опыта мало, но в глаза бросается некоторая маниакальность MSVS.

Цитата Сообщение от kravam Посмотреть сообщение
Компилить: "построить решение"; в общем делай.
Пасиб. Буду пробовать!

Цитата Сообщение от kravam Посмотреть сообщение
В общем MSVS факт не для консоли, для консоли Dev-Cpp
На консоли пока тренируюсь, хочу формы потом научиться строить...

Добавлено через 1 час 19 минут
Вобщем,майкрософт рулит - в 2010 и 2006 оно не собирается... Возможно я косячу, но у знакомого сишника в 2006 тоже не пошло
d:\program files (x86)\microsoft visual studio\myprojects\ttt\main.cpp(28) : error C2065: 'gets_s' : undeclared identifier
d:\program files (x86)\microsoft visual studio\myprojects\ttt\main.cpp(38) : error C2065: 'scanf_s' : undeclared identifier
d:\program files (x86)\microsoft visual studio\myprojects\ttt\main.cpp(88) : error C2065: 'fopen_s' : undeclared identifier
Error executing cl.exe.

ttt.exe - 3 error(s), 0 warning(s)
Прийдеца менять все взад...
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
18.03.2012, 01:49     Не работает поиск сигнатуры #18
Поменяй, если при вызове стандартных функций будет выдавать предупреждения, то там должно быть написано типа "используйте ключ такой-то", его надо куда-то прописать, пропишешь и предупреждения не будут маячить перед глазами; fopen вызывается с другими аргументами нежели fopen_s, вот так:

C++
1
FILE* f= fopen ("имя_фала", "режим_открытия");
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 17:08  [ТС]     Не работает поиск сигнатуры #19
Цитата Сообщение от kravam Посмотреть сообщение
MSVS 2008, создал пустой проект CLR. там два файла main.cpp и handle_processa.h
Большое спасибо тебе за потраченное на меня время. После небольшой обработки кода напильником он все же собрался.
main.cpp

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
//
 
#include "stdafx.h"
#include <windows.h>
#include <conio.h> 
#include <stdio.h>
#include "handle_processa.h"
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
     
 char ima_protcessa [MAX_PATH];
 
 
 //ГђГіГ±Г±ГЄГЁГ© ÿçûê
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 // 
 unsigned char sposob_nah_adresov; 
 //Первое, что сделааем, это введём имя процесса, который будем перегонять в строку:
 //Ввод имени файла:
 printf ("Vvedi imia processa\n");
 if (!gets_s (ima_protcessa)) {
  printf ("Problema s vvodom imeni processa\n");
  system ("pause");
  return 0;   
 };       
 
 
 
 long int NacalniAdres;
 printf ("Vvedi address nachala dampinga \n");
 scanf_s ("%x", &NacalniAdres);
 
  
 printf ("1 - elsi  znaesh razmer, 2- esli znaesh nomer konechogo bayta\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 ("Vvodi nomer konexhnogo bayta\n");
  scanf_s ("%x", &nomer_konechnogo_baita);
  KolichestvoSchitivaemihBait= nomer_konechnogo_baita- NacalniAdres+ 1;
 }
 else {
  printf ("Vvodi kolichestvo dampiruemyh bayt\n");
  scanf_s ("%x", &KolichestvoSchitivaemihBait);
 }
 
 
 
 
 
 int i, j;
 
 //Ищем хэндл процесса
 HANDLE hProcess= HandleProcessa (ima_protcessa);
 if (!hProcess) {
  printf ("henler processa %s ne nayden\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","w");
 f=fopen ("rez","w");
 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;
 } 
 
 
 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;
}

handle_processa.h
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
#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
Но в handle_processa.h видимо есть ошибка (пока не разбирался с ним) и программа тупо выдает
henler processa Timerocketxby.ехе ne nayden
Тогда я пошел другим путем и сделал так:
main.cpp

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
#include <iostream> 
#include <windows.h>
#include <iomanip>
#include <conio.h> 
#include <stdio.h>
using namespace std;
 
 
int main ()
{ ::setlocale(LC_ALL,"");
 
 
    int KolichestvoSchitivaemihBait = 100;
    int NacalniAdres = 0x00F92ABC;
 
    HWND hWnd = FindWindowA(0,"Калькулятор");
 
    if (hWnd == 0) {
        cerr << "Cтартаните калькулятор и перезапустите MEGA4IT v0.1b" << endl;
    }else {
            DWORD pId;
            GetWindowThreadProcessId(hWnd, &pId);
            HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
 
            if (!hProc){
            cerr << "не могу открыть процесс" << endl;
            }else{
 
                cerr << "Калькулятор найден" << endl;
                 /*В эту переменную будет считываться каждый байт, а потом выводиться в файл rez.txt
 Она должня быть именно не сhar, если будет сhar, тогда может вывестись вместо 90 ffffff90
 проверено уже. 
 */
 unsigned char  lpBuffer ;
 
 
 FILE* f_txt;
 FILE* f;
 
 f_txt=fopen ("rez.txt","w");
 f=fopen ("rez","w");
 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;
 } 
 
 int i, j;
 j= 0;
 for (i= 0; i< KolichestvoSchitivaemihBait; i++) {
  ReadProcessMemory (hProc, (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 (hProc);
 fclose (f_txt);
 fclose (f);
 
    system("pause");
 return 0;
 
} 
    }
}

Все отлично отработало!! Получил дамп:
rez.txt
0X8b, 0Xff, 0X55, 0X8b,
0Xec, 0X83, 0Xec, 0X10,
0Xa1, 0X64, 0X40, 0Xfd,
0X00, 0X83, 0X65, 0Xf8,
0X00, 0X83, 0X65, 0Xfc,
0X00, 0X53, 0X57, 0Xbf,
0X4e, 0Xe6, 0X40, 0Xbb,
0Xbb, 0X00, 0X00, 0Xff,
0Xff, 0X3b, 0Xc7, 0X0f,
0X85, 0Xb4, 0Xb4, 0X01,
0X00, 0X56, 0X8d, 0X45,
0Xf8, 0X50, 0Xff, 0X15,
0X88, 0X12, 0Xf8, 0X00,
0X8b, 0X75, 0Xfc, 0X33,
0X75, 0Xf8, 0Xff, 0X15,
0X7c, 0X11, 0Xf8, 0X00,
0X33, 0Xf0, 0Xff, 0X15,
0X64, 0X11, 0Xf8, 0X00,
0X33, 0Xf0, 0Xff, 0X15,
0X60, 0X11, 0Xf8, 0X00,
0X33, 0Xf0, 0X8d, 0X45,
0Xf0, 0X50, 0Xff, 0X15,
0X5c, 0X11, 0Xf8, 0X00,
0X8b, 0X45, 0Xf4, 0X33,
0X45, 0Xf0, 0X33, 0Xf0,

Теперь глупый вопрос.. ))) Ответ еще не искал, так-что пока спрошу.. ))) Я ведь могу дамп скидывать не в тхт, а в массив и в нем искать сигнутуру? Может есть готовый алгоритм, чтоб максимально можно было увеличить скорость поиска?

Я вот тут еще подумал... Я ведь могу дампить память кусками и в них искать? Допустим нашел, как потом оттуда вытянуть адрес сигнатуры?

Добавлено через 7 минут
И я вот все равно как-то не пойму... если я могу делать дамп, то почему я не могу сразу искать в памяти процесса?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 18:04     Не работает поиск сигнатуры
Еще ссылки по теме:

Поиск клада. Не работает 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; программа работает не...


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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
18.03.2012, 18:04     Не работает поиск сигнатуры #20
Цитата Сообщение от Битл Посмотреть сообщение
Я ведь могу дамп скидывать не в тхт, а в массив и в нем искать сигнутуру? Может есть готовый алгоритм, чтоб максимально можно было увеличить скорость поиска?
естессно, существование языка C не настолько неоправдано! И оно правильнеее и быстрее; код не смотрел давно поэтому по памяти напишу:

Ты должен озаботиться созданием массива для дампа, например дамп у тебя 100 байт и среди них ты будешь искать сигнатуру, вот объявляй массив так:
C++
1
char* array= new char [100];
Всё, теперь просто-напросто можешь пихать в этот массив дамп, а можешь и в массив и в файл, как угодно ReadProcessMemory

Четвёртый параметр- количество байт,то есть ты можешь просто одним вызовом все 100 байт считать и теперь они у тебя в массиве; а дельше вобще элементарно, допустим сигнатура
0Xca, 0Xfe, 0Xba,0xBE; ищешь с помощью memchr

C++
1
2
char sign []= {0Xca, 0Xfe, 0Xba,0xBE};
memchr (array, sign, 100);
и всё; сигнатура найдена, посмотри ещё документацию по memchr, вот и всё
Ну там детали надо знать всякие, например память по использованию над освободить
C++
1
delete [] array;
; ещё есть тонкость char или unsigned char использовать (знаковый или беззнаковый тип); ну в общем практикуйся и поймёшь сам.



Цитата Сообщение от Битл Посмотреть сообщение
И я вот все равно как-то не пойму... если я могу делать дамп, то почему я не могу сразу искать в памяти процесса?
да чёрт его знает, навскидку вроде тяжеловато будет, смотри, за поиск в считанном дампе отвечает memchr, это ты должен без считывания если накропать некое подобие memchr, причём всё равно каждый байт ТЫ ОБЯЗАН БУДЕШЬ СЧИТАТЬ, подумай сам- а иначе как ты его распознаешь???. Короче без ReadProcessMemory вряд ли обойдёшся; то есь какой-то промежеточный буфер- файл ли, массив ли всё равно должен быть. Думай, короче.
Yandex
Объявления
18.03.2012, 18:04     Не работает поиск сигнатуры
Ответ Создать тему
Опции темы

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