-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathpatch_communication.h
More file actions
50 lines (45 loc) · 2.17 KB
/
Copy pathpatch_communication.h
File metadata and controls
50 lines (45 loc) · 2.17 KB
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
#pragma once
#include <iostream>
#include <vector>
#include "patch_base_6_6.h"
// 注意:通信命令码定义在 patch_kernel_sk.h 中的 SKRootCommand 枚举
// ========== 奥创版:通信处理器错误码 ==========
// 这些错误码会通过execve的返回值传递给用户态
// 用户态SDK应检查这些错误码以进行调试
namespace CommError {
constexpr int32_t OK = 0; // 成功
constexpr int32_t ERR_INVALID_CMD = -1; // 无效命令码
constexpr int32_t ERR_INVALID_ADDR = -2; // 无效地址(非内核空间或溢出)
constexpr int32_t ERR_SIZE_TOO_LARGE = -3; // 请求大小超过限制
constexpr int32_t ERR_SYMBOL_NOT_FOUND = -4; // 符号查找失败
constexpr int32_t ERR_ALLOC_FAILED = -5; // 内核内存分配失败
constexpr int32_t ERR_HOOK_RANGE = -6; // Hook跳转范围超出限制(±128MB)
constexpr int32_t ERR_NOT_AVAILABLE = -7; // 功能不可用(符号未找到等)
}
// Pro版新增:通信处理器
// 在do_execve hook检测到命令调用时,分发到对应的处理逻辑
class PatchCommunication : public PatchBase66 {
public:
PatchCommunication(const PatchBase66& patch_base);
~PatchCommunication();
// 生成通信处理器代码
// root_key_addr: ROOT密钥存储地址
// hook_area_start: Hook跳板区起始地址
// kallsyms_lookup_name_addr: kallsyms_lookup_name函数地址(用于CMD 4)
// module_alloc_addr: module_alloc函数地址(用于CMD 6)
// module_memfree_addr: module_memfree函数地址(用于CMD 7)
// 返回生成的代码大小
size_t patch_comm_handler(
const SymbolRegion& hook_func_start_region,
size_t root_key_addr,
size_t hook_area_start,
size_t kallsyms_lookup_name_addr,
size_t module_alloc_addr,
size_t module_memfree_addr,
std::vector<patch_bytes_data>& vec_out_patch_bytes_data);
private:
// 解析命令参数(从filename字符串解析hex地址)
void emit_parse_hex_param(asmjit::a64::Assembler* a,
asmjit::a64::GpX str_ptr,
asmjit::a64::GpX result);
};