问题描述
我试图解密使用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 code>来得到结果,但... ...有小问题.你怎么可以在<一个文档中读取href=\"http://msdn.microsoft.com/en-us/library/windows/desktop/ms706738%28v=vs.85%29.aspx\">WlanGetProfile以下
在默认情况下,在 keyMaterial 元素返回在配置文件指出,
通过的 pstrProfileXml 的加密.如果你的程序在运行
在同一台计算机上的本地系统帐户的情况下,那么你可以
通过调用 CryptUnprotectData STRONG>功能键解密的材料.
Windows Server 2008和Windows Vista中:在 keyMaterial 元素
在配置模式返回所指向的 pstrProfileXml 的是
始终加密.如果你的进程的上下文中运行
本地系统帐户,那么您可以通过调用解密密钥材料
在 CryptUnprotectData STRONG>功能.
块引用>所以要能解密我们要调用<一个关键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;
}