使用CryptUnprotectData解密WEP wlan profile密钥[英] Decrypt WEP wlan profile key using CryptUnprotectData

本文是小编为大家收集整理的关于使用CryptUnprotectData解密WEP wlan profile密钥的处理方法,想解了使用CryptUnprotectData解密WEP wlan profile密钥的问题怎么解决?使用CryptUnprotectData解密WEP wlan profile密钥问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我试图解密使用WEP配置文件的键<一个href=\"http://msdn.microsoft.com/en-us/library/windows/desktop/aa380882%28v=vs.85%29.aspx\">CryptUnprotectData.我取配置文件密钥的方式是通过使用netsh的导出信息.

 的netsh wlan的导出配置文件名称="MyWEP"文件夹="./"

目前,我手动从netsh命令我的程序生成的.xml文件复制的关键材料.而且,我解密的方法是 -

  DATA_BLOB DATAOUT,DataVerify;
DataOut.cbData = encryptData.length();
DataOut.pbData =(BYTE *)("I_Manually_Copy_The_WEP_Key_Here");如果(CryptUnprotectData(安培; DATAOUT,
                        空值,
                        空值,
                        空值,
                        空值,
                        0,
                        &安培; DataVerify))
{
    的printf("解密的数据:%S \\ n",DataVerify.pbData);
}
其他
{
    的printf("失败错误code:%d个",GetLastError函数());
}

但我得到的错误code 13 引用无效数据.我究竟做错了什么?在Win 7后,我可以直接使用<一个href=\"http://msdn.microsoft.com/en-us/library/windows/desktop/ms706738%28v=vs.85%29.aspx\">WlanGetProfile与参数的 WLAN_PROFILE_GET_PLAINTEXT_KEY .但我有否在 Vista的比使用CryptUnprotectData功能选项.我见过类似的帖子<一个href=\"http://social.msdn.microsoft.com/Forums/en/vistawirelesssdk/thread/ad10453a-68a8-4f69-bcc8-76aeae9085f7\">here, <一href=\"http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/7815b530-65e7-4404-888a-02d929439094/\">here但并没有得到很多有用的信息.另外,我使用与凭据相同的用户登录同一系统.可能任何一个请建议我如何进行呢?

PS:我已经张贴在Windows桌面SDK论坛同样的问题,但没有得到回应呢.试穿,所以我的运气了.


解决方案

我喜欢Windows安全问题.所以,如果我偶尔看到这样一个我试图解决这个问题.

在你的情况你做已经是第一步中的Netsh.exe WLAN导出配置文件... 的使用,以从XML文件中的WLAN配置文件导出数据.该文件包含&LT; keyMaterial&GT; 元素.元素里面的数据都设有codeD为十六进制的二进制数据:(类似 01000000D08C9DDF0115D1118C7A00C0 ... )

所以,你需要做的首先是什么脱code中的字符串二进制数据.您可以使用<一个href=\"http://msdn.microsoft.com/en-us/library/windows/desktop/aa380285%28v=vs.85%29.aspx\">CryptStringToBinary与 CRYPT_STRING_HEX 参数脱code中的字符串为二进制.

下一步将填补 DATA_BLOB 二进制数据,并调用 CryptUnprotectData 来得到结果,但... ...有小问题.你怎么可以在<一个文档中读取href=\"http://msdn.microsoft.com/en-us/library/windows/desktop/ms706738%28v=vs.85%29.aspx\">WlanGetProfile以下


  

在默认情况下,在 keyMaterial 元素返回在配置文件指出,
  通过的 pstrProfileXml 的加密.如果你的程序在运行
  在同一台计算机上的本地系统帐户的情况下,那么你可以
  通过调用 CryptUnprotectData 功能键解密的材料.


  
  

Windows Server 2008和Windows Vista中:在 keyMaterial 元素
  在配置模式返回所指向的 pstrProfileXml 的是
  始终加密.如果你的进程的上下文中运行
  本地系统帐户,那么您可以通过调用解密密钥材料
  在 CryptUnprotectData 功能.


所以要能解密我们要调用<一个关键href=\"http://msdn.microsoft.com/en-us/library/windows/desktop/aa380882%28v=vs.85%29.aspx\">CryptUnprotectData在本地系统的安全上下文.如果你的程序已经下运行的本地系统上下文,你能够直接做到这一点.如果不是这样,但是你拥有管理权限,或者至少有调试权限,您可以从计算机上运行的其他进程"借用"在本地系统标记.例如,一个可以得到"的winlogon.exe"进程的进程令牌并模拟它.

下面的演示程序枚举使用过程<一href=\"http://msdn.microsoft.com/en-us/library/windows/desktop/ms724509%28v=vs.85%29.aspx\">NtQuerySystemInformation方法(见我的老答案),我亲自preFER.我们可以使用<一个href=\"http://msdn.microsoft.com/en-us/library/windows/desktop/ms682629%28v=vs.85%29.aspx\">EnumProcesses或其他知名的方式做同样的.这里是code这在我工作

 的#include&LT;&WINDOWS.H GT;
#包括LT&;&TCHAR.H GT;
#包括LT&;&stdio.h中GT;
的#pragma评论(LIB,"Crypt32.lib")#定义STATUS_SUCCESS((NTSTATUS)0x00000000L)
#定义STATUS_INFO_LENGTH_MISMATCH((NTSTATUS)0xC0000004L)的typedef枚举_SYSTEM_INFORMATION_CLASS {
    SystemProcessInformation = 5
} SYSTEM_INFORMATION_CLASS;typedef结构_UNI $ C $ {C_STRING
    USHORT长度;
    USHORT MaximumLength;
    PWSTR缓冲区;
} UNI code_STRING;的typedef LONG KPRIORITY; //线程优先级typedef结构_SYSTEM_PROCESS_INFORMATION_DETAILD {
    ULONG NextEntryOffset;
    ULONG NumberOfThreads;
    LARGE_INTEGER SpareLi1;
    LARGE_INTEGER SpareLi2;
    LARGE_INTEGER SpareLi3;
    LARGE_INTEGER CreateTime;
    LARGE_INTEGER UserTime;
    LARGE_INTEGER KernelTime;
    UNI code_STRING ImageName;
    KPRIORITY BasePriority;
    HANDLE UniqueProcessId;
    ULONG InheritedFromUniqueProcessId;
    ULONG HandleCount;
    BYTE Reserved4 [4];
    PVOID Reserved5 [11];
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivatePageCount;
    LARGE_INTEGER Reserved6 [6];
} SYSTEM_PROCESS_INFORMATION_DETAILD,* PSYSTEM_PROCESS_INFORMATION_DETAILD;NTSTATUS的typedef(WINAPI * PFN_NT_QUERY_SYSTEM_INFORMATION)(
  在SYSTEM_INFORMATION_CLASS SystemInformationClass,
  IN OUT PVOID SystemInformation,
  IN ULONG SystemInformationLength,
  OUT可选PULONG ReturnLength
);//
//该函数改变了一个名为pszPrivilege的特权
//当前进程.如果bEnablePrivilege为FALSE,特权
//将被禁用,否则将被启用.
//
BOOL SetCurrentPrivilege(​​LPCTSTR pszPrivilege,//权限启用/禁用
                          BOOL bEnablePrivilege)//启用或禁用特权
{
    HANDLE hToken;
    TOKEN_PRIVILEGES TP;
    LUID LUID;
    TOKEN_PRIVILEGES TP previous;
    DWORD CB previous = sizeof的(TOKEN_PRIVILEGES);
    BOOL bSuccess = FALSE;    如果(LookupPrivilegeValue(NULL,pszPrivilege,&安培;!LUID))返回FALSE;    如果(!OpenProcessToken(GetCurrentProcess(),
                           TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
                           &安培; hToken
                          ))返回FALSE;    //
    //第一遍.获得当前权限设置
    //
    tp.PrivilegeCount = 1;
    tp.Privileges [0] .Luid = LUID;
    tp.Privileges [0] .Attributes = 0;    AdjustTokenPrivileges(
            hToken,
            假,
            &放大器; TP,
            的sizeof(TOKEN_PRIVILEGES)
            &放大器; TP previous,
            &安培; CB previous);    如果(GetLastError函数()== ERROR_SUCCESS){
        //
        //第二遍.设置权限的基础上previous设置
        //
        TP previous.PrivilegeCount = 1;
        TP previous.Privileges [0] = .Luid LUID;        如果(bEnablePrivilege)
            TP previous.Privileges [0] .Attributes | =(SE_PRIVILEGE_ENABLED);
        其他
            TP previous.Privileges [0] .Attributes ^ =(SE_PRIVILEGE_ENABLED&安培;
                TP previous.Privileges [0] .Attributes);        AdjustTokenPrivileges(
                hToken,
                假,
                &放大器; TP previous,
                CB previous,
                空值,
                空值);        如果(GetLastError函数()== ERROR_SUCCESS)bSuccess = TRUE;        CloseHandle的(hToken);
    }
    其他{
        DWORD dwError code = GetLastError函数();        CloseHandle的(hToken);
        SetLastError(dwError code);
    }    返回bSuccess;
}DWORD GetProcessIdByProcessName(LPCWSTR pszProcessName)
{
    SIZE_T缓冲区大小= 1024 * sizeof的(SYSTEM_PROCESS_INFORMATION_DETAILD);
    PSYSTEM_PROCESS_INFORMATION_DETAILD pspid = NULL;
    HANDLE hHeap = GetProcessHeap();
    PBYTE的pbuffer = NULL;
    ULONG ReturnLength;
    PFN_NT_QUERY_SYSTEM_INFORMATION pfnNtQuerySystemInformation =(PFN_NT_QUERY_SYSTEM_INFORMATION)
        GetProcAddress的(的GetModuleHandle(TEXT("NTDLL.DLL")),"NtQuerySystemInformation");
    NTSTATUS状态;
    INT尤伦= lstrlenW(pszProcessName)* sizeof的(WCHAR);    __try {
        的pbuffer =(PBYTE)HeapAlloc(hHeap,0,缓冲区大小);
#pragma警告(禁用:4127)
        而(TRUE){
的#pragma警告(默认:4127)
            状态= pfnNtQuerySystemInformation(SystemProcessInformation,(PVOID)pbuffer的,
                                                  缓冲区大小,和放大器; ReturnLength);
            如果(状态== STATUS_SUCCESS)
                打破;
            否则,如果(状态!= STATUS_INFO_LENGTH_MISMATCH){// 0xC0000004L
                _tprintf(TEXT("错误0x%X \\ n"),地位);
                返回1; //错误
            }            BUFFERSIZE * = 2;
            的pbuffer =(PBYTE)HEA $ P $的palloc(hHeap,0,(PVOID)的pbuffer,缓冲区大小);
        }        对于(pspid =(PSYSTEM_PROCESS_INFORMATION_DETAILD)的pbuffer;
             pspid =(PSYSTEM_PROCESS_INFORMATION_DETAILD)(pspid-&GT; NextEntryOffset +(PBYTE)pspid)){            如果(pspid-&GT; ImageName.Length ==尤伦&放大器;&安培; lstrcmpiW(pspid-&GT; ImageName.Buffer,pszProcessName)== 0)
                回报(DWORD)pspid-&GT; UniqueProcessId;            如果(pspid-&GT; NextEntryOffset == 0)打破;
        }
    }
    __finally {
        的pbuffer =(PBYTE)HeapFree(hHeap,0的pbuffer);
    }
    返回0;
}诠释_tmain()
{
    BOOL bIsSuccess,bImpersonated = FALSE;
    HANDLE hProcess = NULL,hProcessToken = NULL;
    DATA_BLOB DATAOUT,DataVerify;
    //!下一行,你应该来自以下字符串复制; keyMaterial&GT;
    WCHAR szKey [] = L"01000000D08C9DDF0115D1118C7 ......";
    BYTE byKey [1024];
    DWORD cbBinary,dwFlags中,dwSkip;
    DWORD dwProcessId = GetProcessIdByProcessName(L"的winlogon.exe");
    如果(dwProcessId == 0)返回1;    bIsSuccess = SetCurrentPrivilege(​​SE_DEBUG_NAME,TRUE);
    如果(!bIsSuccess)返回GetLastError函数();    __try {
        hProcess =调用OpenProcess(MAXIMUM_ALLOWED,FALSE,dwProcessId);
        如果(hProcess!)__leave;
        bIsSuccess = OpenProcessToken(hProcess,MAXIMUM_ALLOWED,&安培; hProcessToken);
        如果(bIsSuccess!)__leave;
        bIsSuccess = ImpersonateLoggedOnUser(hProcessToken);
        如果(bIsSuccess!)__leave;
        bImpersonated = TRUE;        cbBinary = sizeof的(byKey);
        bIsSuccess = CryptStringToBinary(szKey,lstrlenW(szKey),CRYPT_STRING_HEX,// CRYPT_STRING_HEX_ANY
            byKey,&安培; cbBinary,&安培; dwSkip,&安培; dwFlags中);
        如果(bIsSuccess!)__leave;
        DataOut.cbData = cbBinary;
        DataOut.pbData =(BYTE *)byKey;        如果(CryptUnprotectData(安培; DATAOUT,NULL,NULL,NULL,NULL,0,&放大器; DataVerify)){
            _tprintf(TEXT("解密的数据:%HS \\ n"),DataVerify.pbData);
        }
    }
    __finally {
        如果(bImpersonated)
            RevertToSelf时();
        如果(hProcess)
            CloseHandle的(hProcess);
        如果(hProcessToken)
            CloseHandle的(hProcessToken);
    }    返回0;
}

本文地址:https://www.itbaoku.cn/post/359091.html