项目要求实现对文件操作的监控,首先想到的就是通过HOOK的方式,先是通过setWindowsHookEx采用全局注入方式注入文件操作DLL,这种方式在WIN10操作系统有效,但是在WIN7上无效,后来又使用了CreateRemoteThread采用远程注入方式,结果还是只在WIN10上有限,又查了很多资料,最后看到网上又说可以使用LdrLoadDll+NtCreateThreadEx于是又采用这种方式注入DLL,结果还是只是WIN10上有效,又再重新检查,不断尝试,最后发现编辑成RELEASE版本可以注入WIN7 64SP1,于是想着记录下来,希望后面的人少走弯路。
下面是核心代码:
typedef DWORD(WINAPI* PFNTCREATETHREADEX)
(
PHANDLE ThreadHandle,
ACCESS_MASK DesiredAccess,
LPVOID ObjectAttributes,
HANDLE ProcessHandle,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
BOOL CreateSuspended,
DWORD dwStackSize,
DWORD dw1,
DWORD dw2,
LPVOID Unknown
);
typedef struct _LSA_UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} LSA_UNICODE_STRING, * PLSA_UNICODE_STRING, UNICODE_STRING, * PUNICODE_STRING;
typedef NTSTATUS(NTAPI* pRtlInitUnicodeString)(PUNICODE_STRING, PCWSTR);
typedef NTSTATUS(NTAPI* pLdrLoadDll)(PWCHAR, ULONG, PUNICODE_STRING, PHANDLE);
typedef struct _THREAD_DATA
{
pRtlInitUnicodeString fnRtlInitUnicodeString;
pLdrLoadDll fnLdrLoadDll;
UNICODE_STRING UnicodeString;
WCHAR DllName[260];
PWCHAR DllPath;
ULONG Flags;
HANDLE ModuleHandle;
}THREAD_DATA, * PTHREAD_DATA;
typedef VOID(WINAPI* fRtlInitUnicodeString)(PUNICO