@TOC关于恶意代码攻击原理
恶意代码实现入侵的相关技术
(1) 渗透技术:
渗透的方式感染可执行程序、分区表和数据文件;
通过移动介质;
通过人、社会工程方式;
借助于系统和软件漏洞;
通过电子邮件Web网站和网页;
P2P文件共享;
即时通信工具和ARP欺骗方式;
(2) 自启动技术:(目的是保证恶意代码在受害主机下一次开启主机后再次被激活)
基本方法:
1) 通过服务启动;
很多开机启动程序仅仅在启动项里面,只有登录后才能真正的启动,windows服务在开机前未进行用户登录前就启动了,恶意代码通过服务启动的方式渗透
2) 通过添加注册表启动;
3) 通过文件关联启动;
4) 通过修改程序系统配置的文件启动;
5) 作为其他程序的插件启动;
6) 通过文件绑定方式启动;
(3) 自我保护技术
(一) 反静态分析:
1) 自身隐藏在注册表、重要文件或系统文件或系统文件夹等隐蔽性很强的位置,躲避反恶意代码的检测
2)
微信截图_20190417215950.png
加壳/多态技术:将恶意代码用一段不被非法修改或反编译的程序封装起来,在这一个可执行的文件中,通过一些被非法修改或反编译的程序,即外壳保护后压缩原来exe文件,通过loader加载映射进入exe文件,实现了恶意代码返检测的功能
相关加壳技术的代码(查找了相关的资料学过java的可以上机运行一下)
bool CPack::Pack(WCHAR * szPath)
{
CPe objPe;
//读取要被加壳的PE文件
DWORD dwReadFilSize = 0;
HANDLE hFile = CreateFile(szPath,GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwFileSize = GetFileSize(hFile, NULL);
char * pFileBuf = new char[dwFileSize];
memset(pFileBuf, 0, dwFileSize);
ReadFile(hFile, pFileBuf, dwFileSize, &dwReadFilSize, NULL);
//获取PE头文件信息
PEHEADERINFO pPeHead = { 0 };
objPe.GetPeHeaderinfo(pFileBuf, &pPeHead);
//加密
IMAGE_SECTION_HEADER pTxtSection;
objPe.GetSectionInfo(pFileBuf, &pTxtSection, ".text");
objPe.XorCode((LPBYTE)(pTxtSection.PointerToRawData + pFileBuf), pTxtSection.SizeOfRawData);
//用loadLibrary加载壳文件
HMODULE pLoadStubBuf = LoadLibrary(L"..\\Release\\Stub.dll");
//存储必要的信息
PPACKINFO PackInfoAdd = (PPACKINFO)GetProcAddress((HMODULE)pLoadStubBuf, "g_PackInfo");
PackInfoAdd->dwOriStartPoint = pPeHead.pOptionHeader->AddressOfEntryPoint; //需要跳转的OEP
PackInfoAdd->dwImageBase = pPeHead.pOptionHeader->ImageBase; //默认加载基址
PackInfoAdd->dwXorCode = pTxtSection.VirtualAddress; //加密代码段地址
PackInfoAdd->dwXorKey = 0xE; //加密密钥
PackInfoAdd->dwXorSize = pTxtSection.SizeOfRawData; //加密大小
PackInfoAdd->stcPeRelocDir = pPeHead.pOptionHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; //重定位表信息
PackInfoAdd->dwSizeOfImage = pPeHead.pOptionHeader->SizeOfImage; //原PE的大小
//拷贝一份
MODULEINFO stcModInfo = { 0 };
GetModuleInformation(GetCurrentProcess(), pLoadStubBuf, &stcModInfo, sizeof(MODULEINFO));
char * pStubBuf = new char[stcModInfo.SizeOfImage];
memset(pStubBuf, 0, stcModInfo.SizeOfImage);
memcpy(pStubBuf, pLoadStubBuf, stcModInfo.SizeOfImage);
//申请新空间存储新PE
int NewPeSize = objPe.GetAddSectionSize(pFileBuf, (char*)pLoadStubBuf, stcModInfo.SizeOfImage);
char * pNewPeBuf = new char[NewPeSize];
memset(pNewPeBuf, 0, NewPeSize);
memcpy(pNewPeBuf, pFileBuf, dwFileSize);
//修改重定位表
objPe.FixReloc(pStubBuf, pNewPeBuf);
// 添加一个区段
objPe.AddSection(pNewPeBuf, pStubBuf, stcModInfo.SizeOfImage);
//设置入口点
//自己定义的壳的开始位置的原始偏移
DWORD Offset = PackInfoAdd->dwStartPoint - (DWORD)pLoadStubBuf;
//相对于新PE的起始位置的偏移
unsigned int NewOep = Offset + pPeHead.pOptionHeader->SizeOfImage;
objPe.SetOep(pNewPeBuf, NewOep);
//保存成文件
SavePackFile(szPath, pNewPeBuf, NewPeSize);
//释放内存
delete[]pFileBuf;
delete[]pStubBuf;
delete[]pNewPeBuf;
return true;
}
作者:woshigeshusheng
来源:CSDN
原文:https://blog.csdn.net/woshigeshusheng/article/details/68489843
版权声明:本文为博主原创文章,转载请附上博文链接!
未加壳时:恶意代码数据流想入侵受害主机或许被防火墙阻隔,或者是相关的反恶意代码的检测机制,阻断了恶意代码的入侵途径
加壳后:恶意代码数据流在外壳的保护下可以直接通过防火墙或者欺骗过反恶意代码的检查机制成功入侵受害主机
(二) 反动态跟踪:
(4) 隐蔽通信(通过远程控制,即实质上是加密被控主机端和控制端之间传送命令和命令执行结果)
远程控制的基本流程:
(a) 服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,即实时监控网络的状态
(b) 客户端的请求:指由客户端的套接字提出连接的要求,要连接的目标是服务器端的套接字,指出服务器端的套接字的地址和端口号,然后就向服务器端提出连接请求
(c) 连接确认:是指当服务器端套接字监听或者接收到客户端套接字的连接请求,它就相应客户端套接字的请求,建立一个新的线程,把服务器端的套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了,而服务器端的套接字继续处于监听状态,继续接收其他客户端套接字的连接请求
常见的隐蔽通信的方式:
1) 直接使用套接字进行通讯控制
(a) 服务器端侦听,客户端连接:
(b) 客户端侦听,服务器端连接:
à这两样方式都会引起防火墙报警
因此(a)的方法可以通过全局IP地址,通过限制恶意代码的活动范围使其精准地入侵受害主机;而(b)的方法通过线程注入的方式,具体方法如下:在当前所有运行的进程中找到目标进程;其次将我们的DLL内容写入目标进程的私有空间;通过关键的API创建线程加载到DLL中
2) 隐蔽通道
3) ICMP隧道:
利用ICMP_ECHO和ICMP_ECHOREPLY两种报文
4) 使用第三方交互服务进行通讯
5) 通过ARP欺骗或DHCP欺骗等网络代理木马欺骗方式
微信图片_20190417222207.jpg
ARP欺骗
恶意代码通过调用ARP上的压缩数据包,将其传送到网络,尤其是网关上,目的是将特定的IP地址的数据流被错误的送到攻击者所取代的地方
(5) 攻击技术
攻击技术是指一切试图跨越系统安全边界危害受害主机的可用性、可靠性、数据完整性、或者消耗受害者主机的系统资源以及受害主机危害他人的所有行为;归纳起来就是拒绝服务攻击、信息窃取、数据破坏、修改系统配置