恶意的Loader和PIS(Position-Independent Shellcode)会使用各种技术来绕过AV/EDR和安全人员的分析,其中代码执行这个环节经常会通过“回调函数”的方式来隐蔽的执行。回调的本质是将函数A的地址传给函数B,在函数B执行的过程中,触发某个条件后,停下来执行函数A

回调分为异步的和同步的

异步的回调例如,鼠标移动时,对应的Hook被触发,Hook处理的同时,鼠标继续移动

同步的回调例如,函数A要读取数据B,触发某个条件后,函数C修改数据B,然后函数A继续读取数据B

下面是一个回调函数的示例

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

// 声明窗口过程回调函数,用于处理窗口消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// 注册窗口类
// 定义并初始化一个常量、宽字符数组
const wchar_t CLASS_NAME[] = L"Sample Window Class";

// 向操作系统注册一种名为CLASS_NAME的新窗口类型,这种类型的窗口属于当前应用程序实例hInstance,并且所有发送给这类窗口的消息都由WindowProc函数来处理
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc; // 设置回调函数
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);

// 创建窗口
HWND hwnd = CreateWindowEx(
0, // 扩展窗口样式
CLASS_NAME, // 窗口类
L"回调函数示例", // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口样式
CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, // 位置和大小
NULL, // 父窗口
NULL, // 菜单
hInstance, // 实例句柄
NULL // 附加数据
);
if (hwnd == NULL) {
return 0;
}

// 显示窗口
ShowWindow(hwnd, nCmdShow);

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

return 0;
}

// 窗口过程回调函数实现
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);

// 在窗口上绘制文本
TextOut(hdc, 50, 50, L"这是一个回调函数示例", 9);

EndPaint(hwnd, &ps);

return 0;
}

case WM_LBUTTONDOWN:
MessageBox(hwnd, L"您点击了鼠标左键!", L"提示", MB_OK); // 鼠标左键点击时显示消息框
return 0;
}

return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

代码编译执行后,如下图
image
注释中已经讲的很清楚了,再补充两句,Windows开发中好多东西看着眼花缭乱,其实就是typedef定义的别名,比如这条语句中

1
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

CALLBACK就是__stdcall的别名,LRESULT是LONG_PTR的别名,而LONG_PTR会根据是64位还是32位,选择是__int64还是long,原型如下

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
typedef LONG_PTR LRESULT;

#if defined(_WIN64)
typedef __int64 LONG_PTR;
#else
typedef long LONG_PTR;
#endif

long:C/C++中基本的数据类型,有个需要注意的地方是,Windows下不管32位还是64位,long都是4字节有符号整数,但在Unix下long是8字节有符号整数

__int64:微软编译器(MSVC)特有的数据类型,8字节有符号整数

typedef unsigned int UINT;

// 在64位系统上 (_WIN64 defined)
typedef UINT_PTR WPARAM; // UINT_PTR 是64位无符号整型
typedef LONG_PTR LPARAM; // LONG_PTR 是64位有符号整型

// 在32位系统上
typedef UINT WPARAM; // UINT 是32位无符号整型
typedef LONG LPARAM; // LONG 是32位有符号整型

#define WINAPI __stdcall

HWND:窗口句柄,可以理解为指向窗口这个对象的类型

HINSTANCE:应用程序实例句柄,一个应用程序在内存中可以有多个实例(进程),每个实例(进程)都是独一无二的,可以理解为指向这个应用程序实例对象的类型

HMODULE:模块句柄,和HINSTANCE等价

每次有新的回调函数被发现,都会给安全分析人员带来挑战,因此恶意软件开发者经常研究新的回调函数,下面将尝试列出全部的回调函数(准确的说是微软和第三方网站记录的),有助于AV/EDR重点监控

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
acmDriverEnumCallback
acmDriverProc
acmFilterChooseHookProc
acmFilterEnumCallback
acmFilterTagEnumCallback
acmFormatChooseHookProc
acmFormatEnumCallback
acmFormatTagEnumCallback
acmStreamConvertCallback
AddInterface
AddPropSheetPageProc
AddSecureMemoryCacheCallback
agePaintHook
ageSetupHook
AllocateMemory
APCProc
ApplicationRecoveryCallback
ApplyCallbackFunction
asswordChangeNotify
asswordFilter
AuthzAccessCheckCallback
AuthzComputeGroupsCallback
AuthzFreeGroupsCallback
BindIoCompletionCallback
BlockConvertServicesToStatic
BlockDeleteStaticServices
BrowseCallbackProc
BufferCallback
CallWndProc
CallWndRetProc
capControlCallback
capErrorCallback
capStatusCallback
capVideoStreamCallback
capWaveStreamCallback
capYieldCallback
CBTProc
CCHookProc
CertChainFindByIssuerCallback
CertDllOpenStoreProv
CertEnumPhysicalStoreCallback
CertEnumSystemStoreCallback
CertEnumSystemStoreLocationCallback
CertStoreProvCloseCallback
CertStoreProvDeleteCertCallback
CertStoreProvDeleteCRLCallback
CertStoreProvDeleteCTL
CertStoreProvFindCert
CertStoreProvFindCRL
CertStoreProvFindCTL
CertStoreProvFreeFindCert
CertStoreProvFreeFindCRL
CertStoreProvFreeFindCTL
CertStoreProvGetCertProperty
CertStoreProvGetCRLProperty
CertStoreProvGetCTLProperty
CertStoreProvReadCertCallback
CertStoreProvReadCRLCallback
CertStoreProvReadCTL
CertStoreProvSetCertPropertyCallback
CertStoreProvSetCRLPropertyCallback
CertStoreProvSetCTLProperty
CertStoreProvWriteCertCallback
CertStoreProvWriteCRLCallback
CertStoreProvWriteCTL
CFHookProc
ClaimMediaLabel
CleanupGroupCancelCallback
ClientCallback
ClientCallback_Function
CloseServiceEnumerationHandle
CollectPerformanceData
CompletionProc
ConnectClient
ControlCallback
CopyProgressRoutine
CounterPathCallBack
CQPageProc
CreateServiceEnumerationHandle
CreateStaticService
CryptGetSignerCertificateCallback
CRYPT_ENUM_KEYID_PROP
CRYPT_ENUM_OID_FUNCTION
CRYPT_ENUM_OID_INFO
CRYPT_RETURN_HWND
CRYPT_VERIFY_IMAGE
CspGetDHAgreement
DavAuthCallback
DavFreeCredCallback
DavRegisterAuthCallback
DavUnregisterAuthCallback
DdeCallback
DdeEnableCallback
DeleteInterface
DeleteStaticService
DemandDialRequest
DhcpAddressDelHook
DhcpAddressOfferHook
DhcpControlHook
DhcpDeleteClientHook
DhcpHandleOptionsHook
DhcpNewPktHook
DhcpPktDropHook
DhcpPktSendHook
DhcpServerCalloutEntry
DialogProc
DigestFunction
DisassociateCurrentThreadFromCallback
DisconnectClient
DllCallbackProc
DllGetClassObject
DoUpdateRoutes
DoUpdateServices
DPA_DestroyCallback
DPA_EnumCallback
DrawStateProc
DriverCallback
DSA_DestroyCallback
DSA_EnumCallback
DSEnumAttributesCallback
EditStreamCallback
EditWordBreakProc
EditWordBreakProcEx
EmbeddedUIHandler
EnableCallback
EnhMetaFileProc
EnumCalendarInfoProc
EnumCalendarInfoProcEx
EnumCalendarInfoProcExEx
EnumChildProc
EnumCodePagesProc
EnumDateFormatsProc
EnumDateFormatsProcEx
EnumDateFormatsProcExEx
EnumDesktopProc
EnumDirTreeProc
EnumerateGetNextService
EnumerateLoadedModulesProc64
EnumFontFamExProc
EnumFontFamProc
EnumFontsProc
EnumGeoInfoProc
EnumICMProfilesProcCallback
EnumInputContext
EnumLanguageGroupLocalesProc
EnumLanguageGroupsProc
EnumLocalesProc
EnumLocalesProcEx
EnumMetaFileProc
EnumObjectsProc
EnumPageFilesProc
EnumRegisterWordProc
EnumResLangProc
EnumResNameProc
EnumResTypeProc
EnumThreadWndProc
EnumTimeFormatsProc
EnumTimeFormatsProcEx
EnumUILanguagesProc
EnumWindowsProc
EnumWindowStationProc
EventCallback
EventClassCallback
EventRecordCallback
Event_Handler_Function_Name
EVT_SUBSCRIBE_CALLBACK
ExportCallback
FaxLineCallback
FaxRouteAddFile
FaxRouteDeleteFile
FaxRouteEnumFile
FaxRouteEnumFiles
FaxRouteGetFile
FaxRouteModifyRoutingData
FaxRoutingInstallationCallback
FaxSendCallback
FAX_RECIPIENT_CALLBACK
FExecuteInAppDomainCallback
FiberProc
FileIOCompletionRoutine
FILE_RESTORE_CALLBACK
FindDebugInfoFileProc
FindExecutableImageProc
FLockClrVersionCallback
FlsCallback
FNCCERTDISPLAYPROC
FNCFILTERPROC
FNCMFILTERPROC
FNCMHOOKPROC
FNDAENUMCALLBACK
FNDPAENUMCALLBACK
FNDSAENUMCALLBACK
FNPEER_FREE_SECURITY_DATA
FNPEER_SECURE_RECORD
FNPEER_VALIDATE_RECORD
FN_AUTHENTICATION_CALLBACK
FN_AUTHENTICATION_CALLBACK_EX
FN_BLUETOOTH_ENUM_ATTRIBUTES_CALLBACK
FN_CDF_PARSE_ERROR_CALLBACK
FN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK
FN_CERT_DLL_OPEN_STORE_PROV_FUNC
FN_CERT_ENUM_PHYSICAL_STORE
FN_CERT_ENUM_SYSTEM_STORE
FN_CERT_STORE_PROV_CLOSE
FN_CERT_STORE_PROV_DELETE_CERT
FN_CERT_STORE_PROV_DELETE_CRL
FN_CERT_STORE_PROV_READ_CERT
FN_CERT_STORE_PROV_READ_CRL
FN_CERT_STORE_PROV_SET_CERT_PROPERTY
FN_CERT_STORE_PROV_SET_CRL_PROPERTY
FN_CERT_STORE_PROV_SET_CTL_PROPERTY
FN_CERT_STORE_PROV_WRITE_CERT
FN_CERT_STORE_PROV_WRITE_CRL
FN_CERT_STORE_PROV_WRITE_CTL
FN_CRYPT_XML_CREATE_TRANSFORM
FN_CRYPT_XML_DATA_PROVIDER_CLOSE
FN_CRYPT_XML_DATA_PROVIDER_READ
FN_CRYPT_XML_ENUM_ALG_INFO
FN_CRYPT_XML_WRITE_CALLBACK
FN_DEVICE_CALLBACK
FN_WdsCliCallback
FN_WdsCliTraceFunction
FN_WdsTransportClientReceiveContents
FN_WdsTransportClientReceiveMetadata
FN_WdsTransportClientSessionComplete
FN_WdsTransportClientSessionStart
FN_WdsTransportClientSessionStartEx
ForegroundIdleProc
FreeMemory
FRHookProc
FuncReturnhWnd
FunctionTableAccessProc64
FuncVerifyImage
GenerateGroupPolicy
GetApplicationRecoveryCallback
GetEventMessage
GetFirstOrderedService
GetGlobalInfo
GetInterfaceInfo
GetMfeStatus
GetModuleBaseProc64
GetMsgProc
GetNeighbors
GetNextOrderedService
GetRequest
GetResponse
GetServiceCount
GetSize
GetTSAudioEndpointEnumeratorForSession
gluNurbsCallback
gluQuadricCallback
gluTessCallback
GopherAttributeEnumerator
HandlerEx
HandlerRoutine
honeCallbackFunc
hone_Event
HyphenateProc
ICMProgressProcCallback
ImportCallback
InitHelperDll
InitializeChangeNotify
InitializeEmbeddedUI
InitOnceCallback
InsertAt
InstalluiHandler
InstalluiHandlerRecord
INSTALLUI_HANDLER
InterfaceStatus
InternetSetStatusCallback
InternetStatusCallback
INTERNET_STATUS_CALLBACK
IoCompletionCallback
IOProc
IsService
JournalPlaybackProc
JournalRecordProc
KeyboardProc
lineCallbackFunc
LineDDAProc
Line_Event
LOG_FULL_HANDLER_CALLBACK
LOG_TAIL_ADVANCE_CALLBACK
LOG_UNPINNED_CALLBACK
LowLevelKeyboardProc
LowLevelMouseProc
LPCQADDFORMSPROC
LPCQADDPAGESPROC
LPCQPAGEPROC
LPDISPLAYVAL
LPDSENUMATTRIBUTES
LPEVALCOMCALLBACK
LPFNDFMCALLBACK
LPFNVIEWCALLBACK
MagGetImageScalingCallback
MagImageScalingCallback
MagSetImageScalingCallback
MappingCallbackProc
MaxMediaLabel
MessageProc
MFAddPeriodicCallback
MFInvokeCallback
MFPERIODICCALLBACK
MFRemovePeriodicCallback
MgmCreationAlertCallback
MgmDisableIgmpCallback
MgmJoinAlertCallback
MgmLocalJoinCallback
MgmLocalLeaveCallback
MgmPruneAlertCallback
MgmRpfCallback
MgmWrongIfCallback
MGM_ENABLE_IGMP_CALLBACK
MibCreate
MibDelete
MIBEntryCreate
MIBEntryDelete
MIBEntryGet
MIBEntryGetFirst
MIBEntryGetNext
MIBEntrySet
MibGet
MibGetFirst
MibGetNext
MibGetTrapInfo
MibSet
MibSetTrapInfo
MidiInProc
MidiOutProc
MiniDumpCallback
MMCFreeNotifyHandle
MMCPropertyChangeNotify
MMCPropertyHelp
MMCPropPageCallback
MMIOProc
MonitorEnumProc
MouseProc
MRUCMPPROC
MyStatusProc
OFNHookProc
OFNHookProcOldStyle
OpenPerformanceData
ORASADFunc
OutOfProcessExceptionEventCallback
OutOfProcessExceptionEventDebuggerLaunchCallback
OutOfProcessExceptionEventSignatureCallback
OutputProc
PIO_APC_ROUTINE
QueryPower
RadiusExtensionFreeAttributes
RadiusExtensionInit
RadiusExtensionProcess
RadiusExtensionProcess2
RadiusExtensionProcessEx
RadiusExtensionTerm
RASADFunc
RasAdminAcceptNewConnection
RasAdminConnectionHangupNotification
RasAdminGetIpAddressForUser
RasAdminReleaseIpAddress
RasCustomDeleteEntryNotify
RasCustomDial
RasCustomDialDlg
RasCustomEntryDlg
RasCustomHangUp
RasCustomScriptExecute
RasDialFunc
RasDialFunc1
RasDialFunc2
RasEapBegin
RasEapEnd
RasEapFreeMemory
RasEapGetIdentity
RasEapGetInfo
RasEapInitialize
RasEapInvokeConfigUI
RasEapInvokeInteractiveUI
RasEapMakeMessage
RasFreeBuffer
RasGetBuffer
RasPBDlgFunc
RasReceiveBuffer
RasRetrieveBuffer
RasSecurityDialogBegin
RasSecurityDialogEnd
RasSendBuffer
RasSetCommSettings
ReaderScroll
ReadProcessMemoryProc64
RegisterApplicationRecoveryCallback
RegisterCallback
RegisterProtocol
RegisterWaitChainCOMCallback
RemoveAt
RemoveSecureMemoryCacheCallback
RemoveTraceCallback
rintHookProc
RM_WRITE_STATUS_CALLBACK
rocessGroupPolicy
rocessGroupPolicyEx
rogressNotificationCallback
ropEnumProc
ropEnumProcEx
ropSheetPageProc
ropSheetProc
RpcAuthKeyRetrievalFn
RpcMgmtAuthorizationFn
RpcnotificationRoutine
RpcObjectInqFn
RPC_IF_CALLBACK_FN
RtlInstallFunctionTableCallback
RTM_ENTITY_EXPORT_METHOD
RTM_EVENT_CALLBACK
SampleCommand
SampleCommit
SampleConnect
SampleDump
SampleOsVersionCheck
SampleStartHelper
SampleStop
SampleStopHelper
SceSvcAttachmentAnalyze
SceSvcAttachmentConfig
SceSvcAttachmentUpdate
SecureMemoryCacheCallback
SendAsyncProc
SendMessageCallback
ServiceMain
SetAt
SetGlobalInfo
SetInterfaceInfo
SetInterfaceReceiveType
SetLineRecoCallback
SetPower
SetProviderStatusFunc
SetProviderStatusInfoFreeFunc
SetResponseType
SetTraceCallback
SetupDefaultQueueCallback
SetupHookProc
SetupInitDefaultQueueCallback
SetupTermDefaultQueueCallback
ShellProc
ShutdownEmbeddedUI
SimpleCallback
SNMPAPI_CALLBACK
SnmpExtensionClose
SnmpExtensionInit
SnmpExtensionInitEx
SnmpExtensionMonitor
SnmpExtensionQuery
SnmpExtensionQueryEx
SnmpExtensionTrap
SoundSentryProc
SP_FILE_CALLBACK
StackSnapshotCallback
StartComplete
StartProtocol
StatusCallback
StatusMessageCallback
StatusRoutine
StopProtocol
SymEnumerateModulesProc64
SymEnumerateSymbolsProc64
SymEnumLinesProc
SymEnumProcessesProc
SymEnumSourceFilesProc
SymEnumSourceFileTokensProc
SymEnumSymbolsProc
SymFindFileInPathProc
SymRegisterCallback
SymRegisterCallbackProc64
SymRegisterFunctionEntryCallback
SymRegisterFunctionEntryCallbackProc64
SyncUpdateProc
SysMsgProc
TaskDialogCallbackProc
ThreadProc
TimeProc
TimeProvClose
TimeProvCommand
TimeProvOpen
TimerAPCProc
TimerCallback
TimerProc
TranslateAddressProc64
TranslateDispatch
TrySubmitThreadpoolCallback
UiaEventCallback
UiaProviderCallback
UiaRegisterProviderCallback
UmsSchedulerProc
UnbindInterface
UndeleteFile
UnregisterApplicationRecoveryCallback
ValidateRoute
VectoredHandler
VERIFYSERVERCERT
WaitCallback
WaitChainCallback
WaitOrTimerCallback
waveInProc
waveOutProc
WdsTransportClientRegisterCallback
WdsTransportProviderCloseContent
WdsTransportProviderCloseInstance
WdsTransportProviderCompareContent
WdsTransportProviderCreateInstance
WdsTransportProviderDumpState
WdsTransportProviderGetContentMetadata
WdsTransportProviderGetContentSize
WdsTransportProviderInitialize
WdsTransportProviderOpenContent
WdsTransportProviderReadContent
WdsTransportProviderRefreshSettings
WdsTransportProviderShutdown
WdsTransportProviderUserAccessCheck
WdsTransportServerRegisterCallback
WinBioCaptureSampleWithCallback
WinBioEnrollCaptureWithCallback
WinBioIdentifyWithCallback
WinBioLocateSensorWithCallback
WinBioVerifyWithCallback
WindowProc
WinEventProc
WinHttpSetStatusCallback
WINHTTP_STATUS_CALLBACK
WLAN_NOTIFICATION_CALLBACK
WorkCallback
WPUQueryBlockingCallback
xeProviderInitialize
xeProviderRecvRequest
xeProviderServiceControl
xeProviderShutdown
xeRegisterCallback