Git_man 发表于 2017-2-14 18:11

C语言调用detours劫持WindowsAPI

本帖最后由 Git_man 于 2017-2-14 18:32 编辑

00detours
    detours是微软亚洲研究院出品的信息安全产品,用于劫持
    可用Detours Express 3.0编译生成detours.lib

01劫持MessageBoxW()
    vs2015创建空项目,源文件中添加msg.c
    把detours.h、detours.lib、detver.h文件复制到msg.c同目录下
    输入MessageBoxW()右键选择查看定义
   

    复制MessageBoxW()的函数声明
   

    修改函数声明,去掉多余的调用约定,修改为一个指向原来函数的指针
    并在前面加上static防止影响其他源文件
   

    创建一个同类型的函数以便拦截是调用
   

    添加静态库文件
    #pragma comment(lib,"detours.lib")

    调用劫持代码
//开始拦截void Hook()
{
        DetourRestoreAfterWith();                            //恢复原来状态
        DetourTransactionBegin();                            //拦截开始
        DetourUpdateThread(GetCurrentThread());            //刷新当前线程
                                                                                                         //这里可以连续多次调用DetourAttach,表明HOOK多个函数
        DetourAttach((void **)&OldMessageBoxW, NewMessageBoxW);//实现函数拦截
        DetourTransactionCommit();                           //拦截生效
}
//取消拦截
void UnHook()
{
        DetourTransactionBegin();                            //拦截开始
        DetourUpdateThread(GetCurrentThread());            //刷新当前线程
                                                                                                   //这里可以连续多次调用DetourAttach,表明撤销HOOK多个函数
        DetourDetach((void **)&OldMessageBoxW, NewMessageBoxW);//撤销拦截
        DetourTransactionCommit();                           //拦截生效
}

    vs2015解决方案配置修改为Release
   

    msg.c:劫持MessageBoxW()完整代码
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include "detours.h"
#pragma comment(lib,"detours.lib")

static int(WINAPI*OldMessageBoxW)(
      HWND hWnd,
      LPCWSTR lpText,
      LPCWSTR lpCaption,
      UINT uType) = MessageBoxW;

int WINAPINewMessageBoxW(
      HWND hWnd,
      LPCWSTR lpText,
      LPCWSTR lpCaption,
      UINT uType)
{
      return 0;
}

void Hook()
{
      DetourRestoreAfterWith();
      DetourTransactionBegin();
      DetourUpdateThread(GetCurrentThread());
      DetourAttach((void **)&OldMessageBoxW, NewMessageBoxW);
      DetourTransactionCommit();
}

void UnHook()
{
      DetourTransactionBegin();
      DetourUpdateThread(GetCurrentThread());
      DetourDetach((void **)&OldMessageBoxW, NewMessageBoxW);
      DetourTransactionCommit();
}
void main()
{
      MessageBoxW(0, "abcd", "test", 0);
      Hook();
      MessageBoxW(0, "1234", "test", 0);
      system("pause");
}
    运行结果显示第一个MessageBoxW()运行成功第二个被劫持

02拦截system函数
    查看system()定义
   

    修改为一个指向system函数的指针
   

    程序完整测试代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>
#include "detours.h"
#pragma comment(lib,"detours.lib")

static int(*oldsystem)(const char * _Command) = system;

int newsystem(const char * _Command)
{
      printf("%s", _Command);
      return 0;
}

int newsystemA(const char * _Command)
{
      //实现过滤
      const char *p = strstr(_Command, "tasklist");
      if (!p == NULL) {
                oldsystem(_Command);
      }
      else {
                printf("%s禁止执行", _Command);
                return 0;
      }
}

void Hook()
{
      DetourRestoreAfterWith();
      DetourTransactionBegin();
      DetourUpdateThread(GetCurrentThread());
      DetourAttach((void **)&oldsystem, newsystem);
      DetourTransactionCommit();
}

void UnHook()
{
      DetourTransactionBegin();
      DetourUpdateThread(GetCurrentThread());
      DetourDetach((void **)&oldsystem, newsystem);
      DetourTransactionCommit();
}
void main()
{
      system("calc");
      Hook();
      system("calc");
      system("tasklist");
      getchar();
}

03dll注入注入正在运行的进程劫持system函数
    vs创建一个MFC程序
    *解决方案配置选择Release
   

    工具箱中拖入button并添加代码,并生成exe文件
   

    detours.h、detours.lib、detver.h文件复制到dll.c同目录下
    修改属性为dll,配置设为Release
   

    编写dll.c生成jiechi.dll文件禁止button调用calc
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>
#include "detours.h"
#pragma comment(lib,"detours.lib")

static int(*oldsystem)(const char * _Command) = system;

int newsystem(const char * _Command)
{
      return 0;
}

void Hook()
{
      DetourRestoreAfterWith();
      DetourTransactionBegin();
      DetourUpdateThread(GetCurrentThread());
      DetourAttach((void **)&oldsystem, newsystem);
      DetourTransactionCommit();
}

_declspec(dllexport) void go()
{
      MessageBoxA(0, "yes", "success", 0);
      Hook();
}
    运行生成的mfc应用程序,点击按钮可以调出计算器
    用dll注入工具把生成的jiechi.dll注入到mfc应用程序进程中
   
    这时system函数就被劫持了,程序无法调出计算器

04劫持CreateProcessW()
    CreateProcessW()可以创建进程,此函数被劫持后将无法打开应用程序
    CreateProcessW()函数声明
WINBASEAPI
BOOL
WINAPI
CreateProcessW(
      _In_opt_ LPCWSTR lpApplicationName,               //可执行模块名
      _Inout_opt_ LPWSTR lpCommandLine,                   //命令行字符串
      _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, //进程的安全属性
      _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,//线程的安全属性
      _In_ BOOL bInheritHandles,                        //句柄继承标志
      _In_ DWORD dwCreationFlags,                         //创建标志
      _In_opt_ LPVOID lpEnvironment,                      //指向新的环境块的指针
      _In_opt_ LPCWSTR lpCurrentDirectory,                //指向当前目录名的指针
      _In_ LPSTARTUPINFOW lpStartupInfo,                  //指向启动信息结构的指针
      _Out_ LPPROCESS_INFORMATION lpProcessInformation    //指向进程信息结构的指针
      );

   编译生成dll文件并注入到explorer.exe进程中
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>

#include "detours.h"
#pragma comment(lib,"detours.lib")

static BOOL(WINAPI *Old_CreateProcessW)(
      LPCWSTR lpApplicationName,
      LPWSTR lpCommandLine,
      LPSECURITY_ATTRIBUTES lpProcessAttributes,
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      BOOL bInheritHandles,
      DWORD dwCreationFlags,
      LPVOID lpEnvironment,
      LPCWSTR lpCurrentDirectory,
      LPSTARTUPINFOW lpStartupInfo,
      LPPROCESS_INFORMATION lpProcessInformation
      ) = CreateProcessW;

BOOL New_CreateProcessW(
      LPCWSTR lpApplicationName,
      LPWSTR lpCommandLine,
      LPSECURITY_ATTRIBUTES lpProcessAttributes,
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      BOOL bInheritHandles,
      DWORD dwCreationFlags,
      LPVOID lpEnvironment,
      LPCWSTR lpCurrentDirectory,
      LPSTARTUPINFOW lpStartupInfo,
      LPPROCESS_INFORMATION lpProcessInformation
      )
{
      MessageBoxA(0, "success", "success", 0);
      return 0;
}

void Hook()
{
      DetourRestoreAfterWith();   
      DetourTransactionBegin();   
      DetourUpdateThread(GetCurrentThread());
      DetourAttach((void **)&Old_CreateProcessW, New_CreateProcessW);
      DetourTransactionCommit();   
}

void UnHook()
{
      DetourTransactionBegin();   
      DetourUpdateThread(GetCurrentThread());
      DetourDetach((void **)&Old_CreateProcessW, New_CreateProcessW);
      DetourTransactionCommit();   
}

_declspec(dllexport) void go()
{
      Hook();
      int i = 0;
      while (1) {
                if (i == 120) {
                        UnHook();
                        break;
                }
                i++;
                Sleep(1000);
      }
      system("tasklist & pause");

}





Git_man 发表于 2017-2-14 20:37

511598889 发表于 2017-2-14 18:36
谢谢分享,很详细,不过有个疑问,这个是不是对所有系统都有效

detours是微软花一年时间开发的安全产品,不加修改的话只适用于Windows平台

杯具加杯具 发表于 2018-7-18 11:10

这个和SetWindowsHookEX有什么区别吗,好像都是一样的,不过SetWindowsHookEx只能拦截有消息队列的进程,不知道这个是不是可以拦截所有进程

chinacore_zhao 发表于 2017-2-14 18:33

功力不够,看不懂。

Takitooru 发表于 2017-2-14 18:36

谢谢分享,很详细,不过有个疑问,这个是不是对所有系统都有效

yysniper 发表于 2017-2-14 19:06

感觉很方便呀

夏雨微凉 发表于 2017-2-14 19:54

楼主咱们用的是一个C语言吗?:funk:eweqw,为何我学完了就会点建个数组、改个字符串啥的{:1_908:}

Git_man 发表于 2017-2-14 20:07

没啥子区别,就是调用了几个Windows API,在#include<Windows.h>中:loveliness:

大份水饺 发表于 2017-2-14 21:12

楼主,一定要用注射才行吗,进程通信可不可以实现劫持

xie0080 发表于 2017-2-14 21:43

谢谢分享谢谢分享{:1_914:}

tianhett 发表于 2017-2-15 00:05

膜拜大神中。。。。。。。。{:301_1003:}
页: [1] 2
查看完整版本: C语言调用detours劫持WindowsAPI