吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10518|回复: 15
收起左侧

[C&C++ 转载] C语言调用detours劫持WindowsAPI

  [复制链接]
Git_man 发表于 2017-2-14 18:11
本帖最后由 Git_man 于 2017-2-14 18:32 编辑

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

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

查看定义

查看定义


    复制MessageBoxW()的函数声明
    2.png

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

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

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

    调用劫持代码
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
//开始拦截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
    11.jpg
  
    msg.c:劫持MessageBoxW()完整代码
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
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
42
43
44
#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 WINAPI  NewMessageBoxW(
        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()定义
    1.jpg

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

    程序完整测试代码
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
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
42
43
44
45
46
47
48
49
50
51
52
#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();
}


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

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

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

    编写dll.c生成jiechi.dll文件禁止button调用calc
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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应用程序进程中
    aaaa.jpg
    这时system函数就被劫持了,程序无法调出计算器

04  劫持CreateProcessW()
    CreateProcessW()可以创建进程,此函数被劫持后将无法打开应用程序
    CreateProcessW()函数声明
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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进程中
[C++] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#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");
 
}






劫持代码.zip

175.33 KB, 下载次数: 155, 下载积分: 吾爱币 -1 CB

劫持代码

免费评分

参与人数 4吾爱币 +5 热心值 +3 收起 理由
qaz003 + 1 谢谢@Thanks!
述说过去 + 2 + 1 热心回复!
Takitooru + 1 + 1 用心讨论,共获提升!
chinacore_zhao + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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语言吗?,为何我学完了就会点建个数组、改个字符串啥的
 楼主| Git_man 发表于 2017-2-14 20:07
没啥子区别,就是调用了几个Windows API,在#include<Windows.h>中
大份水饺 发表于 2017-2-14 21:12
楼主,一定要用注射才行吗,进程通信可不可以实现劫持
xie0080 发表于 2017-2-14 21:43
谢谢分享谢谢分享{:1_914:}
tianhett 发表于 2017-2-15 00:05
膜拜大神中。。。。。。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-15 15:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表