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

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

16.03.2012, 21:03. Показов 7304. Ответов 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
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
17.03.2012, 03:35
Всё найдётся; но для затравки один вопрос- ты не ошибся, написав:
C++
1
cout << "Значение MyAddress = " << MyAddress << endl;
Я к тому, что даже если прога отработает правильно, выведется десятеричное
представление MyAddress
0
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 12:10  [ТС]
Цитата Сообщение от 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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
17.03.2012, 14:03
Есть предположения; пока высказывать не буду, скинь мне прогу Timerocketxb
0
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 14:23  [ТС]
Есть предположения; пока высказывать не буду, скинь мне прогу Timerocketxb
Да вот тоже думаю, что возможно нужно заюзать ReadProcessMemory.

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

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

Добавлено через 11 минут
Пока же предварительный ответ такой: ты сканируешь адреса, которых просто нет. Я щас запустил твою программу и приаттачился к ней отладчиком, наблюдаю такую картину: (адрес участка памяти и размер)
Bash
1
2
98f000 1000
77b30000 1000
Ну там много подобных участков, но адрес который ты сканируешь- его просто нет, как видишь.
Но! Возможно этот адрес появляется в ПРОЦЕССЕ работы программы, я не знаю. Вообще откуда ты взял этот адрес?
2
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 15:24  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Вообще откуда ты взял этот адрес?
Я атачусь в процессу при помощи СЕ, ищу сигнатуру (89 BE 0A 02 00 00 E9 87 00 00 00 83 E8 00 74 12 - эта есть постоянно). Смотрю ее адрес и относительно его задаю интервал сканирования. В идеале нужно просмотреть все пространство адресов, но пока, чтоб убедится в работоспособности кода я делаю так. Можно просто поискать что-то типа одного бита, но мой код пока не работает...
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
17.03.2012, 15:45
Интересно, а почему я не могу найти такой сигнатуры 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  [ТС]
Цитата Сообщение от 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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
17.03.2012, 16:41
Так он и скомпилится работать не будет; какой компилятор вообще это хавает? Теперь по ошибкам:
C++
1
((*szMask) == NULL);
неправильно Ну и прочая. Я бы исправил чтобы компильнулось, но я логику программы понять не могу. Поэтому совет: возьми. чё я тебе скинул, просто и элементарно дампируй нужный участок, который тебе нужен, а потом просто найди (или не найди) нужную сигнатуру, например с помощью функции memchr. Как говорится, простенько и со вкусом.
1
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 18:00  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
Я бы исправил чтобы компильнулось, но я логику программы понять не могу.
Функцию поиска паттерна взял тут
Цитата Сообщение от kravam Посмотреть сообщение
Поэтому совет: возьми. чё я тебе скинул, просто и элементарно дампируй нужный участок, который тебе нужен, а потом просто найди (или не найди) нужную сигнатуру, например с помощью функции memchr. Как говорится, простенько и со вкусом.
Попробую так... Так я думаю даже правильнее будет... Но теперь придется разобраться с тем что ты скинул.. )))

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

ЗЫ Компилил Microsoft Visual Studio 2010 Express
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
17.03.2012, 18:17
Ну я не знаю, облагородь как-нибудь, уменьши по возможности, дай сюда. Попробую посмотреть. Почему я говорю попробую- я работаю преимущественно в Dev-Cpp, с MSVS (установлена) особо не дружу, но попытаться можно будет.
0
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
17.03.2012, 19:10  [ТС]
Я сам только обратился к плюсам, но как я понимаю 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
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
17.03.2012, 21:35
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
1
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 01: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)
Прийдеца менять все взад...
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.03.2012, 01:49
Поменяй, если при вызове стандартных функций будет выдавать предупреждения, то там должно быть написано типа "используйте ключ такой-то", его надо куда-то прописать, пропишешь и предупреждения не будут маячить перед глазами; fopen вызывается с другими аргументами нежели fopen_s, вот так:

C++
1
FILE* f= fopen ("имя_фала", "режим_открытия");
0
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 17:08  [ТС]
Цитата Сообщение от 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 минут
И я вот все равно как-то не пойму... если я могу делать дамп, то почему я не могу сразу искать в памяти процесса?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.03.2012, 18:04
Цитата Сообщение от Битл Посмотреть сообщение
Я ведь могу дамп скидывать не в тхт, а в массив и в нем искать сигнутуру? Может есть готовый алгоритм, чтоб максимально можно было увеличить скорость поиска?
естессно, существование языка 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 вряд ли обойдёшся; то есь какой-то промежеточный буфер- файл ли, массив ли всё равно должен быть. Думай, короче.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2012, 18:04
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru