TrustClient 相关
1) win api使用宏控制
#ifdef Q_OS_WIN
#include <Windows.h>
#endif内存相关
函数段
- 申请内存
void *zallloc(size_t len) {
void *p = malloc(len);
if(p) {
memset(p, 0, len);
}
return p;
}常用的宏
内存释放
#define safe_free(p) {\
free(p);\
p = NULL;\
}\控制台 Format
-
控制台颜色控制
namespace ansi { constexpr auto RESET = "\033[0m"; // 基础颜色 struct Color { constexpr static auto Black = "\033[30m"; constexpr static auto Red = "\033[31m"; constexpr static auto Green = "\033[32m"; constexpr static auto Yellow = "\033[33m"; constexpr static auto Blue = "\033[34m"; constexpr static auto Magenta = "\033[35m"; constexpr static auto Cyan = "\033[36m"; constexpr static auto White = "\033[37m"; }; // 加粗颜色 struct BoldColor { constexpr static auto Black = "\033[1m\033[30m"; constexpr static auto Red = "\033[1m\033[31m"; constexpr static auto Green = "\033[1m\033[32m"; constexpr static auto Yellow = "\033[1m\033[33m"; constexpr static auto Blue = "\033[1m\033[34m"; constexpr static auto Magenta = "\033[1m\033[35m"; constexpr static auto Cyan = "\033[1m\033[36m"; constexpr static auto White = "\033[1m\033[37m"; }; } // 使用示例 std::cout << ansi::Color::Red << "Error!" << ansi::RESET; std::cout << ansi::BoldColor::Green << "Success!" << ansi::RESET;
线程的资源竞争
- 对
链表、边界资源、临界区域的操作一定要加锁
std::mutex mtx; // 保护counter
mtx.lock();
// 要进行的资源操作
todo();
mtx.unlock();PE 操作
#include <winnt.h> // For IMAGE_NT_HEADERS64, IMAGE_SECTION_HEADER, etc.
// 函数:修改进程所有段的内存保护为可读、可写、可执行 (64-bit)
bool MakeAllSectionsExecuteReadWrite64() {
// 1. 获取当前进程的模块句柄 (即进程的基地址)
HMODULE hModule = GetModuleHandle(NULL);
if (hModule == NULL) {
// 错误处理: 无法获取模块句柄
return false;
}
// 2. 获取DOS头
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;
if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) {
// 错误处理: 无效的DOS头
return false;
}
// 3. 获取NT头 (64-bit)
PIMAGE_NT_HEADERS64 pNtHeaders = (PIMAGE_NT_HEADERS64)((BYTE*)hModule + pDosHeader->e_lfanew);
if (pNtHeaders->Signature != IMAGE_NT_SIGNATURE) {
// 错误处理: 无效的NT头
return false;
}
// 检查是否真的是64位PE文件 (可选,但推荐)
if (pNtHeaders->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
// 错误处理: 不是一个64位PE文件的可选头
return false;
}
// 4. 获取第一个节表项 (Section Header)
PIMAGE_SECTION_HEADER pSectionHeader = IMAGE_FIRST_SECTION(pNtHeaders);
// 5. 遍历所有节表项
for (WORD i = 0; i < pNtHeaders->FileHeader.NumberOfSections; ++i) {
DWORD_PTR sectionVA = (DWORD_PTR)hModule + pSectionHeader[i].VirtualAddress;
DWORD sectionSize = pSectionHeader[i].Misc.VirtualSize;
if (sectionSize == 0) {
continue;
}
// 6. 修改内存保护为可读、可写、可执行
DWORD oldProtect;
DWORD newProtect = PAGE_EXECUTE_READWRITE; // <--- 核心修改点
// 打印调试信息 (可选)
// char sectionName[IMAGE_SIZEOF_SHORT_NAME + 1] = {0};
// memcpy(sectionName, pSectionHeader[i].Name, IMAGE_SIZEOF_SHORT_NAME);
// std::cout << "Attempting to change protection for section: " << sectionName
// << " at VA: 0x" << std::hex << sectionVA
// << " Size: 0x" << std::hex << sectionSize
// << " to PAGE_EXECUTE_READWRITE (0x" << std::hex << newProtect << ")" << std::endl;
if (VirtualProtect((LPVOID)sectionVA, (SIZE_T)sectionSize, newProtect, &oldProtect)) {
// 成功修改保护
// std::cout << "Successfully changed protection for " << sectionName
// << ". Old protect: 0x" << std::hex << oldProtect << std::endl;
}
else {
// 错误处理: VirtualProtect 失败
// DWORD lastError = GetLastError();
// std::cerr << "Failed to change protection for " << sectionName
// << ". Error code: " << lastError << std::endl;
// 根据需求,可以选择在这里返回 false,或者继续尝试修改其他节
}
}
return true;
}