CreateTimerQueueTimer 参数与 WinAPI 不同

逆向工程 部件 恶意软件 登录 调用约定
2021-07-03 11:50:51

我正在阅读有关 CreateTimerQueueTimer的手册页

BOOL CreateTimerQueueTimer(
  PHANDLE             phNewTimer,
  HANDLE              TimerQueue,
  WAITORTIMERCALLBACK Callback,
  PVOID               DueTime,
  DWORD               Period,
  DWORD               Flags,
  ULONG               Parameter
);

该文档指出:

时期

计时器的周期,以毫秒为单位。如果该参数为零,则定时器被发送一次信号。

所以我需要将它设置为 0 以避免定期执行回调。问题是修改period值对周期性没有影响。一旦加载到 OllyDBG 中,Olly 重建参数和调用给我这个函数签名:

BOOL CreateTimerQueueTimer(
 PHANDLE             phNewTimer,
 HANDLE              TimerQueue,
 WAITORTIMERCALLBACK Callback,
 ULONG               Parameter,
 PVOID               DueTime,
 DWORD               Period,
 DWORD               Flags
);

请注意,parameter参数改变了位置,因此我所有的补丁都没有用。我猜这个错误可能是由于旧版本的 API 导致Parameter参数在第 4 位,但我可能是错的。另外,我找不到旧的 WinAPI 来证实我的说法。我猜对了还是我错过了什么?

1个回答

是的,我想我以前见过类似的案例。这种情况很少发生,但是因为您可以在 C 预处理器级别和链接器级别做一些特技,所以这碰巧有效。

在这种情况下,我在 3790.1830 DDK (Windows 2003 Server) 和几个较新的 WDK 和 SDK 中查找。

Windows 2000/XP 目标(3790.1830/inc/w2k/winbase.h3790.1830/inc/wxp/winbase.h

WINBASEAPI
BOOL
WINAPI
CreateTimerQueueTimer(
    PHANDLE phNewTimer,
    HANDLE TimerQueue,
    WAITORTIMERCALLBACK Callback,
    PVOID Parameter,
    DWORD DueTime,
    DWORD Period,
    ULONG Flags
    ) ;  

Windows 2003/Vista/7 目标(3790.1830/inc/wnet/winbase.h6001.18002/inc/api/WINBASE.H7600.16385.1/inc/api/WINBASE.H

WINBASEAPI
BOOL
WINAPI
CreateTimerQueueTimer(                                                                                                                                                                                             
    __deref_out PHANDLE phNewTimer,
    __in_opt    HANDLE TimerQueue,
    __in        WAITORTIMERCALLBACK Callback,
    __in_opt    PVOID Parameter,
    __in        DWORD DueTime,
    __in        DWORD Period,
    __in        ULONG Flags 
    ) ;   

使用 Windows 8.1 SDK ...

... 这个 API 移到另一个标题中:(Include/um/threadpoollegacyapiset.h查看有关 API 集的研究)。

WINBASEAPI
BOOL
WINAPI
CreateTimerQueueTimer(
    _Outptr_ PHANDLE phNewTimer,
    _In_opt_ HANDLE TimerQueue,
    _In_ WAITORTIMERCALLBACK Callback,
    _In_opt_ PVOID Parameter,
    _In_ DWORD DueTime,
    _In_ DWORD Period,
    _In_ ULONG Flags
    );  

...所以直到现在都没有变化(除了采用 SAL2 注释)。

对于 Windows 10 SDKs 10.0.10240.0, 10.0.16299.0, 10.0.17134.0, 10.0.17134.0, 10.0.17763.0, 10.0.18162.0 对于 Windows,它的参数仍然具有相同的顺序。因此,您遇到文档问题而不是此处的实际更改是有道理的。

没有未决的或旧的(和关闭)拉请求提的这个功能,所以你可能要考虑派之一。