Windows 蓝牙外发文件拦截

来源:互联网 发布:cad网络拓扑图下载 编辑:程序博客网 时间:2024/06/04 23:21


个人总结:对于蓝牙外发的拦截,可以通过协议拦截和动作拦截实现。对于协议拦截来说需要对蓝牙协议很了解,通过协议把蓝牙发送的数据拦截。但是我只需要拦截它的外发文件就可以了, 用这种方法实现投入较大;另一种方法是拦截蓝牙外发的动作,取到外发的文件名字。

通过协议拦截的方法暂不介绍。

通过拦截动作实现的拦截中,它的思想是拦截蓝牙外发过程中调用的系统API,CreateFileW, 在API函数参数中获取外发文件路径

具体实现方法:

(1)利用钩子技术拦截Kernel32.dll模块中的CreateFileW Api

(2)在拦截后的CreateFileW 函数中,判断它的调用进程是否为蓝牙进程

(3)在蓝牙进程中的CreateFileW参数中把文件路径取到,其中API参数中dwCreationDisposition等于OPEN_EXISTING表示蓝牙外发文件,等于CREATE_NEW表示接收文件。


步骤(1)钩子拦截和步骤(3)比较简单,不做过多总结。对于步骤(2)来说,在API函数中判断它的调用进程,需要采用调用栈回缩技术。对于Windows自带的蓝牙软件为fsquirt.exe,简单的处理就是根据进程名字来判断它是不是蓝牙进程,当然严谨的讲根据exe的版本信息更准确。

(a)在拦截后的CreateFileW函数中,通过调用ntdll.dll模块的RtlWalkFrameChain函数,可以取到栈的调用链

typedef ULONG (WINAPI *Func_RtlWalkFrameChain)(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags);static Func_RtlWalkFrameChain RtlWalkFrameChain = NULL;if (RtlWalkFrameChain == NULL){RtlWalkFrameChain = (Func_RtlWalkFrameChain)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlWalkFrameChain");if (RtlWalkFrameChain == NULL){return FALSE;}}

(b)调用链的具体前几个调用栈,在于你调用RtlWalkFrameChain的函数在栈的第几层,这里是第3层。用第3层的调用栈信息,通过进程模块取得它的进程信息


PVOID ary[MAX_PATH]={0};ULONG StackCount;StackCount = RtlWalkFrameChain(ary, MAX_PATH, 0);if (StackCount < 3){return FALSE;}PVOID Address = ary[2];if (Address == NULL){return FALSE;}MODULEINFO moduleinfo = {0};GetModuleInformation(GetCurrentProcess(), GetModuleHandle(L"fsquirt.exe"), &moduleinfo, sizeof(moduleinfo));

(c)判断调用链上的地址是否在进程fsqirt.exe的进程地址中,如果在进程的地址中,说明这个调用是它调用的。否则就不是它进程本身调用的。

if ((DWORD_PTR)Address > (DWORD_PTR)moduleinfo.lpBaseOfDll && (DWORD_PTR)Address < (DWORD_PTR)moduleinfo.lpBaseOfDll + moduleinfo.SizeOfImage){return TRUE;}


0 0
原创粉丝点击