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

Нашинковать файл по сигнатурам - C++

Восстановить пароль Регистрация
 
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 17:07     Нашинковать файл по сигнатурам #1
Добрый вечер уважаемые Участники.
Помогите написать маленькую тулзу.
Задача:
Есть некий файл, с некоим содержимым. В файле имеются сигнатуры "RIP"
Нужно порезать файл по этим сигнатурам, сейчас объясню.
Допустим вот файл. Скрин с WinHex-а:
[IMG]http://i47.***********/thumb/2013/0623/2e/2dc73432b9d5d68bf3476bedf6f2b02e.jpeg[/IMG]
Порезать файл на куски, идём по файлу, если находим RIP, то ищем следующий RIP - что бы узнать докуда кусок, и обрезаем первый кусок до следующего RIP, со следующим так же. Если остался 1 RIP, то значит отрезать целиком, т.е конец файла..
Нумеровать куски можно хоть как... хоть счетчиком.. 1,2,3...
Т.е в итоге получится 3 файла из моего примера:
[IMG]http://i46.***********/thumb/2013/0623/8e/177173b44cdddcd1571cd102f8e0148e.jpeg[/IMG]
Надеюсь понятно объяснила.
Если кто напишет, просьба выложить сорец, что бы я смогла изменить значения.
Компилировать буду MinGW-ом, линковать crinkler-ом
В общем спасибо всем кто отзовётся и поможет мне.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2013, 17:07     Нашинковать файл по сигнатурам
Посмотрите здесь:

Дан файл целых чисел. Создать новый файл, содержащий те же элементы, что и исходный файл, но в обратном порядке C++
C++ Дан файл. Записать в другой файл строки, которые являются палиндромами.
C++ Дан символьный файл f. Записать в файл g элементы файла f в обратном порядке
C++ Скопировать текстовый файл в новый файл, заменив в каждой строке слова «ok» на «*»
Дан символьный файл f. Записать в файл g компоненты файла f в обратном порядке C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
23.06.2013, 18:29     Нашинковать файл по сигнатурам #2
Скиньте этот файл, который на скрине.
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 19:08  [ТС]     Нашинковать файл по сигнатурам #3
Цитата Сообщение от Olivеr Посмотреть сообщение
Скиньте этот файл, который на скрине.
Забыла уточнить, входной фал 1.6гб
Вложения
Тип файла: zip test1.zip (569 байт, 2 просмотров)
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
23.06.2013, 19:17     Нашинковать файл по сигнатурам #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
#pragma warning (disable: 4100)     // 'dwFoundAt' : unreferenced formal parameter
static void Finder
(
   void*             pParam,
   DWORD             dwFoundAt
)
{
   *(BYTE*)pParam |= 0xFF;
 
   dwOfsArr[iCnt++] = dwFoundAt;
}
 
int main(int argc,char** argv)
{
   if (argc != 2)
   {
      ShowHelp();
      return 0;
   }
 
   // Open eBook File
   MMF      eBook;
 
   if (!eBook.OpenReadOnly(argv[1]))
   {
      // Error !
      return -1;
   }
 
   // Do Actual Work
   const DWORD    dwPKZipSigz = 0x04034B50;
 
   bool     bFound = false;
 
   QuickSearch((BYTE*)&dwPKZipSigz,sizeof(DWORD),eBook.Buffer(),eBook.Size() - sizeof(dwPKZipSigz),&bFound,Finder);
 
   // Append false last entry
   dwOfsArr[iCnt++] = eBook.Size();
 
   char     pszZip      [_MAX_DRIVE];
   char     pszDrive    [_MAX_DRIVE];
   char     pszDir      [_MAX_DIR];
   char     pszFName    [_MAX_FNAME];
   char     pszExt      [_MAX_EXT];
 
   _splitpath(argv[1],pszDrive,pszDir,pszFName,pszExt);
 
   for (int ii = 0; ii < (iCnt - 1); ++ii)
   {
      char     pszTemp[MAX_PATH];
 
      wsprintf(pszTemp,"%s_%03d",pszFName,ii + 1);
      _makepath(pszZip,pszDrive,pszDir,pszTemp,"ZIP");
 
      HANDLE      hFile = CreateFile(pszZip);
 
      if (hFile == INVALID_HANDLE_VALUE)
      {
         // Error !
         continue;
      }
 
      if (!WriteBuffer(hFile,eBook.Buffer() + dwOfsArr[ii],dwOfsArr[ii + 1] - dwOfsArr[ii]))
      {
         // Error !
         CloseHandle(hFile);
         hFile = INVALID_HANDLE_VALUE;
         continue;
      }
 
      CloseHandle(hFile);
      hFile = INVALID_HANDLE_VALUE;
   }  
 
   // Cleanup
   eBook.Close();
 
   return 0;
}
Я это использовал для декомпиляции e-books.
Вложения
Тип файла: rar search_quick.rar (1.9 Кб, 5 просмотров)
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 19:24  [ТС]     Нашинковать файл по сигнатурам #5
Не поняла насчет сигнатур
И при компиляции просит еще файлы:
search_quick.cpp:18:20: fatal error: stdafx.h: No such file or directory
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
23.06.2013, 19:44     Нашинковать файл по сигнатурам #6
Цитата Сообщение от xinix Посмотреть сообщение
stdafx.h
это микрософская приблуда , убери её .
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 19:51  [ТС]     Нашинковать файл по сигнатурам #7
Цитата Сообщение от Игорь с++ Посмотреть сообщение
это микрософская приблуда , убери её .
Убрала, но там еще есть #include "search_quick.h"
Если удалить эти строки...
search_quick.cpp:56:10: error: 'BYTE' does not name a type
search_quick.cpp:56:25: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.cpp: In function 'void PreQS(const int*, int, int*)':
search_quick.cpp:66:9: error: name lookup of 'ii' changed for ISO 'for' scoping [-fpermissive]
search_quick.cpp:66:9: note: (if you use '-fpermissive' G++ will accept your code)
search_quick.cpp: At global scope:
search_quick.cpp:83:10: error: 'BYTE' does not name a type
search_quick.cpp:83:25: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.cpp: In function 'void PreIQS(const int*, int, int*)':
search_quick.cpp:93:9: error: name lookup of 'ii' changed for ISO 'for' scoping [-fpermissive]
search_quick.cpp:95:34: error: 'toupper' was not declared in this scope
search_quick.cpp:96:34: error: 'tolower' was not declared in this scope
search_quick.cpp: At global scope:
search_quick.cpp:111:10: error: 'BYTE' does not name a type
search_quick.cpp:111:25: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.cpp:113:10: error: 'BYTE' does not name a type
search_quick.cpp:113:25: error: ISO C++ forbids declaration of 'pText' with no type [-fpermissive]
search_quick.cpp:116:37: error: 'DWORD' has not been declared
search_quick.cpp: In function 'void QuickSearch(const int*, int, const int*, int, void*, void (*)(void*, int))':
search_quick.cpp:129:55: error: 'memcmp' was not declared in this scope
search_quick.cpp: At global scope:
search_quick.cpp:149:10: error: 'BYTE' does not name a type
search_quick.cpp:149:25: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.cpp:151:10: error: 'BYTE' does not name a type
search_quick.cpp:151:25: error: ISO C++ forbids declaration of 'pText' with no type [-fpermissive]
search_quick.cpp:154:37: error: 'DWORD' has not been declared
search_quick.cpp: In function 'void QuickISearch(const int*, int, const int*, int, void*, void (*)(void*, int))':
search_quick.cpp:167:57: error: '_memicmp' was not declared in this scope
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
23.06.2013, 19:53     Нашинковать файл по сигнатурам #8
Цитата Сообщение от xinix Посмотреть сообщение
#include "search_quick.h"
этот хедер как раз не надо убирать .
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 19:56  [ТС]     Нашинковать файл по сигнатурам #9
Цитата Сообщение от Игорь с++ Посмотреть сообщение
этот хедер как раз не надо убирать .
Я просто не поняла где его взять?
Если не убрать, будет как и в первом случае:
search_quick.cpp(19) : fatal error C1083: Cannot open include file: 'search_quick.h': No such file or directory
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
23.06.2013, 20:03     Нашинковать файл по сигнатурам #10
Ну всё правельно , хочет хедера , которого вам не дали.
gazlan
2855 / 1803 / 271
Регистрация: 27.08.2010
Сообщений: 4,883
Записей в блоге: 1
23.06.2013, 20:30     Нашинковать файл по сигнатурам #11
Угу. Забыл.
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
/* ******************************************************************** **
** @@ Quick Search Header File
** @ Copyrt : [email]Chistian.Charras@dir.univ-rouen.fr[/email]
** @ Author : [email]Chistian.Charras@dir.univ-rouen.fr[/email]
** @ Modify : 
** @ Update : 22 Jan 2004
** @ Notes  : [url]http://www-igm.univ-mlv.fr/~lecroq/string/node19.html[/url]
** ******************************************************************** */
 
#ifndef _QSEARCH_HPP_
#define _QSEARCH_HPP_
 
#if _MSC_VER > 1000
#pragma once
#endif
 
/* ******************************************************************** **
** @@ internal defines
** ******************************************************************** */
 
typedef void (*QS_Callback)(void* pParam,DWORD dwFoundAt);
 
/* ******************************************************************** **
** @@ internal prototypes
** ******************************************************************** */
 
/* ******************************************************************** **
** @@ external global variables
** ******************************************************************** */
 
/* ******************************************************************** **
** @@ static global variables
** ******************************************************************** */
 
/* ******************************************************************** **
** @@ Global Function Prototypes
** ******************************************************************** */
 
void QuickSearch (const BYTE* const pPattern,int iPatternSize,const BYTE* const pText,int iTextSize,void* pParam,void (*QS_Callback)(void* pParam,DWORD dwFoundAt));
void QuickISearch(const BYTE* const pPattern,int iPatternSize,const BYTE* const pText,int iTextSize,void* pParam,void (*QS_Callback)(void* pParam,DWORD dwFoundAt));
 
#endif
 
/* ******************************************************************** **
** End of File
** ******************************************************************** */
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 20:35  [ТС]     Нашинковать файл по сигнатурам #12
In file included from search_quick.cpp:19:0:
search_quick.h:21:42: error: 'DWORD' has not been declared
search_quick.h:39:25: error: 'BYTE' does not name a type
search_quick.h:39:37: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.h:39:69: error: 'BYTE' does not name a type
search_quick.h:39:81: error: ISO C++ forbids declaration of 'pText' with no type [-fpermissive]
In file included from search_quick.cpp:19:0:
search_quick.h:39:147: error: 'DWORD' has not been declared
search_quick.h:40:25: error: 'BYTE' does not name a type
search_quick.h:40:37: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.h:40:69: error: 'BYTE' does not name a type
search_quick.h:40:81: error: ISO C++ forbids declaration of 'pText' with no type [-fpermissive]
search_quick.h:40:147: error: 'DWORD' has not been declared
search_quick.cpp:56:10: error: 'BYTE' does not name a type
search_quick.cpp:56:25: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.cpp: In function 'void PreQS(const int*, int, int*)':
search_quick.cpp:66:9: error: name lookup of 'ii' changed for ISO 'for' scoping [-fpermissive]
search_quick.cpp:66:9: note: (if you use '-fpermissive' G++ will accept your code)
search_quick.cpp: At global scope:
search_quick.cpp:83:10: error: 'BYTE' does not name a type
search_quick.cpp:83:25: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.cpp: In function 'void PreIQS(const int*, int, int*)':
search_quick.cpp:93:9: error: name lookup of 'ii' changed for ISO 'for' scoping [-fpermissive]
search_quick.cpp:95:34: error: 'toupper' was not declared in this scope
search_quick.cpp:96:34: error: 'tolower' was not declared in this scope
search_quick.cpp: At global scope:
search_quick.cpp:111:10: error: 'BYTE' does not name a type
search_quick.cpp:111:25: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.cpp:113:10: error: 'BYTE' does not name a type
search_quick.cpp:113:25: error: ISO C++ forbids declaration of 'pText' with no type [-fpermissive]
search_quick.cpp:116:37: error: 'DWORD' has not been declared
search_quick.cpp: In function 'void QuickSearch(const int*, int, const int*, int, void*, void (*)(void*, int))':
search_quick.cpp:129:55: error: 'memcmp' was not declared in this scope
search_quick.cpp: At global scope:
search_quick.cpp:149:10: error: 'BYTE' does not name a type
search_quick.cpp:149:25: error: ISO C++ forbids declaration of 'pPattern' with no type [-fpermissive]
search_quick.cpp:151:10: error: 'BYTE' does not name a type
search_quick.cpp:151:25: error: ISO C++ forbids declaration of 'pText' with no type [-fpermissive]
search_quick.cpp:154:37: error: 'DWORD' has not been declared
search_quick.cpp: In function 'void QuickISearch(const int*, int, const int*, int, void*, void (*)(void*, int))':
search_quick.cpp:167:57: error: '_memicmp' was not declared in this scope
Теперь так.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
23.06.2013, 20:44     Нашинковать файл по сигнатурам #13
@xinix, проверяйте
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
#include <iostream>
#include <fstream>
#include <string> //to_string
 
using namespace std;
 
int main()
{
    ifstream file("test1.dat", ios::binary);
    ofstream out;
 
    int counter = 1;
    char a, b, c;
 
    if (!file.good()) return 1;
 
    noskipws(file);
 
    while ( file.good() ) {
 
        while ( file >> a && a != 'R' )
            out << a;
 
        if ( file >> b >> c && b == 'I' && c == 'P' ) {
            out.close();
            out.open( to_string(counter) + ".dat", ios::binary );
            ++counter;
            out << a << b << c;
        } else {
            file.unget();
            file.unget();
        }
    }
 
    out.close();
    return 0;
}
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 20:49  [ТС]     Нашинковать файл по сигнатурам #14
C:\MinGW32\bin>g++.exe -DNOASM stf.cpp
stf.cpp: In function 'int main()':
stf.cpp:26:40: error: 'to_string' was not declared in this scope
Olivеr
Маленькая ошибка, может я не так компилирую?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
23.06.2013, 20:53     Нашинковать файл по сигнатурам #15
@xinix, к опциям еще
C++
1
-std=c++11
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 20:56  [ТС]     Нашинковать файл по сигнатурам #16
Цитата Сообщение от Olivеr Посмотреть сообщение
@xinix, к опциям еще
C++
1
-std=c++11
cc1plus.exe: error: unrecognized command line option '-std=c++11'
Такс, пошла мингв обновлять - если дело в нём.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
23.06.2013, 21:00     Нашинковать файл по сигнатурам #17
Цитата Сообщение от xinix Посмотреть сообщение
cc1plus.exe: error: unrecognized command line option '-std=c++11'
Тогда так
C++
1
2
#include <cstdlib>
#include <cstring>
C++
1
2
3
4
5
6
7
8
9
10
11
12
        if ( file >> b >> c && b == 'I' && c == 'P' ) {
            out.close();
            char s[10] = {0};
            itoa(counter, s, 10);
            strcat(s, ".dat");
            out.open( s, ios::binary );
            ++counter;
            out << a << b << c;
        } else {
            file.unget();
            file.unget();
        }
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 21:06  [ТС]     Нашинковать файл по сигнатурам #18
Так?
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
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
 
using namespace std;
 
int main()
{
    ifstream file("test1.dat", ios::binary);
    ofstream out;
 
    int counter = 1;
    char a, b, c;
 
    if (!file.good()) return 1;
 
    noskipws(file);
 
    while ( file.good() ) {
 
        while ( file >> a && a != 'R' )
            out << a;
 
        if ( file >> b >> c && b == 'I' && c == 'P' ) {
            out.close();
            char s[10] = {0};
            itoa(counter, s, 10);
            strcat(s, ".dat");
            out.open( s, ios::binary );
            ++counter;
            out << a << b << c;
        } else {
            file.unget();
            file.unget();
        }
 
    out.close();
    return 0;
}
Так тоже выдаёт:
C:\MinGW32\bin>g++.exe -DNOASM stf.cpp
stf.cpp: In function 'int main()':
stf.cpp:40:1: error: expected '}' at end of input
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
23.06.2013, 21:07     Нашинковать файл по сигнатурам #19
Скобочку } перед
C++
1
2
3
    out.close();
    return 0;
}
пропустили
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2013, 21:43     Нашинковать файл по сигнатурам
Еще ссылки по теме:

Даны натуральное , символьный файл и текстовый файл . Файл содержит 30 слов , каждое из которых будем называть ключевым C++
Дан целочисленный файл А. Записать в файл В все кратные трём числа из А C++
C++ Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов

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

Или воспользуйтесь поиском по форуму:
xinix
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 35
23.06.2013, 21:43  [ТС]     Нашинковать файл по сигнатурам #20
Цитата Сообщение от Olivеr Посмотреть сообщение
Скобочку } перед
C++
1
2
3
    out.close();
    return 0;
}
пропустили
Ой, точно. Спасибо, скомпилировалось - сейчас буду тестить!

Добавлено через 27 минут
Olivеr спасибо!
Работает как часы! Спасибо!
Yandex
Объявления
23.06.2013, 21:43     Нашинковать файл по сигнатурам
Ответ Создать тему
Опции темы

Текущее время: 11:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru