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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Почему выдает ошибку в строке "for(Data::iterator p=stats.begin(); p!=stats.end(); ++p)" http://www.cyberforum.ru/cpp-beginners/thread520457.html
"Read a sequence of possibly whitespaceseparated (name,value) pairs, where the name is a single whitespaceseparated word and the value is an integer or a floatingpoint value. Compute and print the sum and mean for each name and the sum and mean for all names." Нашел решебник, там решение))) #include <iostream> #include <map> #include <string> struct Stat {
C++ Можете скомпилировать и сказать работает ли? Не хочу качать компилятор для 4-5 заданий, точнее занимали бы они меньше места как, например, Dev-CPP для С. Можете скомпилировать данный код и сказать работает он вообще или нет? Если нет то какие сообщения выдает. #include <iostream.h> #include <string.h> #include <cstring.h> #include <conio.h> class OverflowException { public: OverflowException() { http://www.cyberforum.ru/cpp-beginners/thread520443.html
Написать программу удаления букв «б» из введенного слова C++
Написать программу удаления букв «б» из введенного слова
C++ Найти наибольшую клику в заданном орграфе, используя алгоритм нахождения независимых множеств
Клика – полный подграф неориентированного графа. Другими словами, клика графа есть подмножество его вершин, такое, что между каждой парой вершин этого подмножества существует ребро и, кроме того, это подмножество не принадлежит никакому большому подмножеству с тем же свойством. Подграф графа — граф, содержащий некое подмножество вершин данного графа и некое подмножество инцидентных им рёбер. ...
C++ не компилируется http://www.cyberforum.ru/cpp-beginners/thread520424.html
Вот кусок кода class Game; class View { private: static int left;
C++ Компилятор выдает ошибку при объявлении массива. Не могу понять где соль Объясните пожалуйста в чем моя ошибка. Вот исходник #include <iostream> // cin, cout,endl #include <math.h> // Мат функции #include <iomanip> // формат вывода using namespace std; const int n=2; //Кол-во строк const int m=7; //Кол-во столбцов подробнее

Показать сообщение отдельно
Битл
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 минут
И я вот все равно как-то не пойму... если я могу делать дамп, то почему я не могу сразу искать в памяти процесса?
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru