本人学号最后两位为30,根据 syscall_32.tbl 中的相应映射,选择 utime 系统调用展开分析。

utime 系统调用的功能为“更改一个文件的访问和修改时间”,实际使用的效果如下:

可以看到,在 03:11 创建的 file1 和 file2 文件,未经过 utime 系统调用的处理,最后修改时间、最后访问时间、更改状态时间均为 03:11。
经过 ./utime file1 的命令后,可以看到 file1 的最后修改时间和最后访问时间未变,但是更改状态时间则更改为程序运行时的时间,程序成功运行。
以下为通过汇编指令触发的具体的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <utime.h>
#include <sys/stat.h>
int main (int argc, char **argv)
{
int i, fd;
struct stat statbuf;
struct utimbuf timebuf;
for(i = 1; i < argc; i++)
{
if(stat(argv[i], &statbuf) < 0)
{
printf ("%s: stat error\n", argv[i]);
continue;
}
if((fd = open(argv[i], O_RDWR | O_TRUNC)) < 0)
{
printf ("%s: open error\n", argv[i]);
continue;
}
close(fd);
timebuf.actime = statbuf.st_atime;
timebuf.modtime = statbuf.st_mtime;
int res; // 存储函数运算结果
asm volatile(
"movl %1, %%ebx\n\t" // 将第一个参数 argv[i] 放入 ebx 寄存器
"movl %2, %%ecx\n\t" // 将第二个参数 &timebuf 放入 ecx 寄存器
"movl $30, %%eax\n\t" // utime 的系统调用号为30,将其放入 eax 寄存器
"int $0x80\n\t" // 触发系统中断
"movl %%eax, %0\n\t" // 将函数处理结果返回给 res 变量中
:"=m"(res)
:"b"(argv[i]),"c"(&timebuf)
);
// if(utime(argv[i], &timebuf) < 0)
if(res < 0)
{
printf ("%s: utime error\n", argv[i]);
continue;
}
}
exit(0);
}
原文:https://www.cnblogs.com/lygttxs/p/12902591.html