免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2883 | 回复: 19
打印 上一主题 下一主题

读/dev/kmem错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-20 16:15 |只看该作者 |正序浏览
RHEL3,内核与gcc全部是系统自带。
程序中相关代码:

  1.         fd_kmem = open("/dev/kmem", O_RDWR);
  2.         ptr_idt = get_addr_idt();
  3.         descriptor = (struct descriptor_idt *) malloc(sizeof(struct descriptor_idt));
  4.         ......
  5.         readkmem(descriptor, ptr_idt + 8 * x, sizeof(struct descriptor_idt));

  6.         ......

  7. void readkmem(void *m, unsigned off, int size)
  8. {
  9.         int i;
  10.         if (lseek(fd_kmem, off, SEEK_SET) != off) {
  11.                 fprintf(stderr, "Error lseek. Are you root? \n");
  12.                 exit(-1);
  13.         }
  14.         if (read(fd_kmem, m, size) != size) {
  15.                 fprintf(stderr, "Error read kmem\n");
  16.                 exit(-1);
  17.         }
  18. }

  19. unsigned long get_addr_idt(void)
  20. {
  21.         unsigned char idtr[6];
  22.         unsigned long idt;
  23.         __asm__ volatile ("sidt %0":"=m" (idtr));
  24.         idt = *((unsigned long *) &idtr[2]);
  25.         return (idt);
  26. }
复制代码

每次运行都会提示"Error read kmem",调试发现read(fd_kmem, m, size)的返回值总是0。
不知道为什么?

[ 本帖最后由 sailer_sh 于 2006-3-20 18:08 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2006-03-22 10:49 |只看该作者
原帖由 jobman 于 2006-3-22 10:42 发表
  1. ptr_idt + 8 * 0 = ffc18000
复制代码

这个不对,idt 不会跑到这里来吧,别的没有问题,估计和你的平台有关,是ia-32吗?


我用普通的PC p4 1.8G,vmware exp server下的SLES9和RHEL3下跑这个程序。

刚在一台kernel 2.4.9-34,gcc 2.96的box(应该是redhat的某个版本)上跑这个程序,把llseek()改成lseek(),编译后运行正常。
我正在一台PC上装SLES9,装好以后再试试。

[ 本帖最后由 sailer_sh 于 2006-3-22 10:54 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2006-03-22 10:42 |只看该作者
  1. ptr_idt + 8 * 0 = ffc18000
复制代码

这个不对,idt 不会跑到这里来吧,别的没有问题,估计和你的平台有关,是ia-32吗?

论坛徽章:
0
18 [报告]
发表于 2006-03-21 18:07 |只看该作者
原帖由 jobman 于 2006-3-21 16:52 发表
sailer_sh
能把 strace 的结果发上来看看么?


程序里使用了llseek()函数:

linux:~ # strace ./checkidt -A

  1. execve("./checkidt", ["./checkidt", "-A"], [/* 57 vars */]) = 0
  2. uname({sys="Linux", node="linux", ...}) = 0
  3. brk(0)                                  = 0x804c000
  4. open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)
  5. old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40017000
  6. open("/etc/ld.so.cache", O_RDONLY)      = 3
  7. fstat64(3, {st_mode=S_IFREG|0644, st_size=66499, ...}) = 0
  8. old_mmap(NULL, 66499, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000
  9. close(3)                                = 0
  10. open("/lib/tls/libc.so.6", O_RDONLY)    = 3
  11. read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@S\1\000"..., 512) = 512
  12. fstat64(3, {st_mode=S_IFREG|0755, st_size=1345545, ...}) = 0
  13. old_mmap(NULL, 1128748, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40029000
  14. madvise(0x40029000, 1128748, MADV_SEQUENTIAL|0x1) = 0
  15. old_mmap(0x40132000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x109000) = 0x40132000
  16. old_mmap(0x4013a000, 10540, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x4013a000
  17. close(3)                                = 0
  18. set_thread_area({entry_number:-1 -> 6, base_addr:0x400179a0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
  19. munmap(0x40018000, 66499)               = 0
  20. brk(0)                                  = 0x804c000
  21. brk(0x806d000)                          = 0x806d000
  22. brk(0)                                  = 0x806d000
  23. fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
  24. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40018000
  25. write(1, "\n", 1
  26. )                       = 1
  27. open("/dev/kmem", O_RDWR)               = 3
  28. write(1, "fd_kmem= 3, show_all_info = -1, "..., 56fd_kmem= 3, show_all_info = -1, show_all_descriptor = 1
  29. ) = 56
  30. write(1, "Int *** Stub Address *** Segment"..., 51Int *** Stub Address *** Segment *** DPL *** Type
  31. ) = 51
  32. write(1, "--------------------------------"..., 52---------------------------------------------------
  33. ) = 52
  34. write(1, "sizeof(descriptor) = 4, ptr_idt "..., 86sizeof(descriptor) = 4, ptr_idt + 8 * 0 = ffc18000, sizeof(struct descriptor_idt) = 8
  35. ) = 86
  36. _llseek(3, 4290871296, 0xbffff3e0, 0x8048e47 /* SEEK_??? */) = -1 EINVAL (Invalid argument)
  37. write(2, "Error lseek. Are you root? \n", 28Error lseek. Are you root?
  38. ) = 28
  39. munmap(0x40018000, 4096)                = 0
  40. exit_group(-1)                          = ?
复制代码


如果程序里改用lseek()函数,输出的后几行:

  1. write(1, "--------------------------------"..., 52---------------------------------------------------
  2. ) = 52
  3. write(1, "sizeof(descriptor) = 4, ptr_idt "..., 86sizeof(descriptor) = 4, ptr_idt + 8 * 0 = ffc18000, sizeof(struct descriptor_idt) = 8
  4. ) = 86
  5. lseek(3, 4290871296, SEEK_SET)          = 4290871296
  6. read(3, "", 8)                          = 0
  7. write(2, "Error read kmem 1\n", 18Error read kmem 1
  8. )     = 18
  9. write(2, "read: Success\n", 14read: Success
  10. )         = 14
  11. write(1, "read = 0, size = 8, fd_kmem= 3, "..., 46read = 0, size = 8, fd_kmem= 3, sizeof(m) = 4
  12. ) = 46
  13. munmap(0x40018000, 4096)                = 0
  14. exit_group(-1)  
复制代码

[ 本帖最后由 sailer_sh 于 2006-3-21 18:11 编辑 ]

论坛徽章:
0
17 [报告]
发表于 2006-03-21 16:52 |只看该作者
sailer_sh
能把 strace 的结果发上来看看么?

论坛徽章:
0
16 [报告]
发表于 2006-03-21 16:48 |只看该作者
原帖由 lenn 于 2006-3-21 16:46 发表


晕死,发在这个版,都以为是驱动程序或者核心态的了,用户状态访问这个文件没有意义啊.用户态应该访问
/dev/mem吧




用户态才需要kmem,核心态要设备节点干什么啊,直接读了。

论坛徽章:
0
15 [报告]
发表于 2006-03-21 16:46 |只看该作者
原帖由 jobman 于 2006-3-21 16:40 发表


他现在是在用户态,不在核心态,不需要段超越。


晕死,发在这个版,都以为是驱动程序或者核心态的了,用户状态访问这个文件没有意义啊.用户态应该访问
/dev/mem吧

论坛徽章:
0
14 [报告]
发表于 2006-03-21 16:40 |只看该作者
原帖由 lenn 于 2006-3-21 16:04 发表
这样看看:
void readkmem (void *m,unsigned off,int sz)
{
        mm_segment_t old_fs_value=get_fs();
        set_fs(get_ds());
        if (lseek(kmem,off,0)!=off) {
                printk(&quo ...


他现在是在用户态,不在核心态,不需要段超越。

论坛徽章:
0
13 [报告]
发表于 2006-03-21 16:29 |只看该作者
原帖由 lenn 于 2006-3-21 16:04 发表
这样看看:
void readkmem (void *m,unsigned off,int sz)
{
        mm_segment_t old_fs_value=get_fs();
        set_fs(get_ds());
        if (lseek(kmem,off,0)!=off) {
                printk(&quo ...


谢谢!
请教你这个程序代码中mm_segment_t从哪里来?
还有,你这两段代码是单独的程序?还是插入源程序。

我把源程序贴出来:

  1. /*
  2.    * CheckIDT V1.1
  3.    * Play with IDT from userland
  4.    * It's a tripwire kind for IDT
  5.    * kad 2002
  6.    *
  7.    * gcc -Wall -o checkidt checkidt.c
  8.    */

  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <unistd.h>
  12. #include <linux/unistd.h>
  13. #include <sys/types.h>
  14. #include <sys/stat.h>
  15. #include <fcntl.h>
  16. #include <asm/segment.h>
  17. #include <string.h>
  18. #include <error.h>

  19. #define NORMAL          "\033[0m"
  20. #define NOIR            "\033[30m"
  21. #define ROUGE           "\033[31m"
  22. #define VERT            "\033[32m"
  23. #define JAUNE           "\033[33m"
  24. #define BLEU            "\033[34m"
  25. #define MAUVE           "\033[35m"
  26. #define BLEU_CLAIR      "\033[36m"
  27. #define SYSTEM          "System gate"
  28. #define INTERRUPT       "Interrupt gate"
  29. #define TRAP            "Trap gate"
  30. #define DEFAULT_FILE    "Safe_idt"
  31. #define DEFAULT_MAP        "/boot/System.map"

  32. /***********GLOBAL**************/
  33. int fd_kmem;
  34. unsigned long ptr_idt;
  35. /******************************/

  36. struct {
  37.                 unsigned short limit;
  38.                         unsigned int base;
  39. } __attribute__ ((packed)) idtr;

  40. struct descriptor_idt {
  41.         unsigned short offset_low, seg_selector;
  42.         unsigned char reserved, flag;
  43.         unsigned short offset_high;
  44. };

  45. struct Mode {
  46.         int show_idt_addr;
  47.         int show_all_info;
  48.         int read_file_archive;
  49.         int create_file_archive;
  50.         char out_filename[20];
  51.         int compare_idt;
  52.         int restore_idt;
  53.         char in_filename[20];
  54.         int show_all_descriptor;
  55.         int resolve;
  56.         char map_filename[40];
  57. };

  58. unsigned long get_addr_idt(void)
  59. {
  60.         __asm__ volatile ("sidt %0":"=m" (idtr));
  61.         return idtr.base;
  62. }

  63. unsigned short get_size_idt(void)
  64. {
  65.         __asm__ volatile ("sidt %0":"=m" (idtr));
  66.         return idtr.limit;
  67. }

  68. char *get_segment(unsigned short selecteur)
  69. {
  70.         if (selecteur == __KERNEL_CS) {
  71.                 return ("KERNEL_CS");
  72.         }
  73.         if (selecteur == __KERNEL_DS) {
  74.                 return ("KERNEL_DS");
  75.         }
  76.         if (selecteur == __USER_CS) {
  77.                 return ("USER_CS");
  78.         }
  79.         if (selecteur == __USER_DS) {
  80.                 return ("USER_DS");
  81.         } else {
  82.                 return("UNKNOW\n");
  83.         }
  84. }


  85. void readkmem(void *m, unsigned off, int size)
  86. {
  87.         int i;
  88.         if (llseek(fd_kmem, off, SEEK_SET) != off) {
  89.                 fprintf(stderr, "Error lseek. Are you root? \n");
  90.                 exit(-1);
  91.         }
  92.         if ((i = read(fd_kmem, m, size)) != size) {
  93.                 fprintf(stderr, "Error read kmem 1\n");
  94.                 perror("read");
  95.                 printf("read = %d, size = %d, fd_kmem= %d, sizeof(m) = %d\n", i, size, fd_kmem, sizeof(m));
  96.                 exit(-1);
  97.         }
  98. }

  99. void writekmem(void *m, unsigned off, int size)
  100. {
  101.         if (llseek(fd_kmem, off, SEEK_SET) != off) {
  102.                 fprintf(stderr, "Error lseek. Are you root? \n");
  103.                 exit(-1);
  104.         }
  105.         if (write(fd_kmem, m, size) != size) {
  106.                 fprintf(stderr, "Error read kmem 2\n");
  107.                 exit(-1);
  108.         }
  109. }

  110. void resolv(char *file, unsigned long stub_addr, char *name)
  111. {
  112.         FILE *fd;
  113.         char buf[100], addr[30];
  114.         char *ptr, *ptr_begin, *ptr_end;
  115.         snprintf(addr, 30, "%s", (char *) stub_addr);
  116.         if (!(fd = fopen(file, "r"))) {
  117.                 fprintf(stderr,
  118.                         "Can't open map file. You can specify a map file -S option or change #define in source\n");
  119.                 exit(-1);
  120.         }
  121.         while (fgets(buf, 100, fd) != NULL) {
  122.                 ptr = strstr(buf, addr);
  123.                 if (ptr) {
  124.                         bzero(name, 30);
  125.                         ptr_begin = strstr(buf, " ");
  126.                         ptr_begin = strstr(ptr_begin + 1, " ");
  127.                         ptr_end = strstr(ptr_begin + 1, "\n");
  128.                         strncpy(name, ptr_begin + 1,
  129.                                 ptr_end - ptr_begin - 1);
  130.                         break;
  131.                 }
  132.         }
  133.         if (strlen(name) == 0)
  134.                 strcpy(name, ROUGE "can't resolve" NORMAL);
  135.         fclose(fd);
  136. }

  137. void show_all_info(int interrupt, int all_descriptor, char *file,
  138.                    int resolve)
  139. {
  140.         struct descriptor_idt *descriptor;
  141.         unsigned long stub_addr;
  142.         unsigned short selecteur;
  143.         char type[15];
  144.         char segment[15];
  145.         char name[30];
  146.         int x;
  147.         int dpl;
  148.         bzero(name, strlen(name));
  149.         descriptor = (struct descriptor_idt *)
  150.             malloc(sizeof(struct descriptor_idt));
  151.         if (descriptor == NULL)
  152.                 printf("malloc error");
  153.         printf("Int *** Stub Address *** Segment *** DPL *** Type ");
  154.         if (resolve >= 0) {
  155.                 printf("            Handler Name\n");
  156.                 printf
  157.                     ("-------------------------------------------------------------------------\n");
  158.         } else {
  159.                 printf("\n");
  160.                 printf
  161.                     ("---------------------------------------------------\n");
  162.         }

  163.         if (interrupt >= 0) {
  164.                 printf("sizeof(descriptor) = %d, ptr_idt + 8 * interrupt = %u, sizeof(descriptor_idt) = %d\n", sizeof(descriptor), (unsigned)ptr_idt + 8 * interrupt, sizeof(struct descriptor_idt));
  165.                 readkmem(descriptor, ptr_idt + 8 * interrupt,
  166.                          sizeof(struct descriptor_idt));
  167.                 stub_addr =
  168.                     (unsigned long) (descriptor->offset_high << 16) +
  169.                     descriptor->offset_low;
  170.                 selecteur = (unsigned short) descriptor->seg_selector;
  171.                 if (descriptor->flag & 64)
  172.                         dpl = 3;
  173.                 else
  174.                         dpl = 0;
  175.                 if (descriptor->flag & 1) {
  176.                         if (dpl)
  177.                                 strncpy(type, SYSTEM, sizeof(SYSTEM));
  178.                         else
  179.                                 strncpy(type, TRAP, sizeof(TRAP));
  180.                 } else
  181.                         strncpy(type, INTERRUPT, sizeof(INTERRUPT));
  182.                 strcpy(segment, get_segment(selecteur));

  183.                 if (resolve >= 0) {
  184.                         resolv(file, stub_addr, name);
  185.                         printf("%-7i 0x%-14.8x %-12s%-8i%-16s %s\n",
  186.                                interrupt, (unsigned)stub_addr, segment, dpl, type,
  187.                                name);
  188.                 } else {
  189.                         printf("%-7i 0x%-14.8x %-12s %-7i%s\n", interrupt,
  190.                                (unsigned)stub_addr, segment, dpl, type);
  191.                 }
  192.         }
  193.         if (all_descriptor >= 0) {
  194.                 for (x = 0; x < (get_size_idt() + 1) / 8; x++) {
  195.                         printf("sizeof(descriptor) = %d, ptr_idt + 8 * %d = %x, sizeof(struct descriptor_idt) = %d\n", sizeof(descriptor), x, (unsigned)ptr_idt + 8 * x, sizeof(struct descriptor_idt));
  196.                         readkmem(descriptor, ptr_idt + 8 * x,
  197.                                  sizeof(struct descriptor_idt));
  198.                         stub_addr =
  199.                             (unsigned long) (descriptor->
  200.                                              offset_high << 16) +
  201.                             descriptor->offset_low;
  202.                         if (stub_addr != 0) {
  203.                                 selecteur =
  204.                                     (unsigned short) descriptor->
  205.                                     seg_selector;
  206.                                 if (descriptor->flag & 64)
  207.                                         dpl = 3;
  208.                                 else
  209.                                         dpl = 0;
  210.                                 if (descriptor->flag & 1) {
  211.                                         if (dpl)
  212.                                                 strncpy(type, SYSTEM,
  213.                                                         sizeof(SYSTEM));
  214.                                         else
  215.                                                 strncpy(type, TRAP,
  216.                                                         sizeof(TRAP));
  217.                                 } else
  218.                                         strncpy(type, INTERRUPT,
  219.                                                 sizeof(INTERRUPT));
  220.                                 strcpy(segment, get_segment(selecteur));
  221.                                 if (resolve >= 0) {
  222.                                         bzero(name, strlen(name));
  223.                                         resolv(file, stub_addr, name);
  224.                                         printf
  225.                                             ("%-7i 0x%-14.8x %-12s%-8i%-16s %s\n",
  226.                                              x, (unsigned)stub_addr, segment, dpl,
  227.                                              type, name);
  228.                                 } else {
  229.                                         printf
  230.                                             ("%-7i 0x%-14.8x %-12s %-7i%s\n",
  231.                                              x, (unsigned)stub_addr, segment, dpl,
  232.                                              type);
  233.                                 }
  234.                         }
  235.                 }
  236.         }
  237.         free(descriptor);
  238. }

  239. void create_archive(char *file)
  240. {
  241.         FILE *file_idt;
  242.         struct descriptor_idt *descriptor;
  243.         int x;
  244.         descriptor = (struct descriptor_idt *)
  245.             malloc(sizeof(struct descriptor_idt));
  246.         if (!(file_idt = fopen(file, "w"))) {
  247.                 fprintf(stderr, "Error while opening file\n");
  248.                 exit(-1);
  249.         }
  250.         for (x = 0; x < (get_size_idt() + 1) / 8; x++) {
  251.                 readkmem(descriptor, ptr_idt + 8 * x,
  252.                          sizeof(struct descriptor_idt));
  253.                 fwrite(descriptor, sizeof(struct descriptor_idt), 1,
  254.                        file_idt);
  255.         }
  256.         free(descriptor);
  257.         fclose(file_idt);
  258.         fprintf(stderr, "Creating file archive idt done \n");
  259. }

  260. void read_archive(char *file)
  261. {
  262.         FILE *file_idt;
  263.         int x;
  264.         struct descriptor_idt *descriptor;
  265.         unsigned long stub_addr;
  266.         descriptor = (struct descriptor_idt *)
  267.             malloc(sizeof(struct descriptor_idt));
  268.         if (!(file_idt = fopen(file, "r"))) {
  269.                 fprintf(stderr, "Error, check if the file exist\n");
  270.                 exit(-1);
  271.         }
  272.         for (x = 0; x < (get_size_idt() + 1) / 8; x++) {
  273.                 fread(descriptor, sizeof(struct descriptor_idt), 1,
  274.                       file_idt);
  275.                 stub_addr =
  276.                     (unsigned long) (descriptor->offset_high << 16) +
  277.                     descriptor->offset_low;
  278.                 printf("Interruption : %i  -- Stub addresse : 0x%.8x\n", x,
  279.                        (unsigned)stub_addr);
  280.         }
  281.         free(descriptor);
  282.         fclose(file_idt);
  283. }

  284. void compare_idt(char *file, int restore_idt)
  285. {
  286.         FILE *file_idt;
  287.         int x, change = 0;
  288.         //int result;
  289.         struct descriptor_idt *save_descriptor, *actual_descriptor;
  290.         unsigned long save_stub_addr, actual_stub_addr;
  291.         //unsigned short *offset;
  292.         save_descriptor = (struct descriptor_idt *)
  293.             malloc(sizeof(struct descriptor_idt));
  294.         actual_descriptor = (struct descriptor_idt *)
  295.             malloc(sizeof(struct descriptor_idt));
  296.         file_idt = fopen(file, "r");
  297.         for (x = 0; x < (get_size_idt() + 1) / 8; x++) {
  298.                 fread(save_descriptor, sizeof(struct descriptor_idt), 1,
  299.                       file_idt);
  300.                 save_stub_addr =
  301.                     (unsigned long) (save_descriptor->offset_high << 16) +
  302.                     save_descriptor->offset_low;
  303.                 readkmem(actual_descriptor, ptr_idt + 8 * x,
  304.                          sizeof(struct descriptor_idt));
  305.                 actual_stub_addr =
  306.                     (unsigned long) (actual_descriptor->
  307.                                      offset_high << 16) +
  308.                     actual_descriptor->offset_low;
  309.                 if (actual_stub_addr != save_stub_addr) {
  310.                         if (restore_idt < 1) {
  311.                                 fprintf(stderr,
  312.                                         VERT
  313.                                         "Hey stub address of interrupt %i has changed!!!\n"
  314.                                         NORMAL, x);
  315.                                 fprintf(stderr, "Old Value : 0x%.8x\n",
  316.                                         (unsigned) save_stub_addr);
  317.                                 fprintf(stderr, "New Value : 0x%.8x\n",
  318.                                         (unsigned) actual_stub_addr);
  319.                                 change = 1;
  320.                         } else {
  321.                                 fprintf(stderr,
  322.                                         VERT
  323.                                         "Restore old stub address of interrupt %i\n"
  324.                                         NORMAL, x);
  325.                                 actual_descriptor->offset_high =
  326.                                     (unsigned short) (save_stub_addr >>
  327.                                                       16);
  328.                                 actual_descriptor->offset_low =
  329.                                     (unsigned short) (save_stub_addr &
  330.                                                       0x0000FFFF);
  331.                                 writekmem(actual_descriptor,
  332.                                           ptr_idt + 8 * x,
  333.                                           sizeof(struct descriptor_idt));
  334.                                 change = 1;
  335.                         }
  336.                 }
  337.         }
  338.         if (!change)
  339.                 fprintf(stderr, VERT "All values are same\n" NORMAL);
  340. }

  341. void initialize_value(struct Mode *mode)
  342. {
  343.         mode->show_idt_addr = -1;
  344.         mode->show_all_info = -1;
  345.         mode->show_all_descriptor = -1;
  346.         mode->create_file_archive = -1;
  347.         mode->read_file_archive = -1;
  348.         strncpy(mode->out_filename, DEFAULT_FILE, strlen(DEFAULT_FILE));
  349.         mode->compare_idt = -1;
  350.         mode->restore_idt = -1;
  351.         strncpy(mode->in_filename, DEFAULT_FILE, strlen(DEFAULT_FILE));
  352.         strncpy(mode->map_filename, DEFAULT_MAP, strlen(DEFAULT_MAP));
  353.         mode->resolve = -1;
  354. }

  355. void usage()
  356. {
  357.         fprintf(stderr, "CheckIDT V 1.1 by kad\n");
  358.         fprintf(stderr, "---------------------\n");
  359.         fprintf(stderr, "Option : \n");
  360.         fprintf(stderr,
  361.                 "       -a nb    show all info about one interrupt\n");
  362.         fprintf(stderr,
  363.                 "       -A       showw all info about all interrupt\n");
  364.         fprintf(stderr, "       -I       show IDT address \n");
  365.         fprintf(stderr, "       -c       create file archive\n");
  366.         fprintf(stderr, "       -r       read file archive\n");
  367.         fprintf(stderr,
  368.                 "       -o file  output filename (for creating file archive)\n");
  369.         fprintf(stderr, "       -C       compare save idt & new idt\n");
  370.         fprintf(stderr, "       -R       restore IDT\n");
  371.         fprintf(stderr,
  372.                 "       -i file  input filename to compare or read\n");
  373.         fprintf(stderr,
  374.                 "       -s         resolve symbol thanks to /boot/System.map\n");
  375.         fprintf(stderr, "       -S file    specify a map file\n\n");
  376.         exit(1);
  377. }

  378. int main(int argc, char **argv)
  379. {
  380.         int option;
  381.         struct Mode *mode;
  382.         if (argc < 2) {
  383.                 usage();
  384.         }

  385.         mode = (struct Mode *) malloc(sizeof(struct Mode));
  386.         initialize_value(mode);

  387.         while ((option = getopt(argc, argv, "hIa:Aco:Ci:rRsS:")) != -1) {
  388.                 switch (option) {
  389.                 case 'h':
  390.                         usage();
  391.                         exit(1);
  392.                 case 'I':
  393.                         mode->show_idt_addr = 1;
  394.                         break;
  395.                 case 'a':
  396.                         mode->show_all_info = atoi(optarg);
  397.                         break;
  398.                 case 'A':
  399.                         mode->show_all_descriptor = 1;
  400.                         break;
  401.                 case 'c':
  402.                         mode->create_file_archive = 1;
  403.                         break;
  404.                 case 'r':
  405.                         mode->read_file_archive = 1;
  406.                         break;
  407.                 case 'R':
  408.                         mode->restore_idt = 1;
  409.                         break;
  410.                 case 'o':
  411.                         bzero(mode->out_filename,
  412.                               sizeof(mode->out_filename));
  413.                         if (strlen(optarg) > 20) {
  414.                                 fprintf(stderr, "Filename too long\n");
  415.                                 exit(-1);
  416.                         }
  417.                         strncpy(mode->out_filename, optarg,
  418.                                 strlen(optarg));
  419.                         break;
  420.                 case 'C':
  421.                         mode->compare_idt = 1;
  422.                         break;
  423.                 case 'i':
  424.                         bzero(mode->in_filename,
  425.                               sizeof(mode->in_filename));
  426.                         if (strlen(optarg) > 20) {
  427.                                 fprintf(stderr, "Filename too long\n");
  428.                                 exit(-1);
  429.                         }
  430.                         strncpy(mode->in_filename, optarg, strlen(optarg));
  431.                         break;
  432.                 case 's':
  433.                         mode->resolve = 1;
  434.                         break;
  435.                 case 'S':
  436.                         bzero(mode->map_filename,
  437.                               sizeof(mode->map_filename));
  438.                         if (strlen(optarg) > 40) {
  439.                                 fprintf(stderr, "Filename too long\n");
  440.                                 exit(-1);
  441.                         }
  442.                         if (optarg)
  443.                                 strncpy(mode->map_filename, optarg,
  444.                                         strlen(optarg));
  445.                         break;
  446.                 }
  447.         }
  448.         printf("\n");
  449.         ptr_idt = get_addr_idt();
  450.         if (mode->show_idt_addr >= 0) {
  451.                 fprintf(stdout, "Addresse IDT : 0x%x\n", (unsigned)ptr_idt);
  452.         }
  453.         fd_kmem = open("/dev/kmem", O_RDWR);
  454.         printf("fd_kmem= %d, show_all_info = %d, show_all_descriptor = %d\n", fd_kmem, mode->show_all_info, mode->show_all_descriptor);
  455.         if (mode->show_all_info >= 0 || mode->show_all_descriptor >= 0) {
  456.                 show_all_info(mode->show_all_info,
  457.                               mode->show_all_descriptor,
  458.                               mode->map_filename, mode->resolve);
  459.         }
  460.         if (mode->create_file_archive >= 0) {
  461.                 create_archive(mode->out_filename);
  462.         }
  463.         if (mode->read_file_archive >= 0) {
  464.                 read_archive(mode->in_filename);
  465.         }
  466.         if (mode->compare_idt >= 0) {
  467.                 compare_idt(mode->in_filename, mode->restore_idt);
  468.         }
  469.         if (mode->restore_idt >= 0) {
  470.                 compare_idt(mode->in_filename, mode->restore_idt);
  471.         }
  472.         printf(JAUNE "\nThanks for choosing kad's products :-)\n" NORMAL);

  473.         free(mode);
  474.         return 0;
  475. }
复制代码

论坛徽章:
0
12 [报告]
发表于 2006-03-21 16:04 |只看该作者

回复 11楼 sailer_sh 的帖子

这样看看:
void readkmem (void *m,unsigned off,int sz)
{
        mm_segment_t old_fs_value=get_fs();
        set_fs(get_ds());
        if (lseek(kmem,off,0)!=off) {
                printk("kmem lseek error in read\n"); return;
        }
        if (read(kmem,m,sz)!=sz) {
                printk("kmem read error!\n"); return;
        }
        set_fs(old_fs_value);
}

...
{
        unsigned sct;
        unsigned sys_call_off;
        char sc_asm[CALLOFF],*p = NULL;
        mm_segment_t old_fs_value=get_fs();
        const char *filename="/dev/kmem";
        asm ("sidt %0" : "=m" (idtr));
        set_fs(get_ds());
         kmem = open (filename,O_RDONLY,0640);
        if (kmem<0)
        {
                printk("open kmem error!\n");
        }
        set_fs(old_fs_value);
        readkmem (&idt,idtr.base+8*0x80,sizeof(idt));
...
}
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP