[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2094":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":13,"stars7d":15,"stars30d":16,"stars90d":14,"forks30d":14,"starsTrendScore":15,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":9,"pushedAt":9,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":14,"starSnapshotCount":14,"syncStatus":13,"lastSyncTime":25,"discoverSource":26},2094,"kpm-panda-hide","P4nda0s\u002Fkpm-panda-hide","P4nda0s","(kpm) (for Android hackers)Hide your frida and debuggers",null,"C",149,47,2,0,6,15,5.04,false,"main",true,[],"2026-06-12 02:00:37","# panda-hide\n\n[English](.\u002FREADME.en.md)\n\nKernelPatch KPM 模块，用于隐藏调试器和反调试检测。\n\n## 功能特性\n\n- 调试器检测隐藏\n- Frida 检测隐藏\n- openat 系统调用劫持\n- 网络检测隐藏\n- 内存检测隐藏\n\n## 编译要求\n\n- `aarch64-none-elf-` 交叉编译工具链\n- KernelPatch 源码目录\n\n### 获取 ARM 交叉工具链\n\n请从 Arm 官方下载页获取交叉工具链：\n\nhttps:\u002F\u002Fdeveloper.arm.com\u002Fdownloads\u002F-\u002Farm-gnu-toolchain-downloads\n\n需要选择 `AArch64 bare-metal target (aarch64-none-elf)`。\n\n#### macOS\n\n你也可以使用 Homebrew 安装：\n\n```bash\nbrew install aarch64-none-elf-gcc\n```\n\n#### Linux\n\n下载官方预编译工具链后，将其 `bin` 目录加入 `PATH`，例如：\n\n```bash\ntar -xf arm-gnu-toolchain-*.tar.xz\nexport PATH=$PATH:$(pwd)\u002Farm-gnu-toolchain-*\u002Fbin\n```\n\n## 编译\n\n```bash\nmake TARGET_COMPILE=aarch64-none-elf- KP_DIR=\u002Fpath\u002Fto\u002FKernelPatch\n```\n\n如果你使用的是本地解压的工具链，也可以显式指定前缀路径：\n\n```bash\nmake TARGET_COMPILE=\u002Fpath\u002Fto\u002Farm-gnu-toolchain\u002Fbin\u002Faarch64-none-elf- KP_DIR=\u002Fpath\u002Fto\u002FKernelPatch\n```\n\n## 需要的内核符号\n\n模块会通过 `kallsyms_lookup_name()` 动态解析一部分内核符号，并依赖 KernelPatch 的 syscall hook 能力。\n\n如果下列表格中的符号在目标内核中不存在，请不要直接放弃；应根据对应功能点寻找替代实现，例如改 hook 相邻导出函数、改 hook syscall wrapper、改拦截更上层 `\u002Fproc` 输出函数，或退回到更通用的进程名 \u002F 路径 \u002F 内存特征过滤方案。\n\n| 符号 \u002F 接口 | 用途 | 当前模块 | 不存在时的替代方向 |\n| --- | --- | --- | --- |\n| `kallsyms_lookup_name` | 动态查找内核符号地址 | 全部功能 | 通过 KernelPatch 预置偏移、手动符号表、设备内核符号数据库或静态分析定位目标地址 |\n| `seq_put_decimal_ull` | 将 `\u002Fproc\u002F[pid]\u002Fstatus` 中 `TracerPid` 改写为 `0` | 调试器隐藏 | 改 hook `proc_pid_status`、`task_state`、`do_task_stat` 或更高层的 seq 输出路径 |\n| `seq_puts` | 将 tracing stop 状态文本改写为正常状态 | 调试器隐藏 | 改 hook `task_state`、`do_task_stat`、`proc_pid_status` 等更接近状态拼接的位置 |\n| `proc_pid_wchan` | 将 `\u002Fproc\u002F[pid]\u002Fwchan` 中的 `ptrace_stop` 改为 `0` | 调试器隐藏 | 改 hook `get_wchan`、对应 proc show 函数，或直接在更上层 seq 输出阶段过滤 |\n| `do_task_stat` | 修改 `\u002Fproc\u002F[pid]\u002Fstat` 中的进程状态字符 | 调试器隐藏 | 改 hook `proc_pid_stat`、`task_state` 或相关 stat 输出包装函数 |\n| `show_map_vma` | 从 `\u002Fproc\u002F[pid]\u002Fmaps` 中移除 Frida 相关映射 | Frida 隐藏 | 改 hook `show_map`、`seq_path`、VMA 遍历输出函数，或转为针对 maps 文本后处理 |\n| `__get_task_comm` | 重写线程名，隐藏 Frida 特征线程名 | Frida 隐藏、网络拦截日志 | 改 hook `get_task_comm`、直接读取 `task->comm` 的上层调用点，或在 `\u002Fproc` 输出阶段统一过滤 |\n| `access_remote_vm` | 擦除 `\u002Fproc\u002F[pid]\u002Fmem` 读取结果中的 Frida 特征字符串 | 内存隐藏 | 改 hook `mem_rw`、`process_vm_readv` 路径、ptrace 读内存路径，或针对用户态读取缓冲区做后处理 |\n| `__arch_copy_from_user` | 在 `connect()` hook 中读取用户态 `sockaddr` | 网络隐藏 | 改用 `copy_from_user`、`_copy_from_user`、`raw_copy_from_user`，或直接 hook 更下层 socket\u002Fconnect 实现 |\n| `__NR_connect` | hook `connect()`，阻断对 Frida 常见端口的连接 | 网络隐藏 | 改 hook `__sys_connect`、`__arm64_sys_connect`、`sys_connect` 或 socket 层实现 |\n| `__NR_openat` | hook `openat()`，屏蔽 Frida 相关路径访问 | 路径隐藏 | 改 hook `do_filp_open`、`path_openat`、`do_sys_openat2`、`__arm64_sys_openat` 等更接近文件打开路径的函数 |\n| `__NR_faccessat` | hook `faccessat()`，伪装目标路径不存在 | 路径隐藏 | 改 hook `do_faccessat`、`vfs_faccessat`、`__arm64_sys_faccessat` 或统一转到路径解析层过滤 |\n| `fp_hook_syscalln` \u002F `fp_unhook_syscalln` | KernelPatch 提供的 syscall hook API | `openat` \u002F `faccessat` \u002F `connect` | 若函数指针 hook 不可用，可改用 `hook_syscalln`、`inline_hook_syscalln`，或直接 inline hook 目标 syscall handler |\n| `compat_strncpy_from_user` | 从用户态安全复制字符串参数 | `openat` \u002F `faccessat` | 改用 `strncpy_from_user`、`copy_from_user + NUL` 终止，或其他等价用户态拷贝封装 |\n| `compat_copy_to_user` | KPM 控制接口向用户态返回数据 | 模块控制接口 | 改用 `copy_to_user` 或 KernelPatch 其他用户态数据返回封装 |\n\n### 替代方案建议\n\n- 如果 `\u002Fproc` 相关符号缺失，优先找更高层的 proc 输出函数，而不是强依赖某个具体内核版本的私有 helper。\n- 如果 syscall 号可用但 `fp_hook_syscalln` 不稳定，优先尝试 `hook_syscalln` 或 `inline_hook_syscalln`。\n- 如果某个 helper 名称在新内核里改了，先查是否存在 `__arm64_sys_*`、`ksys_*`、`do_*`、`vfs_*` 等同链路函数。\n- 如果内核启用了裁剪、LTO、CFI 或符号隐藏，建议结合设备内核映像、`kallsyms`、反汇编结果和运行时日志重新确认真实落点。\n\n## 如何查看内核导出了哪些符号？\n\n可以直接在设备上查看 `kallsyms`：\n\n```bash\ncat \u002Fproc\u002Fkallsyms | grep 符号名\n```\n\n也可以在 IDA 中导入内核符号后，再交叉分析目标函数是否存在、名称是否变化、以及真实调用链落点。\n\n## `load failed` 怎么查看原因？\n\n可以通过 KernelPatch 相关日志定位原因：\n\n```bash\nadb shell logcat | grep KP\n```\n\n比较常见的原因是某些必需符号没有导入，例如 `memset`，或者目标内核上的符号名、调用路径与当前模块预期不一致。\n\n## 推送到设备\n\n```bash\nmake push\n```\n\n## 清理\n\n```bash\nmake clean\n```\n\n## 致谢\n\n- 感谢 KernelPatch 项目提供 KPM 模块运行与内核补丁能力。\n- 感谢 Frida 项目推动动态分析、调试与逆向工程生态的发展。\n","panda-hide 是一个针对 Android 黑客设计的 KernelPatch KPM 模块，用于隐藏调试器和反调试检测。其核心功能包括调试器检测隐藏、Frida 检测隐藏、openat 系统调用劫持、网络检测隐藏以及内存检测隐藏。该项目通过动态解析内核符号并利用 syscall hook 技术实现对特定内核行为的修改，以达到隐藏调试工具的目的。适用于需要绕过应用程序安全检查或进行逆向工程研究的场景。编译时需使用 aarch64-none-elf 交叉编译工具链，并依赖于 KernelPatch 源码环境。","2026-06-11 02:48:05","CREATED_QUERY"]