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

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

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

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

16.03.2012, 21:03. Просмотров 3183. Ответов 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
быдлокодер
1701 / 888 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
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
1
Битл
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)
Прийдеца менять все взад...
0
kravam
быдлокодер
1701 / 888 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
18.03.2012, 01:49 #18
Поменяй, если при вызове стандартных функций будет выдавать предупреждения, то там должно быть написано типа "используйте ключ такой-то", его надо куда-то прописать, пропишешь и предупреждения не будут маячить перед глазами; fopen вызывается с другими аргументами нежели fopen_s, вот так:

C++
1
FILE* f= fopen ("имя_фала", "режим_открытия");
0
Битл
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 минут
И я вот все равно как-то не пойму... если я могу делать дамп, то почему я не могу сразу искать в памяти процесса?
0
kravam
быдлокодер
1701 / 888 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
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 вряд ли обойдёшся; то есь какой-то промежеточный буфер- файл ли, массив ли всё равно должен быть. Думай, короче.
0
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 20:37  [ТС] #21
Цитата Сообщение от kravam Посмотреть сообщение
да чёрт его знает, навскидку вроде тяжеловато будет, смотри, за поиск в считанном дампе отвечает memchr, это ты должен без считывания если накропать некое подобие memchr, причём всё равно каждый байт ТЫ ОБЯЗАН БУДЕШЬ СЧИТАТЬ, подумай сам- а иначе как ты его распознаешь???. Короче без ReadProcessMemory вряд ли обойдёшся; то есь какой-то промежеточный буфер- файл ли, массив ли всё равно должен быть. Думай, короче.
Ок, спасибо, буду раскуривать...
Но по идее поиск сигнатуры организован этой функцией
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask)
{
        for(;*szMask;++szMask,++pData,++bMask)
                if(*szMask=='x' && *pData!=*bMask )
                        return false;
        return (*szMask) == NULL;
}
 
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen, BYTE *bMask, char * szMask) {
        for(DWORD i=0;i<dwLen;i++)
                if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) )
                        return (DWORD)(dwAddress+i);
        return NULL;
}
Это как раз наверное и есть подобие memchr. Просто выделяется не массив, а пространство сканируемых адресов... Раскрутить логику этой функции мешает недостаток знаний в плюсах и жена... Попробую раскрутить и по возможности улучшить... Сейчас функция отрабатывает, но что-то там затык с маской..
Хотя, эта функция без ReadProcessMemory работать не сможет наверно? Т.е. нужно сначала считать память, а потом искать...
0
kravam
быдлокодер
1701 / 888 / 45
Регистрация: 04.06.2008
Сообщений: 5,498
18.03.2012, 21:22 #22
При всём том, нокакое-никакое дампирование адресного пространства сторонего процесса должно происходить, а его нет (ReadProcessMemory или чё-нибудь ещё)! Твой код из первого поста- обращаю внимание на одну деталь- ты находишь хэндл процесса- правильно нет, не знаю
hProc
Но в дальнейшем ты его нигде не используешь! Ты только проверяешь его на истинность и вызываешь
C++
1
MyAddress = dwFindPattern(start, dwLen, (BYTE*)"\x89\xBE\x0A\x02\x00\x00\xE9\x87\x00\x00\x00\x83\xE8\x00\x74\x12", "xxxxxxxxxxxxxxxx"); //ищем адрес по маске
И думаешь, что ищешь адрес в СТОРОННЕМ процессе! Вообще НИКАК не обратившись к его памяти Разве может такое быть? Поэтому так, навскидку, максимум, чего можно добиться идя таким путём, это найти (или не найти) сигнатуру в ТЕКУЩЕМ процессе. Кстати, очень может быть, что dwFindPattern как и bDataCompare именно для этого и предназначены- сканировать текущий процесс; я в английском не силён но сходил по ссылке ещё раз и нигде не обнаружил, что сканируется именно сторонний процесс.
1
Битл
0 / 0 / 0
Регистрация: 08.03.2012
Сообщений: 65
18.03.2012, 22:10  [ТС] #23
Цитата Сообщение от kravam Посмотреть сообщение
И думаешь, что ищешь адрес в СТОРОННЕМ процессе! Вообще НИКАК не обратившись к его памяти Разве может такое быть?
Вот жешь я нубище!!! Спасибо что глянул код, а то бы я еще долго тупил. Кста, ты единственный из всех к кому я обращался заметил этот МАЛЕНЬКИЙ нюанс... Т.е. остальные код даже не смотрели... (( Ну, ниче, теперь я знаю что исправлять... А та функция на подобии memchr, но она дает возможность осуществлять поиск по маске... У memchr такой возможности как я понимаю нет. Т.е. отыскать сигнатуру внутри которой некоторые значения меняются динамически memchr не сможет. Так?

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

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

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

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

Паттерн: \x89\xBE\x0A\x02\x00\x00\xE9\x87\x00\x00\x00\x83\xE8\x00\x74\x12
Маска: "xxx0000x0000xxxx"
0
18.03.2012, 22:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.03.2012, 22:59
Привет! Вот еще темы с ответами:

Поиск не работает - 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...


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

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

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