只要你使用的是微软的Windows操作系统,都会存在一个默认共享(C$,D$,E$;Admin$;IPC$),这个共享通过用瑞星漏洞扫描程序是可以发现的,但是瑞星不提供自动修复,每次重装系统之后,都要手动修改注册表,很是麻烦。
所以,我写了这个小程序,来完成自动修复。
一.开发环境:Windows XP
二.软件开发工具:Visual C++ 6.0
三.程序开发说明:本程序主要完成的功能是修改注册表,通过调用Win32 API函数来实现。
第一步:
打开注册表项:
这是所有注册表操作都必须要有的一步,以下是打开注册表的Win32 API函数:
LONG RegOpenKeyEx(
HKEY hkey, //已打开的注册表项名柄或者预定义的注册表项句柄。
LPCTSTR lpSubKey, //欲打开的子项名称
DWORD ulOptions, //保留,一般为数字0。
REGSAM samDesired, //定义访问权限。
PHKEY phkResult //返回打开的子项名柄。
);
注意:
访问权限:写 KEY_WRITE。
如果打开注册表项成功,则函数会返回一个”ERROR_SUCCESS”的宏。
第二步:
新建值项并设置值项的值:
当然了,打开了注册表项之后,就是对注册表进行操作了,这一步主要是向注册表项写入值项。以下就是向注册表写入值项的Win32 API函数:
LONG RegSetValueEx(
HKEY hKey, //打开的注册表项名柄。
LPCTSTR lpValueName,//值项名称。
DWORD Reserved, //保留,一般为“NULL”。
DWORD dwType, //值项类型。
CONST BYTE *lpData,//欲写入的值
DWORD cbData,//欲写入的值的空间大小
);
第三步:
关闭注册表操作:
注册表操作完成了,一定要关闭注册表,否则是不安全的。这一步一定不能少。以下就是关闭注册表用到的Win32 API函数。
LONG RegCloseKey(HKEY hkey);
关闭由RegOpenKeyEx()生成的名柄。
四.部分代码讲解: 这里以关闭分区共享(也就是关闭C$,D$,E$)为例。
关分区共享,必须向注册表写入以下条件:
注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
值项名:AutoShareWks
值项类型:REG_DWORD
值项的值:0x00000000
知道了该向注册表里写什么东西了,接下来就是用VC把这些信息写入注册表。
上面我们已经说过了,对于注册表操作,首先就是要打开注册表,用Win32 API函数
RegOpenKeyEx(……)。
该函数的第一个参数是说明要打开的预定义的注册表项句柄,这里是"HKEY_LOCAL_MACHINE";
该函数的第二个参数是说明要打开的子项名称,这里是"SYSTEM\CurrentControlSet\Services\lanmanserver\parameters";
该函数的第三个参数一般为默认值,为数字0;
该函数的第四个参数说明了对于即将打开的注册表我们对它有什么样的访问权限,这里当然是写权限了,因为我们马上要向注册表里写东西,写权限为:KEY_WRITE;
该函数的第五个参数用途说明:我们通过上面的四个参数的设置,已经说明了我们要打开的注册表位置和访问权限,但是对于这个我们要打开的注册表位置,必须赋给一个句柄,并且这个名柄是注册表项名柄。
好了,对于打开注册表,万事OK!
理论讲的再好,没有实践可不行,下面就让我们进入打开注册表这一步的实践吧!
CString path="SYSTEM\\CurrentControlSet\\Services\\lanmanserver\\parameters";//RegOpenKeyEx()函数的第二个实参,说明子项路径。
HKEY hkey;//RegOpenKeyEx()函数的最后一个实参,得到打开的子项的名柄。
LONG re=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_WRITE,&hkey);//打开注册表里的指定路径,并返回一个长整型值,来说明打开注册表是否成攻。
if(re!=ERROR_SUCCESS)//如果RegOpenKeyEx()函数返回的值不是ERROR_SUCCESS(这是一个宏),则说明打开注册表操作失败。
{
MessageBox("错误,无法打开有关的注册表项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);//关闭注册表
return;//程序返回,结束程序。
}
到这里第一步已经完成,下面进行第二步,向注册表子项名柄hkey指向的注册表项里写入值项,并赋值。这也要用到一个Win32 API函数,为RegSetValueEx(……)。
由于上面"四.程序开发说明:"里的“第二步:”,已经有了关于该函数参数的说明,我就不重复了,直接进入代码来分析向注册表写入值项的操作。
以下代码,紧跟上面的。
else //说明打开注册表操作成功。
{
DWORD value=0x00000000;//向值项中要写入的值。
LPBYTE lpb=(LPBYTE)&value;//将DWORD 类型(也就是unsigned int)的value转变为LPBYTE类型(也就是char *)的lpb,该语名这主要用来符合RegSetValueEx()函数中的第五个参数的类型。
DWORD length=sizeof(DWORD);//得到要写入注册表值项的值的占用空间的大小,然后赋给lenght,用作RegSetValueEx()函数的最后一个参数。
LONG re2=::RegSetValueEx(hkey,"AutoShareWks",NULL,REG_DWORD,lpb,length);//该语名完成向注册表句柄hkey指向的注册表子项写入一个值项,值项名为"AutoShareWks",值的大小为lpb指定的值,和打开注册表的Win32 API函数RegOpenKeyEx(……)一下,它也会返回一个值,这和RegOpenKeyEx()是一下的,我就不多说了。
if(re2!=ERROR_SUCCESS)//原理同打开注册表操作里面的语句。
{
MessageBox("错误,无法在打开的注册表项中写入值项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);原理同打开注册表操作里面的语句。
return;原理同打开注册表操作里面的语句。
}
else
MessageBox("操作成功","提示",MB_ICONINFORMATION);
}
到这时,我们已经完成了注册表的打开,写值的操作,接下来就要关闭注册表了,结束操作了。也是用到一个Win32 API函数RegCloseKey(),该函数的参数可见上面"三.程序开发说明:"里的第三步.下面是关闭注册表的具体代码,很简单的:
LONG re3=::RegCloseKey(hkey);//关闭由hkey指定的注册表子项,关闭注册表,如果操作成功,RegCloseKey()返回"ERROR_SUCCESS"宏给re3.
if(re3!=ERROR_SUCCESS)//如果关闭注册表失败,则运行"{"下面的语名。
{
MessageBox("错误,无法关闭注册表!","警告",MB_ICONWARNING);
return;
}
五.主要源代码:void CDel_WDShareDlg::OnOK()
{
// TODO: Add extra validation here
if(m_check1.GetCheck()==0)
{
int comb1=m_combo1.GetCurSel();
int comb2=m_combo2.GetCurSel();
if(comb2==0)
if(comb1==1)
{
CString path="SYSTEM\\CurrentControlSet\\Services\\lanmanserver\\parameters";
HKEY hkey;
LONG re=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_WRITE,&hkey);
if(re!=ERROR_SUCCESS)
{
MessageBox("错误,无法打开有关的注册表项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
else
{
DWORD value=0x00000000;
LPBYTE lpb=(LPBYTE)&value;
DWORD length=sizeof(DWORD);
LONG re2=::RegSetValueEx(hkey,"AutoShareWks",NULL,REG_DWORD,lpb,length);
if(re2!=ERROR_SUCCESS)
{
MessageBox("错误,无法在打开的注册表项中写入值项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
else
MessageBox("操作成功","提示",MB_ICONINFORMATION);
}
LONG re3=::RegCloseKey(hkey);
if(re3!=ERROR_SUCCESS)
{
MessageBox("错误,无法关闭注册表!","警告",MB_ICONWARNING);
return;
}
}
else
{
HKEY hkey;
CString path="SYSTEM\\CurrentControlSet\\Control\\Lsa";
LONG re=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_WRITE,&hkey);
if(re!=ERROR_SUCCESS)
{
MessageBox("错误,无法打开注册表项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
else
{
DWORD value=0x00000001;
LPBYTE lpb=(LPBYTE)&value;
DWORD len=sizeof(lpb);
LONG re2=::RegSetValueEx(hkey,"RestrictAnonymous",NULL,REG_DWORD,lpb,len);
if(re2!=ERROR_SUCCESS)
{
MessageBox("错误,无法写入值项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
}
LONG re3=::RegCloseKey(hkey);
if(re3!=ERROR_SUCCESS)
{
MessageBox("错误,无法关闭注册表","警告",MB_ICONWARNING);
return;
}
else
MessageBox("操作成功","提示");
}
else
if(comb1==1)
{
HKEY hkey;
CString path="SYSTEM\\CurrentControlSet\\Services\\lanmanserver\\parameters";
LONG re=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_WRITE,&hkey);
if(re!=ERROR_SUCCESS)
{
MessageBox("错误,无法打开注册表项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
DWORD value=0x00000000;
LPBYTE lpb=(LPBYTE)&value;
DWORD len=sizeof(lpb);
LONG re2=::RegSetValueEx(hkey,"AutoShareServer",NULL,REG_DWORD,lpb,len);
if(re2!=ERROR_SUCCESS)
{
MessageBox("错误,无法写注册表值项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
LONG re3=::RegCloseKey(hkey);
if(re3!=ERROR_SUCCESS)
{
MessageBox("错误,无法关闭注册表","警告",MB_ICONWARNING);
return;
}
else
MessageBox("操作成功","提示");
}
else
{
HKEY hkey;
CString path="SYSTEM\\CurrentControlSet\\Control\\Lsa";
LONG re=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,path,0,KEY_WRITE,&hkey);
if(re!=ERROR_SUCCESS)
{
MessageBox("错误,无法打开注册表项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
DWORD value=0x00000001;
LPBYTE lpb=(LPBYTE)&value;
DWORD len=sizeof(lpb);
LONG re2=::RegSetValueEx(hkey,"RestrictAnonymous",NULL,REG_DWORD,lpb,len);
if(re2!=ERROR_SUCCESS)
{
MessageBox("错误,无法向注册表写入值项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
LONG re3=::RegCloseKey(hkey);
if(re3!=ERROR_SUCCESS)
{
MessageBox("错误,无法关闭注册表","警告",MB_ICONWARNING);
return;
}
else
MessageBox("操作成功","提示");
}
}
else
{
HKEY hkey;
LONG re1=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\Lsa",0,KEY_WRITE,&hkey);
if(re1!=ERROR_SUCCESS)
{
MessageBox("错误,无法打开注册表项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
LONG re2=::RegDeleteValue(hkey,"RestrictAnonymous");
if(re2!=ERROR_SUCCESS)
{
MessageBox("错误,无法删除注册表值项","警告",MB_ICONWARNING);
::RegCloseKey(hkey);
return;
}
LONG re3=::RegCloseKey(hkey);
if(re2!=ERROR_SUCCESS)
{
MessageBox("错误,无法删除注册表值项","警告",MB_ICONWARNING);
return;
}
else
MessageBox("操作成攻","提示",MB_ICONINFORMATION);
}
CDialog::OnOK();
}
六.下载源程序: 由于瑞星论坛不支持直接上传.rar文件,所以我将程序的后缀名改为.jpg图片文件,上传才成攻。
大家下载的时候,在图片文件上单击右键(当然了,你是看不见图片,你只能看到一个”X“,因为它本身就不是图片文件),在弹出的右键菜单中选择“使用网际快车下载”,一定不要选"另存为",另存为是下不了得。
下载完之后,找到那个文件夹,文件名为一连串的数字,在这个文件夹下有一个叫Del_WDShare的文件夹,这就是本程序的工程文件,用VC++软件可以打开看看。
对于想直接运行程序的,在Del_WDShare文件夹下找到Release这个文件夹,运行Release文件夹下的Dele_WDShare.exe即可,关闭微软的默认共享。最后,重新启动计算机,让注册表操作生效。
由于本人才疏学浅,如有写的不好或写错的地方,还请各位多多指教!