(wchar_t))+sizeof(wchar_t);
EncodedString.Buffer=(PWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,EncodedString.MaximumLength); //因为在Windows2000中hash-byte并不存放在编码中 //所以在这里进行的是暴力破解 //下面的循环中i就是hash-byte
//我们将i从0x00到0xff分别对密文进行解密
//如果有一个hash-byte使得所有密码都是可见字符,就认为是有效的 //这个算法实际上是从概率角度来解码的
//因为如果hash-byte不正确,而解密出来的密码都是可见字符的概率非常小 for(i=0;i<=0xff;i++) {
CopyMemory(EncodedString.Buffer,PasswordP,PasswordLength* sizeof(wchar_t));
//使用i作为hash-byte对密文进行解码
pfnRtlRunDecodeUnicodeString((BYTE)i,&EncodedString); //检查解码出的密码是否完全由可见字符组成 //如果是则认为是正确的解码
PBYTEp=(PBYTE)EncodedString.Buffer; BOOLViewable=TRUE; DWORDj,k;
for(j=0;(j if((*p)&&(*(PBYTE)(DWORD(p)+1)==0)) { if(*p<0x20)Viewable=FALSE; if(*p>0x7e)Viewable=FALSE; //0x20是空格,0X7E是~,所有密码允许使用的可见字符都包括在里面了 } else Viewable=FALSE; k=DWORD(p); k++;k++; p=(PBYTE)k; } if(Viewable) { printf(\UserName,EncodedString.Buffer); printf(\} } HeapFree(GetProcessHeap(),0,EncodedString.Buffer); }//DisplayPasswordWin2K 如图7-1所示。 图7-1用户密码的获得 7.5小结 本章通过两个实例介绍了WinLogon通知包和GINA动态链接库的编写方法,以 及它们的特殊应用。 7.6思考题 (1)WinLogon通知包相对于编写WindowsNT服务程序,有哪些优势? (2)GINA动态链接库和WinLogon通知包有哪些区别? 7.7练习题 (1)编写一个简单的WinLogon通知包动态链接库,实现关机或者重新启动时能够 清理上网记录,包括cookie、浏览历史、浏览键入的URL。 (2)编写一个进程,注入到Winlogon进程,实现开机时能够自动完成文件的清理。