nt5src去除激活的winlogon
最近在研究nt5src代码,一直困惑在激活的问题上。其实,只要有winlogon.exe的源代码就没有问题啦!(废话)
原指南上有两个版本的winlogon:
1、“Winlogon200X_v3c.zip”这个轻松编译完成(需要先编译“win2003_pidgenXP_cracked.zip”),但是这个程序很多bug,登录后配置经常出问题,还有莫名的bug,估计是2000的机制与2003差异太大了。不推荐大家研究它。
2、“ds.zip_decompiled_XPSP1_winlogon.zip”这个是编译不通过的。经过我研究后,终于编译通过,而且经过测试完美的解除了激活的问题。而且这个不需要“win2003_pidgenXP_cracked.zip”。
具体修改过程如下:
1、编译“licensing”目录
先修改目录“ds\security\licensing\explib”下面的文件“sources”,增加include头文件搜素位置
INCLUDES=$(BASE_INC_PATH);$(TERMSRV_INC_PATH);$(SDK_INC_PATH)\crt\stl60;
增加“includes”搜索目录“$(SDK_INC_PATH)\crt\stl60;”(红色字体部分),实际缺少“utility、xutility”文件的搜索位置,该两条文件在目录“public\sdk\inc\crt\stl60”下。
进入到“ds\security\licensing”下,进行编译“build /cZP”
2、编译“winlogon”
在编译“winlogon.exe”前需要修改目录“ds\security\gina\winlogon”下五条文件,修改的地方分别如下:
2.1、sclogon2.c
找到以下几个函数的实现地方
NTSTATUS s_RPC_ScHelperGetProvParam(
handle_t h,
BINDING_CONTEXT BindingContext,
LPCWSTR wszPIN,
DWORD dwParam,
DWORD *pdwDataLen,
OUT_BUFFER1 *pbData,
DWORD dwFlags)
NTSTATUS s_RPC_ScHelperSignMessage(
handle_t h,
BINDING_CONTEXT BindingContext,
LPCWSTR wszPIN,
ULONG Algorithm,
ULONG BufferLength,
BYTE *Buffer,
ULONG *pSignatureLength,
OUT_BUFFER2 *pSignature)
NTSTATUS s_RPC_ScHelperSignPkcsMessage(
handle_t h,
BINDING_CONTEXT BindingContext,
LPCWSTR wszPIN,
LPSTR AlgorithmPszObjId,
DWORD AlgorithmParametersLength,
BYTE *AlgorithmParameters,
DWORD dwSignMessageFlags,
ULONG BufferLength,
BYTE *Buffer,
ULONG *pSignedBufferLength,
OUT_BUFFER2 *pSignedBuffer)
NTSTATUS s_RPC_ScHelperDecryptMessage(
handle_t h,
BINDING_CONTEXT BindingContext,
LPCWSTR wszPIN,
ULONG CipherLength,
BYTE *CipherText,
ULONG *pClearTextLength,
OUT_BUFFER2 *pClearText)
把函数以上函数的定义修改成如下(原来的定义3790头文件函数定义不一致)
NTSTATUS s_RPC_ScHelperGetProvParam(
/* [in] */ handle_t h,
/* [in] */ BINDING_CONTEXT BindingContext,
/* [unique][in] */ LPCWSTR wszPIN,
/* [in] */ BOOL fBindingIsCertAndKey,
/* [in] */ DWORD dwParam,
/* [out][in] */ DWORD *pdwDataLen,
/* [out] */ OUT_BUFFER1 *pbData,
/* [in] */ DWORD dwFlags)
NTSTATUS s_RPC_ScHelperSignMessage(
/* [in] */ handle_t h,
/* [in] */ BINDING_CONTEXT BindingContext,
/* [unique][in] */ LPCWSTR wszPIN,
/* [in] */ BOOL fBindingIsCertAndKey,
/* [in] */ ULONG Algorithm,
/* [in] */ ULONG BufferLength,
/* [size_is][in] */ BYTE *Buffer,
/* [out][in] */ ULONG *pSignatureLength,
/* [out] */ OUT_BUFFER2 *pSignature)
NTSTATUS s_RPC_ScHelperSignPkcsMessage(
/* [in] */ handle_t h,
/* [in] */ BINDING_CONTEXT BindingContext,
/* [unique][in] */ LPCWSTR wszPIN,
/* [in] */ BOOL fBindingIsCertAndKey,
/* [in] */ LPSTR AlgorithmPszObjId,
/* [in] */ DWORD AlgorithmParametersLength,
/* [size_is][unique][in] */ BYTE *AlgorithmParameters,
/* [in] */ DWORD dwSignMessageFlags,
/* [in] */ ULONG BufferLength,
/* [size_is][in] */ BYTE *Buffer,
/* [out][in] */ ULONG *pSignedBufferLength,
/* [out] */ OUT_BUFFER2 *pSignedBuffer)
LONG s_RPC_ScHelperDecryptMessage(
/* [in] */ handle_t h,
/* [in] */ BINDING_CONTEXT BindingContext,
/* [unique][in] */ LPCWSTR wszPIN,
/* [in] */ BOOL fBindingIsCertAndKey,
/* [in] */ ULONG CipherLength,
/* [size_is][in] */ BYTE *CipherText,
/* [out][in] */ ULONG *pClearTextLength,
/* [out] */ OUT_BUFFER2 *pClearText)
它们都是缺少一个参数。再在当前文件,搜素以下代码
Status = ScHelperGetProvParam(
pucPIN,
pContext->pbLogonInfo,
dwParam,
pbData->pb,
pdwDataLen,
dwFlags);
把它修改成以下(也是缺少一个参数)
Status = ScHelperGetProvParam(
pucPIN,
pContext->pbLogonInfo,
0,
dwParam,
pbData->pb,
pdwDataLen,
dwFlags);
2.2、termutil.c
分别在函数“DeferredTSNotify”和“MultiUserLogonAttempt”增加变量“BOOLEAN bRes;”
BOOLEAN bRes;
然后在函数“DeferredTSNotify”里找到以下代码
if (!_WinStationNotifyLogon(
(BOOLEAN)TestTokenForAdmin(g_TSNotifyData.UserToken),
g_TSNotifyData.UserToken,
g_TSNotifyData.DomainName,
g_TSNotifyData.UserName,
L"",
0,
&g_pTerminals->MuGlobals.UserConfig))
并修改成以下这样(也是因为实现代码的函数参数定义与头文件不一致)
if (!_WinStationNotifyLogon(
(BOOLEAN)TestTokenForAdmin(g_TSNotifyData.UserToken),
g_TSNotifyData.UserToken,
g_TSNotifyData.DomainName,
g_TSNotifyData.UserName,
L"",
0,
&g_pTerminals->MuGlobals.UserConfig,&bRes))
再在函数“MultiUserLogonAttempt”找到以下代码
if (!IsAppServer()) {
WinStaResult = _WinStationNotifyLogon(
(BOOLEAN)TestTokenForAdmin(hToken), hToken, pMprInfo->pszDomain,
pMprInfo->pszUserName, L"", 0, &pTerm->MuGlobals.UserConfig);
} else {
WinStaResult = _WinStationNotifyLogon(
(BOOLEAN)TestTokenForAdmin(hToken), hToken, pMprInfo->pszDomain,
pMprInfo->pszUserName, pMprInfo->pszPassword, 0, &pTerm->MuGlobals.UserConfig);
}
并修改成这样
if (!IsAppServer()) {
WinStaResult = _WinStationNotifyLogon(
(BOOLEAN)TestTokenForAdmin(hToken), hToken, pMprInfo->pszDomain,
pMprInfo->pszUserName, L"", 0, &pTerm->MuGlobals.UserConfig,&bRes);
} else {
WinStaResult = _WinStationNotifyLogon(
(BOOLEAN)TestTokenForAdmin(hToken), hToken, pMprInfo->pszDomain,
pMprInfo->pszUserName, pMprInfo->pszPassword, 0, &pTerm->MuGlobals.UserConfig,&bRes);
}
2.3、win31mig.c
这里主要是处理win31和win9x升级到xp的登录问题,应该没有人这么做了,直接屏蔽算了别折腾啦!找到以下两个函数
INT_PTR WINAPI
Win31MigrationDlgProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam
)
BOOL
Windows31Migration(
PTERMINAL pTerm
)
直接返回就好啦!
return FALSE;
2.4、winlogon.c
在函数“MiscInitialization”内找到以下代码
if (!IsWin9xUpgrade()) {
//
// Check to see if there is any WIN.INI or REG.DAT to migrate into
// Windows/NT registry.
//
// This code is skipped when the previous OS was Win9x.
//
Win31MigrationFlags = QueryWindows31FilesMigration( Win31SystemStartEvent );
if (Win31MigrationFlags != 0) {
SynchronizeWindows31FilesAndWindowsNTRegistry( Win31SystemStartEvent,
Win31MigrationFlags,
NULL,
NULL
);
InitSystemFontInfo();
}
}
直接把它注释掉就好啦!不处理win31升级的问题(主要是函数“QueryWindows31FilesMigration”实在找不到办法破解出来)。
2.5、wlx.c
重点来啦!其实我们要找的wpa激活相关的代码就在这里。在函数“DoStartShell”里面找以下代码
if (FAILED(sub_1049CA1(
pWS->hdeskWinlogon,
pWS->hdeskApplication,
szDesktop,
pWS->UserProcessData.pEnvironment,
pWS->UserProcessData.UserToken,
pTerm->hwndSAS,
TRUE,
FALSE,
&dwDaysForActivate,
&dwDaysForEval,
pWlxResult)))
这个“sub_1049CA1”是wpa相关dll的函数动态内存地址(我还没有找到是对应那个dll的函数),把它注释掉,不要执行就不会进行激活验证了。然后记得把激活成功后,后续的登录流程代码继续执行
sub_10432CC(978, 1);
sub_10432CC(977, 1);
KillTimer(pTerm->hwndSAS, 977);
以上都修改完成后,就可以顺利编译成功“winlogon.exe”。我亲测,可以完美登录,只要你安装的时候有正确的cdkey,运行了2个小时也不会有提示激活。
- - - - - - - - - - - - -
PS
下一步的研究是最。。最。。大的工作量!把E文版翻译,并编译成中文版的3790。感兴趣的伙伴们可以一起参与,当然这是没有报酬的 ^_^。有感兴趣的伙伴们请留言或发邮件“2098310613@qq.com”联系我!