Nameless是以开源的后门程序,也可作为学习windows编程的经典样例。
安装
调用Install或InstallService函数,将Nameless注册为系统服务,主要通过写注册表的方式实现。参见InstallService函数源码。
"SYSTEM//CurrentControlSet//Services//"下注册系统服务
"SOFTWARE//Microsoft//Internet Explorer//NameLess"下备份相关数据,如激活字符串,登陆密码等。
运行
1、作为系统服务启动时,系统将自动调用ServiceMain函数,ServiceMain必须要做的事情是调用RegisterServiceCtrlHandler函数注册服务控制事件的处理函数。如暂停、回复、停止、关闭等事件。
这些事件在ServiceHandler函数中得到处理。而每一个控制事件都是通过TellSCM函数中调用SetServiceStatus实现。
2、ServiceMain函数中做的第二件事情是调用RealService函数启动真正的服务程序。RealService函数首先读取激活字符串,密码等基本配置信息,然后创建一个保护线程,其线程函数为ShieldThread,最后创建一个Raw Socket开始嗅探所有经过网卡的数据包。
保护线程把本程序的镜像文件全部读入内存,然后死循环每隔30s检测一次本程序镜像文件是否被删除,如果是,则将内存中保存的备份重新写入文件系统。
3、嗅探分析在StartSniffer函数中实现。首先是打开监听,调用WSAIoctl设置接收所有数据。然后死循环调用recv接收数据,调用DecodeIPPack解析ip数据包。
如果DecodeIPPack返回成功,则创建后门线程,终止嗅探。后门线程的线程函数为StartBackDoor。DecodeIPPack函数中调用DecodeTCPPack进一步解析TCP数据包。
DecodeTCPPack函数进一步调用CheckTcpData对数据进行检查。CheckTcpData函数中按照作者规定的格式,从数据中查找远程控制主机的ip和端口,另外还要求数据中包含匹配的激活字符串(安装时设置的)。如果找到ip、端口则有本程序向控制主机发起反向连接。
4、StartBackDoor函数中,判断上一步是否找到控制主机ip、端口,如果找到则调用ReverseShell发起反向连接,如果没有,则调用BindShell函数打开监听,等待控制主机发起连接。
BindShell函数打开监听,等待接受连接。一旦连接成功,则创建用户线程,线程函数为ClientThread。ReverseShell函数则循环尝试连接控制主机,连接成功也创建相同的用户线程。
5、ClientThread函数中,首先要求控制主机发送密码,与之前的配置进行比较验证。通过之后,则循环地调用ReveiceMessage从控制主机接受指令,然后调用ExeCommand创建进程执行指令,然后将执行结果返回给控制主机。
Nameless的主体流程大致如此,其它就是指令执行的具体实现了。