CPP

TrustClient 相关

1) win api使用宏控制

#ifdef Q_OS_WIN
	#include <Windows.h>
#endif

内存相关

函数段

  1. 申请内存
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

  1. 控制台颜色控制

    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;

线程的资源竞争

  1. 链表、边界资源、临界区域的操作一定要加锁
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;
}