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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
#1

Отображение файла в память, поиск и замена последовательности байт - C++

23.06.2014, 13:38. Просмотров 1311. Ответов 11
Метки нет (Все метки)

В общем, задача такая: спроецировать файл в память, найти последовательность байт, заменить её и записать изменения в файл.
Вот, что я сам попробовал нацарапать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int _tmain(int argc, _TCHAR* argv[])
{
  HANDLE hFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, "file.txt");
  char* p=(char*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
            if(0!=p)
            {
                CloseHandle(hFileMap);
                //find&replace
                while(strncmp(p,"70726F",6))p++;
                memcpy(p,"123456",6);
                return 0;
            }
    return 0;
}
Программа вроде бы компилируется и выполняется, но файл не изменяется. При попытке вывести содержимое файла
C++
1
 cout << p ;
программа крашится.
Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2014, 13:38     Отображение файла в память, поиск и замена последовательности байт
Посмотрите здесь:
C++ Отображение файла в оперативную память
C++ Отображение файла в память MMF
C++ Поиск последовательности символов и ее замена на другую
Поиск и замена файла C++
C++ Указатели: выделить память размером n байт
Нужно выделить всю доступную процессу память блоками по 13 байт C++
Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SuperHero
Заблокирован
23.06.2014, 13:58     Отображение файла в память, поиск и замена последовательности байт #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от mihalech19 Посмотреть сообщение
программа крашится.
ну ты же закрываешь мап файл перед его использованием, начала сделай с ним всё что надо - потом закрывай.
Цитата Сообщение от mihalech19 Посмотреть сообщение
CloseHandle(hFileMap);

Цитата Сообщение от mihalech19 Посмотреть сообщение
while(strncmp(p,"70726F",6))p++;
* * * * * * * * memcpy(p,"123456",6);
а это ваще сущий бред
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 14:13  [ТС]     Отображение файла в память, поиск и замена последовательности байт #3
Допустим... Как тогда лучше реализовать поиск ?

Добавлено через 9 минут
Неужели никто не поможет?
Ilot
Модератор
Эксперт С++
1788 / 1163 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
23.06.2014, 14:27     Отображение файла в память, поиск и замена последовательности байт #4
Примерчик:
Кликните здесь для просмотра всего текста
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
#include <windows.h>
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
  int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  char file_name [ ] = "Demo.txt" ;
  HANDLE hFile, hMapping; // дескрипторы файла и объекта отображения
  int *ptr; // для указателя на массив
  // открываем файл для вывода
  ofstream out(file_name, ios::out | ios::binary);
  if (!out)
  {
    cerr << "File constructor failed." << endl;
    return 0;
  }
  // выводим исходный массив в файл и на консоль
  cout << "Initial array: ";
  for (int i = 0; i < 10; ++i)
  {
    out.write((char*)&a[i], sizeof(int));
    cout << a[i] << ' ' ;
  }
  cout << endl;
  // закрываем выходной файл
  out.close();
  //
  // открываем файл для отображения в память
  hFile = CreateFile(file_name, GENERIC_READ | GENERIC_WRITE,
                    0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if (hFile == INVALID_HANDLE_VALUE)
  {
    cerr << "Create file failed." << endl;
    return GetLastError();
  }
  // открываем объект, отображающий файл в память
  hMapping = CreateFileMapping(
                                hFile, // дескриптор открытого файла
                                NULL, // атрибуты защиты по умолчанию
                                PAGE_READWRITE, // режим доступа
                                0, 0, // размер объекта отображения равен размеру файла
                                NULL); // имя не используем
  if (!hMapping)
  {
    cerr << "Create file mapping failed." << endl;
    return GetLastError();
  }
  // создаем вид файла
  ptr = (int*)MapViewOfFile(
                            hMapping, // дескриптор объекта отображения
                            FILE_MAP_WRITE, // режим доступа к виду
                            0, 0, // отображаем файл с начала
                            0); // отображаем весь файл
  // изменяем значения элементов массива
  for (int i = 0; i < 10; ++i)
    ptr[i] += 10;
  // отменяем отображение файла в память
  if (!UnmapViewOfFile(ptr))
  {
    cerr << "Unmap view of file failed." << endl;
    return GetLastError();
  }
  // закрываем объект отображения файла в память
  if (!CloseHandle(hMapping))
  {
    cerr << "Close file failed." << endl;
    return GetLastError();
  }
  // закрываем файл
  if (!CloseHandle(hFile))
  {
    cerr << "Close file failed." << endl;
    return GetLastError();
  }
  //
  // открываем файл для ввода
  ifstream in(file_name, ios::in | ios::binary);
  if (!in)
  {
    cerr << "File constructor failed." << endl;
    return 0;
  }
  // вводим финальный массив из файла и выводим на консоль
  cout << "Final array: ";
  for (int i = 0; i < 10; ++i)
  {
    in.read((char*)&a[i], sizeof(int));
    cout << a[i] << ' ';
  }
  cout << endl;
  // закрываем входной файл
  in.close();
  return 0;
}

Стянуто у Побегайло.
SuperHero
Заблокирован
23.06.2014, 14:52     Отображение файла в память, поиск и замена последовательности байт #5
Цитата Сообщение от mihalech19 Посмотреть сообщение
Неужели никто не поможет?
а тебе именно программно надо сделать? Так то есть CheatEngine
Цитата Сообщение от mihalech19 Посмотреть сообщение
Как тогда лучше реализовать поиск ?
ну как как, читаешь по указателю первый байт и сравниваешь с первым в заданной последовательности, потом второй... и тд, если вся последовательность совпала - гуд
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 15:06  [ТС]     Отображение файла в память, поиск и замена последовательности байт #6
Тогда такой вопрос: как осуществить чтение сразу из памяти ? Может функция какая есть ?
SuperHero
Заблокирован
23.06.2014, 17:10     Отображение файла в память, поиск и замена последовательности байт #7
Цитата Сообщение от mihalech19 Посмотреть сообщение
как осуществить чтение сразу из памяти ?
что значит как? Берёшь и читаешь? Из какой памяти то? :-)
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 17:39  [ТС]     Отображение файла в память, поиск и замена последовательности байт #8
Да, я тупой) Вот я спроецировал файл в память, и как мне прочитать его?)
SuperHero
Заблокирован
23.06.2014, 20:30     Отображение файла в память, поиск и замена последовательности байт #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ты лучше озвучь исходную задачу, что тебе конкретно надо сделать, какие исходные данные ?
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 21:04  [ТС]     Отображение файла в память, поиск и замена последовательности байт #10
Та я уже разобрался. Не могу понять теперь, как сохранить изменения в файле(.
SuperHero
Заблокирован
25.06.2014, 11:03     Отображение файла в память, поиск и замена последовательности байт #11
Цитата Сообщение от mihalech19 Посмотреть сообщение
Не могу понять теперь, как сохранить изменения в файле
какие изменения? В какой файл? В файл на HDD? А что ты пытаешься туда сохранить? В каком виде твои данные?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 18:56     Отображение файла в память, поиск и замена последовательности байт
Еще ссылки по теме:
C++ Проверка расположения последовательности байт числа в памяти
C++ Поиск в массиве байт
Поиск в последовательно поступающих блоках по 8 байт C++
Поиск максимальной последовательности в другой последовательности C++
C++ Cчитывание из файла блоками по 8 байт

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

Или воспользуйтесь поиском по форуму:
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
25.06.2014, 18:56  [ТС]     Отображение файла в память, поиск и замена последовательности байт #12
Я уже разобрался
Yandex
Объявления
25.06.2014, 18:56     Отображение файла в память, поиск и замена последовательности байт
Ответ Создать тему
Опции темы

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