# Detours InLine Hook

## Inline hook 简介

通常hook是指一种改变代码执行流程将其拦截并重定向到另一片代码块的技术，其实现方式有很多种，针对ring3(用户层)，常见的有虚表vitualtables hook，inline hook，iat hook，callbackhook等，本文介绍的inline hook使用修改函数具体代码实现的执行链劫持，在windows 10操作系统中由于ASLR(地址随机化)的缘故，手工实现InLine比较麻烦，这里使用微软的一个轻量级的开源库。

详见该开源库的wiki。

![](https://3969710588-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GuIlaAXU8NbJTCRei%2F-M8DlRZMJg9ip_8ZvAIq%2F-M8DnQRA4fHhDJUv9Ac2%2Fimage.png?alt=media\&token=829c8e3a-9993-4655-a9fc-511269e22815)

![](https://3969710588-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GuIlaAXU8NbJTCRei%2F-M8DlRZMJg9ip_8ZvAIq%2F-M8DnTKKRlTDs9QK8s8b%2Fimage.png?alt=media\&token=0030c237-8458-46ec-96ad-e68a9a4f1726)

## 示例代码

```
#include<Windows.h>
#include<stdio.h>
#include "include/detours.h"
#if _X64
#pragma comment(lib,"lib.X64/detours.lib")
#else
#pragma comment(lib,"lib.X86/detours.lib")
#endif

static int (WINAPI* OldMesssageBoxA)
(
    HWND hWnd,
    LPCSTR lpText,
    LPCSTR lpCaption,
    UINT uType
    ) = MessageBoxA;

int WINAPI MyFunction0(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
    return OldMesssageBoxA(NULL, "Hooking your MessageBoxA!", "Warming", MB_OKCANCEL);
}

int main() {
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)OldMesssageBoxA, MyFunction0);
    //DetourDetach(&(PVOID&)OldMesssageBoxA, MyFunction0);
    DetourTransactionCommit();

    MessageBoxA(0, 0, 0, 0);


	return 0;
}
```

![](https://3969710588-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GuIlaAXU8NbJTCRei%2F-M8DoDrjZA3aARPJUqHW%2F-M8DoLDmfi0scuPTM_wx%2Fimage.png?alt=media\&token=44c135ae-7984-41d4-9f6d-c192f6404577)

## RdpThief应用

前段时间(很久很久以前)，有一篇专门讲通过detours窃取rdp凭证的文章，这里作为案例复现一下。

起一个rdp客户端创建连接。

![](https://3969710588-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GuIlaAXU8NbJTCRei%2F-M8Dof_TbuX8k0W55a0u%2F-M8DtATzV2q8Lc9YwVVN%2Fimage.png?alt=media\&token=6e0628ae-dfa7-41c1-9338-e6dd54e7187d)

搜索用户名。

![](https://3969710588-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GuIlaAXU8NbJTCRei%2F-M8Dof_TbuX8k0W55a0u%2F-M8Du9GxuIC-KpzKQO2N%2Fimage.png?alt=media\&token=a0e4c6b6-e3e9-48bd-8ddb-0b68b245525b)

![](https://3969710588-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GuIlaAXU8NbJTCRei%2F-M8Dof_TbuX8k0W55a0u%2F-M8DuK44IO0GJ76cVPy6%2Fimage.png?alt=media\&token=f4499a71-5c32-4ab4-a055-bf7b838f167c)

密码也是同样，这里密码通过不能通过字符串搜索直接出结果，但根据查看函数调用可知具体密码处于CryptProtectMemory函数第一个参数所指向的内存区域偏移+4的位置。

![](https://3969710588-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GuIlaAXU8NbJTCRei%2F-M8Dof_TbuX8k0W55a0u%2F-M8Dum7Oi22cXaYzpK6w%2Fimage.png?alt=media\&token=7b18837d-effc-4d74-96b4-2e53ff0b9956)

具体ip地址也是一样。

![](https://3969710588-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3GuIlaAXU8NbJTCRei%2F-M8Dof_TbuX8k0W55a0u%2F-M8DvaX7IN_EtjQS-Zbu%2Fimage.png?alt=media\&token=0bd68881-ba7e-4bba-9838-3762a59e5590)

github:<https://github.com/0x09AL/RdpThief.git>

## LINKS

{% embed url="<https://www.cnblogs.com/M-Anonymous/p/9766343.html>" %}

{% embed url="<https://github.com/microsoft/Detours/wiki/OverviewInterception>" %}

{% embed url="<https://blog.csdn.net/systemino/article/details/103083541>" %}
