当前位置:首页>Linux>Linux 进程注入:从调试器到武器化的技术演进

Linux 进程注入:从调试器到武器化的技术演进

  • 2026-03-26 09:14:53
Linux 进程注入:从调试器到武器化的技术演进

一、这到底是什么技术?

简单来说,这项技术就像给正在跑步的人做心脏手术——不需要重启程序,不需要修改磁盘上的文件,就能让目标进程加载并执行你指定的共享库(.so 文件)。

想象一下这个场景:

  • 你的服务器上有个程序正在运行
  • 你想扩展它的功能,或者监控它的行为
  • 传统方法是改代码、重新编译、重启服务
  • 而这项技术允许你直接"钻"进进程内存,现场加载你的代码

这在安全研究、动态调试、热更新、甚至恶意软件领域都有应用。本质上,它利用了 Linux 操作系统提供的进程调试接口,把"调试能力"用到了极致。


二、核心知识点地图

在深入代码之前,先了解这项技术涉及的关键领域:

领域
关键概念
作用
进程调试ptrace
 系统调用
让 A 进程控制 B 进程的执行、读写其内存和寄存器
内存管理mmap
mprotectmunmap
在目标进程中申请内存、改权限、释放内存
进程间通信process_vm_writev
无需 ptrace 也能跨进程写内存(但受权限限制)
文件描述符传递pidfd
memfd_createpidfd_getfd
在进程间传递"匿名文件",实现无文件落盘注入
动态链接dlopen
dlclose
运行时加载/卸载共享库的标准接口
ELF 格式
符号表、重定位、GOT/PLT
解析可执行文件结构,找到函数地址
调用约定
x86-64 SysV ABI / ARM64 AAPCS
规定函数参数怎么通过寄存器传递
系统调用拦截
利用 PTRACE_SYSCALL
在目标进程执行系统调用时"截胡"

三、设计思路:四步"手术"流程

整个注入过程可以类比为一次精密的手术操作,分为四个阶段:

阶段一:麻醉(Attach & Seize)

首先要控制住目标进程。就像手术需要病人保持静止一样,我们不能让目标进程在注入过程中乱跑。

// 核心操作:PTRACE_SEIZE 比传统 ATTACH 更温和
ptrace(PTRACE_SEIZE, pid, NULL, PTRACE_O_TRACESYSGOOD);
ptrace(PTRACE_INTERRUPT, pid, NULLNULL);
waitpid(pid, &status, __WALL);  // 等待进程停下

这里用到了 PTRACE_SEIZE 而非传统的 PTRACE_ATTACH,区别在于:

  • SEIZE 不会立即停止进程,而是配合 INTERRUPT 使用
  • 可以设置选项(如 PTRACE_O_TRACESYSGOOD),让系统调用停止时发送 SIGTRAP | 0x80 信号,方便识别

阶段二:开切口(Syscall Interception)

这一步是拦截目标进程正在进行的系统调用。为什么选择系统调用拦截点?

因为系统调用是用户态和内核态的交界,进程在这里会"暂停"等待内核处理,给我们一个干净的执行环境

ptrace(PTRACE_SYSCALL, pid, NULLNULL);  // 执行到下一个系统调用入口
waitpid(pid, &status, __WALL);            // 等待停止
ptrace(PTRACE_GETREGSET, pid, NT_PRSTATUS, &iov);  // 保存寄存器状态

关键技巧:取消当前系统调用

  • x86-64:把 orig_rax 设为 -1
  • ARM64:通过 NT_ARM_SYSTEM_CALL 设置系统调用号为 -1

这样内核会"跳过"这次系统调用,让进程回到用户态,但控制权在我们手中。

阶段三:植入与执行(Memory Setup & Code Injection)

这是整个技术的核心创新点。我们需要解决三个问题:

1. 内存从哪来?

目标进程不会自动给你内存,我们需要主动申请

// 在目标进程中执行 mmap,申请可读写的内存
___regs_set_sys_args(&regs, __NR_mmap,
0,                    // 让内核选地址
                     data_sz + exec_sz,    // 申请两页:数据页 + 代码页
                     PROT_WRITE | PROT_READ, 
                     MAP_ANONYMOUS | MAP_PRIVATE, 
-10);

2. 代码怎么放进去?

申请到内存后,我们要写入两部分内容:

  • 数据区:存放字符串参数(如共享库路径)
  • 代码区:存放一段"跳板"代码(trampoline)

跳板代码的作用是让目标进程执行 dlopen

# x86-64 版本
__inj_call:
    call *%rax        # 调用 rax 指向的函数(dlopen)
__inj_trap:
    int3              # 执行完后触发断点,控制权回到注入器
# ARM64 版本  
__inj_call:
    blr x8            # 调用 x8 指向的函数
__inj_trap:
    brk 
#0            # 断点指令

3. 怎么让目标进程执行?

通过篡改寄存器实现:

// 设置函数参数(x86-64 调用约定:rdi, rsi, rdx, rcx, r8, r9)
regs.rdi = data_mmap_addr;      // dlopen 的第一个参数:路径
regs.rsi = RTLD_LAZY;           // dlopen 的第二个参数:加载标志
regs.rax = dlopen_tracee_addr;  // 要调用的函数地址
regs.rip = exec_mmap_addr;      // 指令指针指向我们的跳板代码

ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &iov);
ptrace(PTRACE_CONT, pid, NULLNULL);  // 放行!

当目标进程恢复执行时,它会:

  1. 跳转到我们的跳板代码
  2. 调用 dlopen 加载共享库
  3. 执行 int3 断点指令,再次暂停
  4. 我们捕获断点,恢复现场

阶段四:无痕缝合(Cleanup & Replay)

手术做完了,需要恢复现场,让病人继续正常生活

// 恢复原始寄存器状态(包括调整过的指令指针)
orig_regs.rip -= 2;  // x86-64 系统调用指令是 2 字节,需要回退
ptrace(PTRACE_SETREGSET, pid, NT_PRSTATUS, &iov);
ptrace(PTRACE_SYSCALL, pid, NULLNULL);  // 重新执行原始系统调用
ptrace(PTRACE_DETACH, pid, NULLNULL);   // 脱钩,让进程自由运行

四、关键技术细节解析

1. 无文件注入:memfd_create 的妙用

传统注入需要把共享库写入磁盘,再让目标进程加载。但这样会在文件系统留下痕迹。

现代 Linux(内核 3.17+)提供了 memfd_create,可以创建内存中的匿名文件

// 在目标进程中创建匿名文件
memfd_fd = memfd_create("shlib-inject", MFD_CLOEXEC);

// 通过 pidfd 机制,把目标进程的 fd 映射到当前进程
int local_fd = pidfd_getfd(pid_fd, remote_memfd_fd, 0);

// 直接往这个 fd 写入共享库内容
copy_file_to_fd("libinj.so", local_fd);

// 目标进程通过 /proc/self/fd/<fd> 路径加载
dlopen("/proc/self/fd/3", RTLD_LAZY);

整个过程不落磁盘,规避了文件监控。

2. 跨架构支持:x86-64 vs ARM64

代码中通过宏定义实现了双架构支持,关键差异:

特性
x86-64
ARM64
调用寄存器
rax
(函数地址), rdi-r9(参数)
x8
(函数地址), x0-x7(参数)
系统调用号
raxx8
指令长度
2 字节(syscall)
4 字节(svc #0
断点指令
int3
 (0xCC)
brk #0
栈对齐
16 字节 + 128 字节红区
16 字节
特殊寄存器集
NT_ARM_SYSTEM_CALL

3. 进程间内存写入:process_vm_writev

相比 ptrace 的逐字写入,process_vm_writev 可以批量传输数据,效率更高:

structioveclocal = {
    .iov_base = (void *)local_src,
    .iov_len = sz
};
structiovecremote = {
    .iov_base = (void *)remote_dst,
    .iov_len = sz
};

process_vm_writev(pid, &local, 1, &remote, 10);

注意:这个系统调用尊重内存权限,只能写入可写区域。这也是为什么我们需要先 mmap 申请可写内存。


五、代码流程图解

┌─────────────────┐
│   启动注入器     │
│  (attach 到 PID) │
└────────┬────────┘
         ▼
┌─────────────────┐
│  PTRACE_SEIZE   │◄──── 温和地"抓住"目标进程
│  PTRACE_INTERRUPT│
└────────┬────────┘
         ▼
┌─────────────────┐
│  等待系统调用    │◄──── 在系统调用入口"截停"
│  (syscall-stop)  │
└────────┬────────┘
         ▼
┌─────────────────┐
│  保存原始寄存器  │◄──── 备份现场,方便恢复
│  GETREGSET       │
└────────┬────────┘
         ▼
┌─────────────────┐
│  取消当前系统调用 │◄──── 让内核跳过这次调用
│  (orig_rax = -1) │
└────────┬────────┘
         ▼
┌─────────────────┐     ┌─────────────────┐
│  注入 mmap 调用  │────►│  在目标进程中    │
│  (申请内存)      │     │  执行 mmap()     │
└─────────────────┘     └────────┬────────┘
                                 ▼
                         ┌─────────────────┐
                         │  返回内存地址    │
                         │  (data + exec)  │
                         └────────┬────────┘
                                  ▼
┌─────────────────┐     ┌─────────────────┐
│  写入跳板代码    │◄────│  process_vm_    │
│  (__inj_call)    │     │  writev()       │
└────────┬────────┘     └─────────────────┘
         ▼
┌─────────────────┐
│  注入 mprotect   │◄──── 把代码页改成可执行
│  (改内存权限)    │
└────────┬────────┘
         ▼
┌─────────────────┐     ┌─────────────────┐
│  注入 memfd_    │────►│  创建匿名文件    │
│  create()        │     │  (内存中的"文件") │
└─────────────────┘     └────────┬────────┘
                                 ▼
┌─────────────────┐     ┌─────────────────┐
│  通过 pidfd_    │◄────│  把共享库内容    │
│  getfd 复制数据  │     │  写入 memfd      │
│  到 memfd        │     │                 │
└────────┬────────┘     └─────────────────┘
         ▼
┌─────────────────┐
│  篡改寄存器      │◄──── 设置 dlopen 参数
│  指向跳板代码    │      (路径、标志位)
└────────┬────────┘
         ▼
┌─────────────────┐
│  PTRACE_CONT     │◄──── 放行目标进程
│  (执行跳板)      │
└────────┬────────┘
         ▼
┌─────────────────┐
│  捕获 SIGTRAP    │◄──── 跳板执行完毕,断点触发
│  (执行完成信号)  │
└────────┬────────┘
         ▼
┌─────────────────┐
│  恢复原始系统调用 │◄──── 让目标进程继续原来的工作
│  PTRACE_DETACH   │      (仿佛什么都没发生)
└─────────────────┘

...
intmain(int argc, char *argv[])
{
...
if (argc != 2) {
printf("Usage: %s <PID>\n", argv[0]);
return1;
 }

 pid = atoi(argv[1]);
if (pid <= 0) {
printf("Invalid PID: %s\n", argv[1]);
return1;
 }

printf("Target PID: %d\n", pid);

 sa.sa_handler = signal_handler;
 sigemptyset(&sa.sa_mask);
 sa.sa_flags = 0;

if (sigaction(SIGINT, &sa, NULL) == -1) {
  perror("sigaction SIGINT");
return1;
 }

if (sigaction(SIGTERM, &sa, NULL) == -1) {
  perror("sigaction SIGTERM");
return1;
 }

int pid_fd = syscall(SYS_pidfd_open, pid, 0);
if (pid_fd < 0) {
  err = -errno;
fprintf(stderr"pidfd_open(%d) failed: %d\n", pid, err);
return1;
 }

long libc_self_end = 0;
long libc_self_base = find_libc_base(-1, &libc_self_end);
long libc_tracee_base = find_libc_base(pid, NULL);
if (libc_self_base == 0 || libc_tracee_base == 0)
return1;
char libc_path[512];
snprintf(libc_path, sizeof(libc_path), "/proc/self/map_files/%lx-%lx", libc_self_base, libc_self_end);
long dlopen_off = find_elf_sym_info(libc_path, "dlopen");
long dlclose_off = find_elf_sym_info(libc_path, "dlclose");
if (dlopen_off == 0 || dlclose_off == 0)
return1;
long dlopen_tracee_addr = libc_tracee_base + dlopen_off;
long dlclose_tracee_addr = libc_tracee_base + dlclose_off;
printf("Local libc base: 0x%lx (dlopen offset %lx, dlclose offset %lx)\n",
        libc_self_base, dlopen_off, dlclose_off);
printf("Remote libc base: 0x%lx (dlopen @ 0x%lx, dlclose @ 0x%lx)\n",
        libc_tracee_base, dlopen_tracee_addr, dlclose_tracee_addr);


structuser_regs_structorig_regsregs;

printf("Intercepting tracee...\n");
if (ptrace_intercept(pid, &orig_regs, "tracee-intercept") < 0)
return1;

 print_regs(&orig_regs, "ORIG REGS");


constlong page_size = sysconf(_SC_PAGESIZE);
constlong data_mmap_sz = page_size;
constlong exec_mmap_sz = page_size;
long data_mmap_addr = 0;
long exec_mmap_addr = 0;

printf("Executing mmap(data + exec)...\n");
/* void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); */
 regs = orig_regs;
 ___regs_set_sys_args(&regs, __NR_mmap,
0, data_mmap_sz + exec_mmap_sz,
        PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_PRIVATE, -10);
if (ptrace_exec_syscall(pid, &regs, &regs, "mmap-data+exec") < 0)
return1;

 data_mmap_addr = ___regs_result(&regs);
if (data_mmap_addr <= 0) {
fprintf(stderr"mmap() inside tracee failed: %ld, bailing!\n", data_mmap_addr);
return1;
 }

 exec_mmap_addr = data_mmap_addr + data_mmap_sz;
printf("mmap() returned 0x%lx (data @ %lx, exec @ %lx)\n",
        data_mmap_addr, data_mmap_addr, exec_mmap_addr);


 err = remote_vm_write(pid, (void *)exec_mmap_addr, __inj_call, __inj_call_sz);
if (err)
return1;


printf("Executing mprotect(r-x)...\n");
 regs = orig_regs;
 ___regs_set_sys_args(&regs, __NR_mprotect,
        exec_mmap_addr, exec_mmap_sz, PROT_EXEC | PROT_READ);

long mprotect_ret;
if (ptrace_exec_syscall(pid, &regs, &regs, "mprotect-rx") < 0)
return1;
 mprotect_ret = ___regs_result(&regs);
if (mprotect_ret < 0) {
fprintf(stderr"mprotect(r-x) inside tracee failed: %ld, bailing!\n", mprotect_ret);
return1;
 }

printf("Executing memfd_create()...\n");

char memfd_name[] = "shlib-inject";
int memfd_remote_fd = -1;

 err = remote_vm_write(pid, (void *)data_mmap_addr, memfd_name, sizeof(memfd_name));
if (err)
return1;

 regs = orig_regs;
 ___regs_set_sys_args(&regs, __NR_memfd_create, data_mmap_addr, MFD_CLOEXEC);

if (ptrace_exec_syscall(pid, &regs, &regs, "memfd_create") < 0)
return1;

 memfd_remote_fd = ___regs_result(&regs);
if (memfd_remote_fd < 0) {
fprintf(stderr"memfd_create() inside tracee failed: %d, bailing!\n", memfd_remote_fd);
return1;
 }
printf("memfd_create() result: %d\n", memfd_remote_fd);

int memfd_local_fd = syscall(SYS_pidfd_getfd, pid_fd, memfd_remote_fd, 0);
if (memfd_local_fd < 0) {
  err = -errno;
fprintf(stderr"pidfd_getfd(pid %d, remote_fd %d) failed: %d\n", pid, memfd_remote_fd, err);
return1;
 }

 err = copy_file_to_fd("libinj.so", memfd_local_fd);
if (err)
return1;

char memfd_path[64];
snprintf(memfd_path, sizeof(memfd_path), "/proc/self/fd/%d", memfd_remote_fd);
 err = remote_vm_write(pid, (void *)data_mmap_addr, memfd_path, sizeof(memfd_path));
if (err)
return1;

printf("Executing dlopen() injection...\n");

long dlopen_handle;
 regs = orig_regs;
 ___regs_set_func_args(&regs, data_mmap_addr, RTLD_LAZY);
if (ptrace_exec_user_call(pid, exec_mmap_addr, dlopen_tracee_addr, &regs, &dlopen_handle, "dlopen") < 0)
return1;

printf("dlopen() result: %lx\n", dlopen_handle);
if (dlopen_handle == 0) {
fprintf(stderr"Failed to dlopen() injection library, bailing...\n");
return1;
 }

printf("Replaying original syscall and detaching tracee...\n");
if (ptrace_replay(pid, &orig_regs, "replay-syscall") < 0)
return1;


 sleep(1);

printf("Re-intercepting for cleanup...\n");
if (ptrace_intercept(pid, &orig_regs, "tracee-reintercept") < 0)
return1;
 print_regs(&orig_regs, "ORIG REGS (2)");

printf("Executing dlclose() injection...\n");
long dlclose_ret;
 regs = orig_regs;
 ___regs_set_func_args(&regs, dlopen_handle);
if (ptrace_exec_user_call(pid, exec_mmap_addr, dlclose_tracee_addr, &regs, &dlclose_ret, "dlclose") < 0)
return1;
printf("dlclose() result: %ld\n", dlclose_ret);
if (dlclose_ret != 0) {
fprintf(stderr"Failed to dlclose() injection library, bailing...\n");
return1;
 }


printf("Executing munmap(data + exec)...\n");

 regs = orig_regs;
 ___regs_set_sys_args(&regs, __NR_munmap, data_mmap_addr, data_mmap_sz + exec_mmap_sz);
if (ptrace_exec_syscall(pid, &regs, &regs, "munmap-data+exec") < 0)
return1;
long munmap_ret = ___regs_result(&regs);
if (munmap_ret < 0) {
fprintf(stderr"munmap() inside tracee failed: %ld, bailing!\n", munmap_ret);
return1;
 }
printf("munmap() result: %ld\n", munmap_ret);


printf("Replaying original syscall and detaching tracee...\n");
if (ptrace_replay(pid, &orig_regs, "replay-syscall-final") < 0)
return1;

printf("Tracee detached and running...\n");
printf("Press Ctrl-C to exit...\n");

while (!should_exit) {
  usleep(50000);
 }

printf("Exited gracefully.\n");
return0;
}

代码运行测试:

打开第一个终端,执行官方指令:

./app

记住这个 PID(比如 1234),也可以用pidof app快速查:

pidof app # 输出数字就是app的PID

执行注入 打开第二个终端,执行官方注入指令:

# 直接用pidof获取app的PID
sudo ./inject `pidof app`

# 手动填PID
sudo ./inject 1234 # 替换成你的app PID

六、安全与防御视角

这项技术虽然是合法的调试/研究工具,但也可能被滥用。了解防御机制同样重要:

1. Yama LSM 的 ptrace_scope

现代 Linux 发行版默认启用 Yama 安全模块,通过 /proc/sys/kernel/yama/ptrace_scope 控制:

  • 0:允许任何进程 ptrace 任何同 UID 进程
  • 1:只允许 ptrace 子进程(默认)
  • 2:需要 CAP_SYS_PTRACE 能力(通常是 root)
  • 3:完全禁止 ptrace

2. 进程的 dumpable 标志

如果进程调用了 prctl(PR_SET_DUMPABLE, 0),或者执行了 setuid 程序,会变成不可转储状态,此时任何远程内存访问都会被拒绝

3. Seccomp 沙箱

严格沙箱可以限制进程能使用的系统调用,阻止 mmap 申请可执行内存等操作。

4. 监控检测点

安全团队可以监控以下异常行为:

  • 非调试器进程使用 ptrace
  • 频繁的 process_vm_writev 调用
  • 进程内存中出现新的可执行区域(通过 /proc/PID/maps 监控)
  • 意外的 memfd_create 使用

七、总结

这项技术展示了 Linux 操作系统进程间控制能力的极限。它巧妙地组合了多个内核机制:

  1. ptrace 提供进程控制基础
  2. 系统调用拦截 创造干净的执行窗口
  3. 匿名内存映射 解决代码存放问题
  4. memfd 实现无文件传输
  5. 寄存器操控 实现任意函数调用

这种技术的应用边界很广:合法场景下可以做应用监控、动态插桩;但也可能被滥用,因此操作系统也有对应的防护机制(比如 ptrace_scope 限制、SELinux、AppArmor 等)。理解它的原理,不仅能掌握一项实用技术,更能深入理解 Linux 进程运行的底层逻辑。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 11:42:46 HTTP/2.0 GET : https://f.mffb.com.cn/a/482513.html
  2. 运行时间 : 0.189871s [ 吞吐率:5.27req/s ] 内存消耗:4,828.19kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=345253a078cc0706fbe31625ab620759
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000727s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001060s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000764s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000533s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000976s ]
  6. SELECT * FROM `set` [ RunTime:0.000421s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001065s ]
  8. SELECT * FROM `article` WHERE `id` = 482513 LIMIT 1 [ RunTime:0.000941s ]
  9. UPDATE `article` SET `lasttime` = 1774582966 WHERE `id` = 482513 [ RunTime:0.004556s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000470s ]
  11. SELECT * FROM `article` WHERE `id` < 482513 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000805s ]
  12. SELECT * FROM `article` WHERE `id` > 482513 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006968s ]
  13. SELECT * FROM `article` WHERE `id` < 482513 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003623s ]
  14. SELECT * FROM `article` WHERE `id` < 482513 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003564s ]
  15. SELECT * FROM `article` WHERE `id` < 482513 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004650s ]
0.191584s