用户更改密码时调用哪个 Windows API?挂钩这个 API 的好方法是啥?

Posted

技术标签:

【中文标题】用户更改密码时调用哪个 Windows API?挂钩这个 API 的好方法是啥?【英文标题】:Which windows API call when the user change password? what the good way to hook this API?用户更改密码时调用哪个 Windows API?挂钩这个 API 的好方法是什么? 【发布时间】:2016-05-31 11:48:02 【问题描述】:

我想知道用户何时尝试更改他的密码,甚至挂钩此功能。

我知道有GINA 选项,它已从Vista 替换为ICredentialProvider。 但是在这两个中,我没有找到一个无论如何都会调用的特定 API,或者每个方法都有一个函数,当用户更改密码时会调用它。 我想为特定的API实现DLL代理(我会找到它之后),有没有更好的方法来实现这个钩子,捕捉更改密码的用户并修改它?

此外,在我的研究中,我发现了这个函数 更改帐户密码

还可以参考 SpInitialize 函数以及可能的相关参数:

typedef struct SECPKG_FUNCTION_TABLE 
...
SpSetExtendedInformationFn       *SpChangeAccountPasswordFn;
...
;

有什么建议吗?

谢谢

【问题讨论】:

如果您在问题中添加语言标签会有所帮助。但是无论如何,您想参与密码更改吗?这听起来不太安全。 你真的太努力了。当你可以输入任何你喜欢的密码时,为什么还要找回密码 (Silly debugger tricks: Using KD to reset a forgotten administrator password)。 有什么意义?如果您想知道用户何时更改密码,请使用事件日志。使用组策略控制用户更改密码的方式/时间。没有可以想象的理由来挂钩这个 API。 Password Filters。不需要钩任何东西。更不用说允许设置挂钩将允许您进程安全级别的任何人窥探系统上的所有密码更改。你会把密封舱口的门炸掉。 【参考方案1】:

是的,SpChangeAccountPasswordFn 确实在 LSASS.EXE 中调用。这个例程通常调用

NTSTATUS
NTAPI
SamChangePasswordUser2(IN PUNICODE_STRING ServerName,
                       IN PUNICODE_STRING UserName,
                       IN PUNICODE_STRING OldPassword,
                       IN PUNICODE_STRING NewPassword);

来自 samlib.dll(这是导出的函数)。但最常见和最有趣的钩子点:

BOOLEAN NTAPI LsaINotifyPasswordChanged(
  IN PVOID OPTIONAL, 
  IN PUNICODE_STRING ServerName,
  IN PUNICODE_STRING UserName,
  PVOID OPTIONAL,
  PVOID OPTIONAL,
  IN PUNICODE_STRING OldPassword,
  IN PUNICODE_STRING NewPassword);

此函数从 lsasrv.dll 导出,通常从 SpChangeAccountPasswordFn 调用。它呈现从 xp 到最新的 win10。但 xp 中的签名与更高版本不同(1 参数移至 7 位)

【讨论】:

以上是关于用户更改密码时调用哪个 Windows API?挂钩这个 API 的好方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

c# 用Windows API CreateThread函数如何创建的线程

绑定到用户控件中的依赖属性并在嵌套属性更改时调用 CanExecute

Windows 8/10 API 检测挂起的进程

桌面窗口集合更改时调用异步委托?

Windows 哈希密码

windows 2008 r2怎么修改用户密码