-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathYY-Guard.h
106 lines (71 loc) · 2.47 KB
/
YY-Guard.h
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
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#if defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif
#ifndef __YY_GUARD_INCLUDE
#define __YY_GUARD_INCLUDE
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#ifdef __cplusplus
extern "C" {
#endif
//C API
/*
Unicode版,优先从System32目录加载依赖项
如果 lpLibFileName 是一个相对路径,那么此函数会从 System32 加载 dll 以及相关依赖项。
如果 lpLibFileName 是一个绝对路径,那么此函数会从 调用者传入的绝对路径加载 dll,但是相关依赖项依然只从 System32加载。
示例:
背景知识:wimgapi.dll依赖 version.dll,具体自行去System32,用Depend工具查看wimgapi.dll的导入表。
//从 C:\Windows\System32 目录加载 wimgapi.dll 以及它的依赖项,比如 version.dll。如果不用 YY_LoadLibraryFormSystem32W,那么极有可能发生 wimgapi.dll 或者 version.dll 劫持。
YY_LoadLibraryFormSystem32W(L"wimgapi.dll");
//从 D:\Dism++ 目录加载 wimgapi.dll,但是从 System32 加载它的依赖项,比如 version.dll。如果不用 YY_LoadLibraryFormSystem32W,那么极有可能发生version.dll 劫持。
YY_LoadLibraryFormSystem32W(L"D:\\Dism++\\wimgapi.dll");
*/
HMODULE
__fastcall
YY_LoadLibraryFormSystem32W(
LPCWSTR lpLibFileName
);
//ANSI版,优先从System32目录加载依赖项,使用方式同 YY_LoadLibraryFormSystem32W
HMODULE
__fastcall
YY_LoadLibraryFormSystem32A(
LPCSTR lpLibFileName
);
#if defined(_X86_)
#define __Enable_YY_Guard_Runtime_DLL_Hijacking __pragma(comment(linker, "/include:_YY_GUARD_InitDefaultDllDirectories"))
#elif defined(_AMD64_) || defined(_ARM_) || defined(_ARM64_)
#define __Enable_YY_Guard_Runtime_DLL_Hijacking __pragma(comment(linker, "/include:YY_GUARD_InitDefaultDllDirectories"))
#else
//未知体系,什么也不做,仅用于编译通过处理。
#define __Enable_YY_Guard_Runtime_DLL_Hijacking
#endif
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
//C++ API
namespace YY
{
//Unicode版,优先从System32目录加载依赖项,使用方式同 YY_LoadLibraryFormSystem32W
__inline
HMODULE
__fastcall
LoadLibraryFormSystem32(
LPCWSTR lpLibFileName
)
{
return YY_LoadLibraryFormSystem32W(lpLibFileName);
}
//ANSI版,优先从System32目录加载依赖项,使用方式同 YY_LoadLibraryFormSystem32W
__inline
HMODULE
__fastcall
LoadLibraryFormSystem32(
LPCSTR lpLibFileName
)
{
return YY_LoadLibraryFormSystem32A(lpLibFileName);
}
}
#endif //!__cplusplus
#endif //!__YY_GUARD_INCLUDE