Windows 剪切板与微软Hook框架Detours学习

**之前看了某师傅的一篇文章关于通过mstsc反向攻击客户端,奈何对Windows Api的相关操作不太了解于是打算学习一下,希望能构造Exp ** XD

剪切板中的数据类型

1
2
3
4
5
6
7
CF_TEXT        //一段ANSI文本
CF_OEMTEXT //一段DOS文本
CF_UNICODETEXT //一段Unicode文本
CF_LOCALE //区域标识
CF_BITMAP //位图
CF_DIB //设备无关位图
CF_HDROP //指向HDROP这种结构的句柄,可以通过DragQueryFile函数来获得文件信息,HDROP是一个结构体。

常用操作剪切板的APi

1
2
3
4
5
BOOL OpenClipboard(HWND hWndNewOwner); //打开剪切板
BOOL EmptyClipboard(VOID); //清空剪切板
HANDLE SetClipboardData(UINT uFormat, HANDLE hMem); //设置剪切板内容
HANDLE GetClipboardData(UINT uFormat); //返回剪切板内容的内存块句柄
BOOL CloseClipboard();

使用Win32 Api与剪切板交互

1
2
3
4
5
6
1. HGLOBAL GlobalAlloc(分配选项, 分配内存大小); //分配全局内存并返回它的句柄或指针
2. HGLOBAL GlobalFree(内存块句柄); //释放全局内存
3. SIZE_T GlobalSize(内存块句柄); //返回全局内存的大小
4. LPVOID GlobalLock(内存块句柄); //获得全局内存所有权,并返回指向全局内存的指针
5. BOOL GlobalUnlock(内存块句柄); //释放全局内存所有权,GlobalAlloc分配选项如果是GHND,则分配可变内存,清零内存并返回全局内存句柄,需要GlobalLock以获取指针
6.GlocalAlloc//分配选项如果是GPTR,则分配固定内存,清零内存并直接返回指针

微软Hook框架Detours

关于这个框架了解了RdpThief的朋友们都知道,RdpThief就是使用这个框架去Hook相关Api实现抓取Rdp登录凭证的

关于编译Detours的过程就不说了,网上一堆教程,简单的使用一下hook

在VS中新建控制台项目根据操作系统位数将编译出来的detours.hdetver.h,detours.lib复制到项目根目录下,在头文件处引用

avatar

项目代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include "detours.h"
#pragma comment(lib,"detours.lib")

static int(WINAPI* HookMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) = MessageBoxW;
int WINAPI _MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
int ret = HookMessageBoxW(hWnd, L"hook", L"hook Success", uType);
return ret;
}



void DetourHook() {
DetourRestoreAfterWith();//恢复原来状态
DetourTransactionBegin();//开始Hook
DetourUpdateThread(GetCurrentThread());//刷新当前线程.
DetourAttach((void**)&HookMessageBoxW,_MessageBoxW);
DetourTransactionCommit();//Hook生效
}

void DetourUnHook() {

DetourTransactionBegin();//开始
DetourUpdateThread(GetCurrentThread());//刷新当前线程.
DetourDetach((void**)&HookMessageBoxW, _MessageBoxW);
DetourTransactionCommit();
}

int main()
{
MessageBoxW(NULL, L"Hello", L"Hello", 0);
DetourHook();//启动Hook
MessageBoxW(NULL, L"Hello", L"Hello", 0);
DetourUnHook();//取消Hook
return 0;

}

可以看到以上代码我们Hook了MessageBoxW这个api,查看效果

先是弹出了Hello 然后弹出了hook 第二个MessageBox被我们hook成功

使用Detours可以帮助我们快速的Hook指定的api

Tips:顺便插一个无关的内容,之前看Rdpthief这个项目有个小Bug(Win7抓不到Server地址),后面三好学生师傅提出了解决方法,看了一些博客修改的代码是比较冗长的,稍微用简单的方法修正了一下

直接判断lpServer的值是否为Null即可,如为Null,则使用Hook CredReadW 这个api来获取Server的值

对Windows编程的知识又复习了一遍,i了i了