code hook findfirstfileEx

本文介绍了一个DLL应用示例,通过DLL注入技术重定向Windows API函数FindFirstFileEx,实现文件搜索操作的日志记录功能。该技术使用Detours库进行函数钩子设置,适用于Windows系统下的文件操作监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// HookFindFirstFileEx.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "stdio.h"
#include <Windows.h>
#include "./include/detours.h"



///////////////////////////////////////
#define _WIN32_WINNT 0x0400

/*typedef struct _WIN32_FIND_DATA2
{  
    DWORD dwFileAttributes;  
    FILETIME ftCreationTime;  
    FILETIME ftLastAccessTime;  
    FILETIME ftLastWriteTime;  
    DWORD nFileSizeHigh;  
    DWORD nFileSizeLow;  
    DWORD dwReserved0;  
    DWORD dwReserved1;  
    WCHAR cFileName[MAX_PATH];  
    WCHAR cAlternateFileName[14];
}
WIN32_FIND_DATA2, *PWIN32_FIND_DATA2;*/

typedef enum _FINDEX_INFO_LEVELS
{
    FindExInfoStandard
}
FINDEX_INFO_LEVELS;



typedef enum _FINDEX_SEARCH_OPS
{
    FindExSearchNameMatch,
    FindExSearchLimitToDirectories,
    FindExSearchLimitToDevices
} FINDEX_SEARCH_OPS;


extern "C" HANDLE WINAPI FindFirstFileExA(
  LPCTSTR lpFileName,
  FINDEX_INFO_LEVELS fInfoLevelId,
  LPVOID lpFindFileData,
  FINDEX_SEARCH_OPS fSearchOp,
  LPVOID lpSearchFilter,
  DWORD dwAdditionalFlags
);

extern "C" HANDLE WINAPI FindFirstFileExW(
  LPCWSTR lpFileName,
  FINDEX_INFO_LEVELS fInfoLevelId,
  LPVOID lpFindFileData,
  FINDEX_SEARCH_OPS fSearchOp,
  LPVOID lpSearchFilter,
  DWORD dwAdditionalFlags
);




BOOL InstallProbes();
BOOL UninstallProbes();

DETOUR_TRAMPOLINE( HANDLE WINAPI Real_FindFirstFileExA( LPCTSTR a0, FINDEX_INFO_LEVELS a1, LPVOID a2, FINDEX_SEARCH_OPS a3, LPVOID a4, DWORD a5 ), FindFirstFileExA );
DETOUR_TRAMPOLINE( HANDLE WINAPI Real_FindFirstFileExW( LPCWSTR a0, FINDEX_INFO_LEVELS a1, LPVOID a2, FINDEX_SEARCH_OPS a3, LPVOID a4, DWORD a5 ), FindFirstFileExW );


HANDLE WINAPI MyFindFirstFileExA( LPCTSTR lpFileName,
                                  FINDEX_INFO_LEVELS fInfoLevelId,
                                  LPVOID lpFindFileData,
                                  FINDEX_SEARCH_OPS fSearchOp,
                                  LPVOID lpSearchFilter,
                                  DWORD dwAdditionalFlags );

HANDLE WINAPI MyFindFirstFileExW( LPCWSTR lpFileName,
                                  FINDEX_INFO_LEVELS fInfoLevelId,
                                  LPVOID lpFindFileData,
                                  FINDEX_SEARCH_OPS fSearchOp,
                                  LPVOID lpSearchFilter,
                                  DWORD dwAdditionalFlags );


/////////////////////////////
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    if( DLL_PROCESS_ATTACH == ul_reason_for_call )//dll加载
    {
        InstallProbes();
    }
    else if( DLL_PROCESS_DETACH == ul_reason_for_call )//dll卸载
    {
        UninstallProbes();
    }
    else;

    return TRUE;
}

BOOL InstallProbes()
{
    DetourFunctionWithTrampoline( (PBYTE)Real_FindFirstFileExA, (PBYTE)MyFindFirstFileExA );
    DetourFunctionWithTrampoline( (PBYTE)Real_FindFirstFileExW, (PBYTE)MyFindFirstFileExW );
#ifdef _DEBUG
    OutputDebugString("InstallProbes ok./n");
#endif
    return TRUE;
}

BOOL UninstallProbes()
{
    DetourRemove( (PBYTE)Real_FindFirstFileExA, (PBYTE)MyFindFirstFileExA );
    DetourRemove( (PBYTE)Real_FindFirstFileExW, (PBYTE)MyFindFirstFileExW );

#ifdef _DEBUG    
    OutputDebugString("UNInstallProbes ok./n");
#endif
    return TRUE;
}

////////////////////////////////////////////////////////
HANDLE WINAPI MyFindFirstFileExA( LPCTSTR lpFileName,
                                  FINDEX_INFO_LEVELS fInfoLevelId,
                                  LPVOID lpFindFileData,
                                  FINDEX_SEARCH_OPS fSearchOp,
                                  LPVOID lpSearchFilter,
                                  DWORD dwAdditionalFlags )
{
    TCHAR sz[300];
    sprintf( sz, "MyFindFirstFileExA :%s /n", lpFileName );
    OutputDebugString( sz );

    return Real_FindFirstFileExA( lpFileName, fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags );
}

HANDLE WINAPI MyFindFirstFileExW( LPCWSTR lpFileName,
                                  FINDEX_INFO_LEVELS fInfoLevelId,
                                  LPVOID lpFindFileData,
                                  FINDEX_SEARCH_OPS fSearchOp,
                                  LPVOID lpSearchFilter,
                                  DWORD dwAdditionalFlags )
{
    char strTemp[256*2];
    TCHAR sz[300];

    WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)lpFileName, -1, strTemp, 256, NULL, NULL );
    sprintf( sz, "MyFindFirstFileExW :%s /n", strTemp );
    OutputDebugString( sz );


    return Real_FindFirstFileExW( lpFileName, fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值