回调函数Callbacks

回调函数基础概念

回调函数(Callback Function)是一种编程模式,指的是将一个函数作为参数传递给另一个函数,并在特定条件满足时被调用的函数。在Windows API中,回调函数被广泛用于事件处理、异步操作等场景。

1
2
3
4
5
// 回调函数的基本定义
typedef BOOL (WINAPI *CALLBACK_FUNCTION)(LPVOID lpParameter);

// 使用回调函数的API示例
BOOL EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam);

使用回调函数的优点:

  1. 合法性强:回调函数是Windows系统的正常机制
  2. 隐蔽性好:恶意代码隐藏在合法的回调中
  3. 绕过检测:许多安全产品不会深入分析回调函数内容
  4. 动态执行:可以在运行时动态注册和执行

免杀对抗中回调函数

基本思想

通过注册合法的回调函数,在系统或应用程序调用这些回调时执行恶意代码,从而绕过静态检测和部分动态检测。

1
1. 程序启动 → 2. 注册回调函数 → 3. 等待触发条件 → 4. 执行恶意代码

常见的回调函数类型

1. 窗口消息回调

1
2
3
4
5
6
7
8
9
// 窗口过程回调
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_CREATE) {
// 恶意代码执行点
MessageBox(NULL, L"恶意代码已执行", L"提示", MB_OK);
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

2. 定时器回调

1
2
3
4
5
6
// 定时器回调函数
VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
// 恶意代码执行
system("calc.exe");
}

3. 文件系统监控回调

1
2
3
4
5
6
7
8
9
10
11
12
// 文件系统监控回调
VOID CALLBACK FileIOCompletionRoutine(
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransfered,
LPOVERLAPPED lpOverlapped
)
{
if (dwErrorCode == 0) {
// 恶意代码执行
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MaliciousCode, NULL, 0, NULL);
}
}

4. 注册表监控回调

1
2
3
4
5
6
7
8
9
10
// 注册表监控回调
LSTATUS CALLBACK RegChangeCallback(
HKEY hKey,
DWORD dwControl,
PVOID pvData
)
{
// 恶意代码执行
return ERROR_SUCCESS;
}

5. 异常处理回调

1
2
3
4
5
6
7
8
// 异常处理回调
LONG CALLBACK ExceptionHandler(
PEXCEPTION_POINTERS ExceptionInfo
)
{
// 恶意代码执行
return EXCEPTION_EXECUTE_HANDLER;
}

回调函数使用案例

使用SetTimer实现延迟执行

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
#include <windows.h>
#include <stdio.h>

// 恶意代码函数
DWORD WINAPI MaliciousCode(LPVOID lpParam)
{
MessageBox(NULL, L"恶意代码通过定时器回调执行", L"警告", MB_OK);
return 0;
}

// 定时器回调函数
VOID CALLBACK TimerCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
// 创建线程执行恶意代码
CreateThread(NULL, 0, MaliciousCode, NULL, 0, NULL);

// 停止定时器
KillTimer(hwnd, idEvent);
}

int main()
{
// 设置定时器,5秒后触发回调
SetTimer(NULL, 1, 5000, TimerCallback);

// 模拟正常程序行为
printf("程序正在运行...\n");

// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}

使用EnumWindows隐藏执行

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
#include <windows.h>

// 恶意代码
void ExecuteMaliciousCode()
{
// 这里可以放置各种恶意操作
system("notepad.exe");
}

// 窗口枚举回调
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
static BOOL executed = FALSE;

if (!executed) {
executed = TRUE;
ExecuteMaliciousCode();
}

return TRUE; // 继续枚举
}

int main()
{
// 通过枚举窗口触发回调
EnumWindows(EnumWindowsProc, 0);

// 正常程序逻辑
printf("窗口枚举完成\n");

return 0;
}

使用文件监控回调

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
#include <windows.h>
#include <stdio.h>

HANDLE hDir;
OVERLAPPED overlapped;

// 文件监控回调
VOID CALLBACK FileIOCompletionRoutine(
DWORD dwErrorCode,
DWORD dwNumberOfBytesTransfered,
LPOVERLAPPED lpOverlapped
)
{
if (dwErrorCode == 0) {
// 恶意代码执行
MessageBox(NULL, L"文件监控触发恶意代码", L"警告", MB_OK);
}

// 继续监控
ReadDirectoryChangesW(
hDir,
NULL, 0,
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME,
NULL,
&overlapped,
FileIOCompletionRoutine
);
}

int main()
{
// 打开目录进行监控
hDir = CreateFileW(
L"C:\\",
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
NULL
);

if (hDir != INVALID_HANDLE_VALUE) {
// 开始监控
ReadDirectoryChangesW(
hDir,
NULL, 0,
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME,
NULL,
&overlapped,
FileIOCompletionRoutine
);

// 等待
Sleep(10000);
CloseHandle(hDir);
}

return 0;
}

参考链接

  1. https://marcoramilli.substack.com/p/running-shellcode-through-windows-callbacks
  2. https://github.com/aahmad097/AlternativeShellcodeExec
  3. https://github.com/ChaitanyaHaritash/Callback_Shellcode_Injection

回调函数Callbacks
http://candyb0x.github.io/2025/10/09/回调函数Callbacks/
作者
Candy
发布于
2025年10月9日
更新于
2025年10月9日
许可协议