ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #34  
Старый 11.05.2010, 06:13
Аватар для greki_hoy
greki_hoy
Познающий
Регистрация: 04.03.2010
Сообщений: 32
Провел на форуме:
32525

Репутация: 23
По умолчанию

не то что бы полезная программа скорее сырье для изучения регулярных выражений
тем кто хочет поигратся с регулярными выражениями в ANSI С для компияции надо добавить библиотеку импорта glib.lib скачать версию для венды ну и поставить флаг компилировать как Си код без плюсов
пользоватся просто вводим регулярное выражение диск на котором искать файлы
перебирает все файлы на диске мапит и скармливает их глибовскому регекспу и выводит файлы
в которых найдено совпадение например найти файлы в которых есть мыльники [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4} или файлы с адресами проксей [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,4} да или просто найти в каких файлах хранится твой пароль gj#@$hjkhkjh кому интересно велком http://www.regular-expressions.info/ работает довольно быстро так как файл мапится и тут же идет на парсинг в GRegex вообщем кто хочет изучить регекспы и пользоватся ими в ANSI C зе бест
да и к тому же часто помниш слово а найти файл не можеш виндовый поиск иногда в упор не находит строку в файле хотя она там есть это только у меня так ?

кому интересно зачем g_regex_match (regex, string, 0, &match_info); в SEH фрейм включено скажу дело в том чтоб не испортить файл он открывается с атрибутом PAGE_READONLY но не все файлы заканчиваются '\0' поэтому на 165 тыс файлов где то 18 нарушений доступа на эти случаи можно прикрутить когда поймали исключение
загрузить файл полность в память завершить его '\0' вручную и отдать на парсинг
это медленно поэтому я предпочел ловить исключения а когда поймал можно для него индивидуально и выделить память идеи насчет того что сделать защиту PAGE_READWRITE дописать '\0' и парсить не идут так как в момень парсинга могут прибить прогу файл останетя испорченным ну это так мысли может и можно еще как то сделать

Код:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <glib.h>


typedef void (*LPSEARCHFUNC)(LPCTSTR lpszFileName);
BOOL SearchFiles(
        LPCTSTR lpszFileName,                
        LPSEARCHFUNC lpSearchFunc,           
        BOOL bInnerFolders );     
                                            

char file[MAX_PATH];

BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders)
{
    LPTSTR part;
   char tmp[MAX_PATH]; // временный массив
    char name[MAX_PATH];

   HANDLE hSearch = NULL;
   WIN32_FIND_DATA wfd;
    memset(&wfd, 0, sizeof(WIN32_FIND_DATA));

    // сначало поиск внутри вложенных папках ...
    if(bInnerFolders)
    {
        if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE;
        strcpy(name, part);
        strcpy(part, "*.*");

        // если папки существуют, то делаем поиск
        wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
        if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
        do
        {
            // в каждой папке есть две папки с именами "." и ".."
            // и эти папки мы не трогаем

            // пропускаем папки "." и ".."
            if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))            
           continue;
       
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку
            {
                char next[MAX_PATH];
                if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
                strcpy(part, wfd.cFileName);
                strcat(next, "\\");
                strcat(next, name);

                SearchFiles(next, lpSearchFunc, TRUE);
            }
        }
        while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

        FindClose (hSearch); // заканчиваем поиск
    }

   if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE) 
       return TRUE; // в противном случае выходим
   do
   if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл
   {
        if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;
        strcpy(part, wfd.cFileName);

        lpSearchFunc(file);
   }
   while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
   FindClose (hSearch); // заканчиваем поиск

    return TRUE;
}

int yes;
char entries;
int entriesf;
int failopen;
int all_files;
int except;

static void
print_ip(const gchar *string);

void __cdecl show_info()
{
	int len, ret;
	char *cv, *pfmt;
	pfmt = strrchr(file, '\\');
	if (!pfmt)
		__asm int 3;
	len = _scprintf("f %d s %d a %d x %d %s", failopen, yes, all_files, except, pfmt);
	if (-1 == len)
		__asm int 3;
	cv = malloc(len + 1);
	if (!cv)
		__asm int 3;
	ret = sprintf(cv, "f %d s %d a %d x %d %s", failopen, yes, all_files, except, pfmt);
	if (-1 == ret)
		__asm int 3;
	ret = SetConsoleTitle(cv);
	if (!ret)
		__asm int 3;
	free(cv);
}

void DoSomething(LPCTSTR name)
{
	HANDLE hFile = INVALID_HANDLE_VALUE, hMap = NULL;
	DWORD dwFileSize;
	CHAR *base = NULL;
	show_info(++all_files);
	__try
	{
		hFile = CreateFile(name, GENERIC_READ,
			FILE_SHARE_READ, NULL, OPEN_EXISTING,
			FILE_ATTRIBUTE_NORMAL, NULL);
		if (hFile == INVALID_HANDLE_VALUE)
		{
			show_info(++failopen);
			__leave;
		}
		dwFileSize = GetFileSize(hFile, NULL);
		if (dwFileSize == INVALID_FILE_SIZE)
			__leave;
		hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileSize, NULL);
	    if (!hMap)
			__leave;
		base = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, dwFileSize);
	    if (!base)
			__leave;
		
		print_ip(base);
	}
	__finally
	{
		if (base)
			UnmapViewOfFile(base);
		if (hMap)
			CloseHandle(hMap);
		if (hFile != INVALID_HANDLE_VALUE)
			CloseHandle(hFile);
	}
	if (entriesf && entries == 'y')
	{
		puts(name);
		entriesf ^= entriesf;
	}
	return;
}

#define _124KB 126976
static char regexp[_124KB];

static void
print_ip(const gchar *string)
{
  GRegex *regex;
  GMatchInfo *match_info;
     
  regex = g_regex_new (regexp, 0, 0, NULL);
  __try
    {
	  g_regex_match (regex, string, 0, &match_info);
    }
  __except(EXCEPTION_EXECUTE_HANDLER)
    {
	  show_info(++except);
	  g_regex_unref(regex);
	  return;
    }
  while (g_match_info_matches (match_info))
    {
      gchar *word = g_match_info_fetch (match_info, 0);
      g_print ("%s\n", word);
      g_free (word);
      g_match_info_next (match_info, NULL);
	  entriesf = 1;
	  show_info(++yes);
    }
  g_match_info_free (match_info);
  g_regex_unref (regex);
}

int main(void)
{
	printf("echo entries (y/n) -> ");
	scanf("%c", &entries);
	fflush(stdin);
	printf("enter regexp -> ");
	gets(regexp);
	SearchFiles("C:\\*.*", DoSomething, TRUE);
}
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хакер и закон! SladerNon Болталка 17 12.11.2009 09:42
Обзор бесплатных Cms em00s7 PHP, PERL, MySQL, JavaScript 16 03.07.2009 13:13
О законе. _-[A.M.D]HiM@S-_ Статьи 28 01.11.2007 12:25
Программы для работы с железом. Часть I – настройка видеокарт _GaLs_ Аппаратное обеспечение 2 20.12.2006 01:18
Программы для работы с железом. Часть 2 – материнские платы _GaLs_ Аппаратное обеспечение 0 19.11.2006 12:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ