• 31、应用调试之自制系统调用、编写进程查看器


    应用程序调用的read、open这些函数是glibc实现的,在调用的时候从用户态切换为内核态,其实质就是执行一条swi指令,并带有一个value,swi指令执行的时候会产生一个异常,CPU会跳到异常处理函数(vector_swi)去执行,会根据导致异常的指令里面的value调用对应的函数,比如sys_read、sys_open.

    ENTRY(vector_swi)

      //保存现场,异常和中断一样,需要保存现场

      //使用tbl来保存存有系统调用的数组sys_call_table,数组里面的内容在calls.s中定义,tbl就是个宏,表示某个寄存器,

      ldw tbl, =sys_call_table

      //处理swi机器码,仅留下value值,swi机器码每一位的意思可以查看s3c2440手册

      andn scno, scno, #0xff000000 @ mask off SWI op-code
      andn scno, scno, #0x00ff0000 @ mask off SWI op-code

      //PC 赋值相应系统调用函数地址,根据value在数组中确定系统调用

      ldw pc, [tbl+], scno << #2

    本节会制作系统调用函数,步骤如下:

    1、写一个应用函数,执行swi指令;

     __brk(void *addr) 

     {

      asm("mov a1,%1 "  //a1就是r0,把%1参数存在r0中,

        "swi %2 "             //调用swi,执行完后把结果存在r0中,其在执行的时候如果使用参数,会从r0、r1寄存器取

        "mov %0,a1;"  //把r0赋给newbrk

        :"=r"(newbrk)  //newbrk表示%0 ,“=r”修饰变量newbrk用于接受值,即输出

        :"r"(addr),"i"(SYS_ify(brk))  //addr表示%1 SYS_ify(brk)表示%2  “r”修饰变量会被读取,“i”修饰变量是个立即数,即输入

        :"a1")  //表示过程中会被改变的寄存器

      }

    2、在内核里面仿sys_xxxx写一个函数

      在calls.s中最后一项加入CALL(sys_hello)

      在syscalls.h中添加sys_hello函数声明

      2.6的内核sys_write等系统调用函数是在fs/read_write.c中,仿sys_write在read_write.c中添加sys_hello

      4.3.2的内核sys_write等系统调用函数是在fs/read_write.c中通过SYSCALL_DEFINE3宏定义声明,展开后与2.6内核一样

    制作系统调用的作用:可以用来打断点,因为gdb运行的时候依赖网络,如果网络不好可以使用自制系统调用来调试

    方法:1、编译程序后在反汇编,在反汇编中查看机器码(地址和汇编指令中间的就是机器码),在可执行文件中搜索要替换的机器码(记住32位的机器码存储的时候低位在前,反过来搜索),swi指令的机器码是efXXXXXX,XXXXXX是value值

       2、修改应用程序的可执行文件,替换“某个位置”的代码为swi #val 机器码

       3、执行程序

       4、进入sys_hello,打印信息,返回执行原来的指令

    (如果在sys_hello中打印全局变量,先在反汇编中查看全局变量的地址,然后在sys_hello中直接访问就可以,不用remmap,还需要在sys_hello中实现被swi替换的指令功能,并执行,如果是局部变量,需要直接分析反汇编代码来确认变量的地址)

    (在替换机器码去执行swi的时候,会保存现场,寄存器的值会被保存在pt_regs中,通过task_pt_regs(current)可以得到pt_regs)

  • 相关阅读:
    strcspn()函数
    makfile通用版本
    C实现简单的xml格式文件
    shell编程题(七)
    C语言实现五子棋
    打字软件(最终版本)
    TypeWriting
    KMP 串的模式匹配 (25分)
    C链表操作
    Ubuntu终端字体
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8681890.html
Copyright © 2020-2023  润新知