【手册】代码规范,安全编码

文章目录

#编程语言/CPP

TrustClient 相关

1) win api使用宏控制

1
2
3
#ifdef Q_OS_WIN
#include <Windows.h>
#endif

内存相关

函数段

  1. 申请内存
1
2
3
4
5
6
7
8
void *zallloc(size_t len) {
void *p = malloc(len);
if(p) {
memset(p, 0, len);
}

return p;
}

常用的宏

内存释放

1
2
3
4
#define safe_free(p) {\
free(p);\
p = NULL;\
}\

控制台 Format

  1. 控制台颜色控制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    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. 链表、边界资源、临界区域的操作一定要加锁
1
2
3
4
5
6
7
8
std::mutex mtx; // 保护counter

mtx.lock();

// 要进行的资源操作
todo();

mtx.unlock();

PE 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#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;
}