无法实现密码过滤

时间:2012-05-05 09:52:01

标签: c++ c security winapi

我尝试实现密码过滤,所以我写了一个简单的密码过滤器。 我按照MSDN中的文档进行操作,并确保正确声明了这些函数。 我在VS 2010中编译。


.def文件:

LIBRARY myFilt
EXPORTS
   InitializeChangeNotify
   PasswordFilter
   PasswordChangeNotify

.cpp文件:

#include <windows.h>
#include <stdio.h>
#include <ntsecapi.h>

void writeToLog(const char* szString)
{
    FILE* pFile = fopen("c:\\work\\logFile.txt", "a+");
    if (NULL == pFile)
    {
        return;
    }
    fprintf(pFile, "%s\r\n", szString);
    fclose(pFile);
    return;
}

// Default DllMain implementation
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    OutputDebugString(L"DllMain");
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}
BOOLEAN __stdcall InitializeChangeNotify(void)
{
    OutputDebugString(L"InitializeChangeNotify");
    writeToLog("InitializeChangeNotify()");
    return TRUE;
}

BOOLEAN __stdcall PasswordFilter(
  PUNICODE_STRING AccountName,
  PUNICODE_STRING FullName,
  PUNICODE_STRING Password,
  BOOLEAN SetOperation
)
{
    OutputDebugString(L"PasswordFilter");
    return TRUE;
}

NTSTATUS __stdcall PasswordChangeNotify(
  PUNICODE_STRING UserName,
  ULONG RelativeId,
  PUNICODE_STRING NewPassword
)
{
    OutputDebugString(L"PasswordChangeNotify");
    writeToLog("PasswordChangeNotify()");
    return 0;
}

我将myFilt.dll放入%windir%\system32,将“myFilt”添加到注册表中的“Notification Packages”,重新启动计算机,更改密码,没有任何反应。

我打开了depends.exe,发现函数是正确的:

InitializeChangeNotify
PasswordChangeNotify
PasswordFilter

错误在哪里?

感谢。

2 个答案:

答案 0 :(得分:1)

  

我发现了问题!我将运行时库从多线程调试DLL(/ MDd)更改为多线程调试(/ MTd),它完美无缺! :)

     

- user1375970 5月5日10:38

答案 1 :(得分:0)

通知包 指定设置或更改密码时加载或调用的动态链接库(DLL)。要指定多个文件,请在每个文件名之间按Enter键,将文件名一个列在另一个上面。

高于另一个!