自写系统调用调试应用程序过程

在本节里面我们就详细来讲一下如何用我们自己实现的系统调用来调试应用程序.

 一、原理

要想自制系统调用,当然首相要做的就是明白系统调用的过程:

我们拿open函数来举个例子:当用户空间执行open函数时,会通过glibc函数库的作用最终去调用sys_open函数,sys_open函数最终又会调用我们具体注册的open函数!那么这里最主要的就是glibc函数库干了些什么呢?其实它的作用就是当用户空间执行open函数时,会去执行一条swi #val指令,这条指令会使cpu发生异常,并跳转到异常向量入口:vector_swi处去执行,之后的代码会根据引发异常的指令取出其中的参数,并根据这个参数调用对应的处理函数!sys_open、sys_read、sys_write这些函数是放在一个数组里面的,就是根据取出的这个val值为下标找到sys_open函数!

说的有点乱,我们来理一理:app调用open-》swi #val-》引发cpu异常-》跳转到异常向量入口处-》根据引发异常的指令调用对应的处理函数!

那么我们自制系统调用的话,需要实现两点:

1、写一个应用函数:swi #val

2、在内核里面仿sys_xxx写一个函数,放入数组!

前者用于引发异常,后者用于具体实现!

 二、实现

1、内核函数

(1)在arch/arm/kernel/call.S文件里面的CALL()列表的最后添加一项,如:CALL(sys_hello)

这里是用来调用sys_hello

(2)在fs/read_write.c文件里加入如下代码:

asmlinkage void sys_hello(const char __user * buf, size_t count)

{

char ker_buf[100];

if(buf)

{

// 目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0

三、步骤

1、修改应用程序的可执行文件,替换某个位置的代码为swi val

2、执行程序

3、进入到sys_hello->在sys_hello里面打印信息->执行原来的指令->返回

四、具体实现

我们的应用程序是:

//file:test_sc.c

#include

int cnt = 0;

void C(void)

{

int i = 0;

while (1)

{

printf("Hello, cnt = %d, i = %d\n", cnt, i);

cnt++;

i = i + 2;

sleep(5);

}

}

void B(void)

{

C();

}

void A(void)

{

B();

}

int main(int argc, char **argv)

{

A();

return 0;

}

具体步骤:

(1)编译:arm-linux-gcc test_sc.c -o test_sc

(2)反汇编:arm-linux-objdump -D test_sc > test_sc.dis

(3)我们打开上面得到的可执行文件和反汇编文件

比如我们想在C函数的i=i+2;处打断点的话,我们先在反汇编文件里面找到对应的指令:

84d4: e2833002  add r3, r3, #2 ; 0x2

其中:e2833002是机器码,这是我们所需要的!

我们去可执行文件里面去搜索这个机器码,在可执行文件里它对应的机器码应该是:02 30 83 e2

我们将此机器码改为swi指令的机器码!

我们可以将上一节里面的文件反汇编一下,然后得到swi的机器码为:ef900160

(4)经过上面的修改,当程序执行到i=i+2;这条指令时,会产生系统调用,最终执行sys_hello函数。

在sys_hello函数里面,我们可以最一些必要的工作,具体程序如下:
 自写系统调用调试应用程序过程_设计制作_制造/封装

此外还需要在:include/linux/syscalls.h 文件里将函数声明改为:asmlinkage void sys_hello(const char __user * buf, int count);

(5)编译内核,用新内核启动

(6)运行测试程序(在此之前要修改测试程序的权限:chmod 777 test_sc_swi),输出信息如下:

Hello, cnt = 0, i = 0

sys_hello: cnt = 1

sys_hello: i = 0

Hello, cnt = 1, i = 2

sys_hello: cnt = 2

sys_hello: i = 2

Hello, cnt = 2, i = 4

sys_hello: cnt = 3

sys_hello: i = 4

测试成功!

本节讲的调试方法比较晦涩,一般不会采用!

10
41
0
4

相关资讯

  1. 1、《地下城堡》新版本暗黑来袭新玩法新职业介绍4527
  2. 2、《十万个冷笑话2》新手挑战生命不息吐槽不止1427
  3. 3、正版手游《三国战纪》今日全渠道首发!4541
  4. 4、桃园结义争天下《兵界之王》军团系统共叙兄弟情4939
  5. 5、《九州天空城3D》首届九州狂欢Party盛大开启3335
  6. 6、《黄易派来的》香家密窟副本大揭秘终篇3506
  7. 7、不服就来单练!《鬼剑豪》英雄试炼大爆料696
  8. 8、《究极进化》儿时的疯狂带你重拾童年记忆3616
  9. 9、脑洞大开《神无月》MV还能这样玩2161
  10. 10、《王者军团》英雄现实对应兵种大揭秘!2684
全部评论(0)
我也有话说
0
收藏
点赞
顶部