首页
社区
课程
招聘
[旧帖] [分享]自己抄写的程序 0.00雪花
发表于: 2015-11-10 17:58 1366

[旧帖] [分享]自己抄写的程序 0.00雪花

2015-11-10 17:58
1366
从网上收集的吧,没含量,仅作纪念
程序功能:从某一目录下,查找存在某个字符串的文件,并打开
但是实际这个程序有问题,我调试不了,谁有兴趣可以看一看
找源码请到网上搜,比较容易找到,

#include<windows.h>
#include<stdio.h>
#include <direct.h>

void processAllDir( const char *path );
void  process(char* string);
#define STRING1 "D:\\360安全浏览器下载\\AppendixB\\*"  //你要在哪个目录下找
#define STRING2 "asdf"      //在文件中要查找的字符串
void main()
{
  const char* str =STRING1;
  processAllDir(str);
}

void processAllDir( const char *path ) {  
    WIN32_FIND_DATA FindFileData;           //该结构用来保存文件目录信息  
    HANDLE hFind;                   //保存文件查找的句柄  
    char path_search[MAX_PATH];         //存储查找目录路径  
  
    hFind = FindFirstFile( path, &FindFileData );   //查找path目录里的第一个文件,并把结果保存在FindFileData结构体里  
    if( hFind == INVALID_HANDLE_VALUE )     //判断查找是否成功  
        return;  
    if( FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY )
   {   //判断是否为目录  
        if( FindFileData.cFileName[0] != '.' )
        {            //判断是否为“.”和“..”目录  
            strcpy( path_search, path );                //不是的话,把当前查找目录,copy到path_search  
            path_search[strlen(path_search)-1] = '\0';      //path形式为“D:\a\*”,此处去掉"*"  
            strcat( path_search, FindFileData.cFileName );          //连接当前查找到的目录名  
            strcat( path_search, "\\\*");               //处理为“D:\a\b\*”的形式  
            processAllDir( path_search );               //递归调用,进入下一级目录  
            chdir( path_search );                     //递归处理完,返回上一级目录  
        }  
    }  
    else {                                  //如果不是目录,直接进行处理  
        strcpy( path_search, path );  
        path_search[strlen(path_search)-1] = '\0';  
        strcat( path_search, FindFileData.cFileName );  
        process( path_search );             //调用处理函数  
    }  
  
    while( FindNextFile( hFind, &FindFileData) ) {              //继续处理下一个目录或文件  
        if( FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY ) {  
            if( FindFileData.cFileName[0] != '.' ) {  
                strcpy( path_search, path );  
                path_search[strlen(path_search)-1] = '\0';  
                strcat( path_search, FindFileData.cFileName );  
                strcat( path_search, "\\\*");  
                processAllDir( path_search );  
                chdir( path );  
            }  
        }  
        else {  
            strcpy( path_search, path );  
            path_search[strlen(path_search)-1] = '\0';  
            strcat( path_search, FindFileData.cFileName );  
            process( path_search );  
        }  
    }  
    FindClose( hFind );             //关闭文件查找句柄  
}

void  process(char* string)
{

   HANDLE hFile = CreateFile(
        string,
        GENERIC_WRITE | GENERIC_READ,// 如果要映射文件:此处必设置为只读(GENERIC_READ)或读写
        0, // 此设为打开文件的任何尝试均将失败
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, //|FILE_FLAG_WRITE_THROUGH,【解1】
        NULL);
    if (hFile != INVALID_HANDLE_VALUE)// 文件打开失败返回句柄为-1
   
    {
       printf("文件打开成功~!\n");
    }

    // 步骤2 建立内存映射文件
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    printf("文件大小为:%d\n", dwFileSize);
    HANDLE hFileMap = CreateFileMapping(
        hFile, // 如果这值为INVALID_HANDLE_VALUE,是合法的,上步一定测试啊
        NULL, // 默认安全性
        PAGE_READWRITE, // 可读写
        0, // 2个32位数示1个64位数,最大文件字节数,
        // 高字节,文件大小小于4G时,高字节永远为0
        0,//dwFileSize, // 此为低字节,也就是最主要的参数,如果为0,取文件真实大小
        NULL);
    if (hFileMap != NULL)
    {
        printf("内存映射文件创建成功~!\n");
    }
    else
    {
        printf("内存映射文件创建失败~!\n");
    }

    // 步骤3:将文件数据映射到进程的地址空间
    PVOID pvFile = MapViewOfFile( //pvFile就是得到的指针,用它来直接操作文件
        hFileMap,
        FILE_MAP_WRITE, // 可写
        0, // 文件指针头位置 高字节
        0, // 文件指针头位置 低字节 必为分配粒度的整倍数,windows的粒度为64K
        0); // 要映射的文件尾,如果为0,则从指针头到真实文件尾
    if (pvFile != NULL)
    {
        printf("文件数据映射到进程的地址成功~!\n");
    }
    else
    {
        printf("文件数据映射到进程的地址成功~!\n");
    }

    char *p = (char*)pvFile;
    char* lookstr=STRING;
    int len=strlen(lookstr);
    int number;
    for (unsigned int i = 0; i <dwFileSize; i++)
    {
        number=0;
        for(unsigned int j=0;j < len;j++)
         {
           if( *(p+i+j) == *(lookstr+j))
            {
                ++number;
            }
         }
         if(number == len)
          {
                       
                ShellExecute(NULL,"open",string,NULL,NULL,SW_SHOWNORMAL);
          }
   }
   
    // 步骤5: 相关的释放工作
    UnmapViewOfFile(pvFile); // 释放内存映射文件的头指针
    CloseHandle(hFileMap); // 内存映射文件句柄
    CloseHandle(hFile); // 关闭文件

}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//