首页
社区
课程
招聘
[原创]nt5src去除激活的winlogon
2022-10-11 22:46 16241

[原创]nt5src去除激活的winlogon

2022-10-11 22:46
16241

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”联系我!



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞8
打赏
分享
最新回复 (12)
雪    币: 229
活跃值: (235)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
psj_pediy 2022-10-12 11:33
2
1
抱歉漏了一个修改的地方。
还需要把“ds\security\common\sclgnrpc\sclgnrpc.idl”文件里面的三个函数定义删除掉(因为没有实现代码),具体函数名称为:
NTSTATUS RPC_ScHelper_CryptAcquireCertificatePrivateKey(

NTSTATUS RPC_ScHelper_CryptSetProvParam(

NTSTATUS RPC_ScHelper_CryptReleaseContext(
雪    币: 30090
活跃值: (2037)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2022-10-12 17:39
3
0


不错的贴子。

最后于 2022-10-12 22:38 被bestbird编辑 ,原因: 无
雪    币: 6
活跃值: (2925)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
咖啡_741298 2022-10-12 19:30
4
0
bestbird 有一段时间,用Delphi把什么lsass、winlogon、termsrv都实现了一次,纯粹为了练习。后来,觉得没什么意思。。。http://www.138soft.com/winlogon.htm
难道是陈惊涛?
雪    币: 310
活跃值: (1917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niuzuoquan 2022-10-31 10:32
5
0
mark
雪    币: 6
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
梦中蝶舞 2024-1-5 19:16
6
0
我也在编译Windows XP SP1 和 Windows Server 2003,并且编译成功了。
雪    币: 6
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
梦中蝶舞 2024-1-31 21:48
7
0
bestbird 不错的贴子。
D:\srv03rtm\ds\security\common\sclgnrpc\obj\i386\sclgnrpc_c.c
他们在这个文件中实现,但我不知道怎么链接。
雪    币: 6
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
梦中蝶舞 2024-1-31 21:49
8
0
psj_pediy 抱歉漏了一个修改的地方。 还需要把“ds\security\common\sclgnrpc\sclgnrpc.idl”文件里面的三个函数定义删除掉(因为没有实现代码),具体函数名称为: NTSTA ...
D:\srv03rtm\ds\security\common\sclgnrpc\obj\i386\sclgnrpc_c.c
他们在这个文件中实现,但我不知道怎么链接。
雪    币: 6
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
梦中蝶舞 2024-2-1 00:58
9
0
psj_pediy 抱歉漏了一个修改的地方。 还需要把“ds\security\common\sclgnrpc\sclgnrpc.idl”文件里面的三个函数定义删除掉(因为没有实现代码),具体函数名称为: NTSTA ...
这个问题我解决了,只需要编辑D:\srv03rtm\ds\security\common\sclgnrpc\source中的
MIDL_FLAGS=$(MIDL_FLAGS) -prefix server "s_"
修改为
MIDL_FLAGS=$(MIDL_FLAGS) -prefix server 
就是删除前缀“s_”

然后修改sclogon2.c
s_IRPCSCLogon_v1_0_s_ifspec
修改为:
IRPCSCLogon_v1_0_s_ifspec

问题就出在函数名不匹配
雪    币: 6
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
梦中蝶舞 2024-2-1 01:08
10
0
psj_pediy 抱歉漏了一个修改的地方。 还需要把“ds\security\common\sclgnrpc\sclgnrpc.idl”文件里面的三个函数定义删除掉(因为没有实现代码),具体函数名称为: NTSTA ...
我根据你的教程修改成功的版本 :https://download.csdn.net/download/MYMOTOE6/88799395?spm=1001.2014.3001.5501
雪    币: 19299
活跃值: (28933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2024-2-1 09:27
11
1
感谢分享
雪    币: 30090
活跃值: (2037)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
bestbird 2024-2-3 23:48
12
0

为什么你们总是说没有winlogon?奇怪

最后于 2024-2-4 17:23 被bestbird编辑 ,原因:
雪    币: 6
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
梦中蝶舞 2024-2-4 01:12
13
0
bestbird 为什么你们总是说没有winlogon?奇怪
泄露的源码中是没有的,你这从哪来?
游客
登录 | 注册 方可回帖
返回