免费注册 查看新帖 |

Chinaunix

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

模块invalid lvalue in assignment出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-03 13:21 |只看该作者 |倒序浏览
一个简单得模块, 想要替换掉tty_insert_flip_string函数:



  1. #include <linux/kernel.h>
  2. #include <linux/init.h>
  3. #include <linux/module.h>
  4. #include <linux/tty.h>

  5. extern int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
  6.                                 size_t size);
  7. extern int tty_buffer_request_room(struct tty_struct *tty, size_t size);

  8. int (*old_tty_insert_flip_string)(struct tty_struct *tty, const unsigned char *chars,
  9.                                 size_t size);

  10. int new_tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
  11.                                 size_t size)
  12. {
  13.         printk("i hjiack the tty_insert_flip_strintg...\n");

  14.         return (*old_tty_insert_flip_string)(tty, chars, size);
  15. }

  16. static int tty_test(void)
  17. {
  18.         printk("tty test start...\n");

  19.         printk("tty_insert_flip_string: %x\n", (unsigned int)tty_insert_flip_string);
  20.         printk("new_tty_insert_flip_string: %x\n", (unsigned int)new_tty_insert_flip_string);  
  21.         old_tty_insert_flip_string = tty_insert_flip_string;
  22.         tty_insert_flip_string = new_tty_insert_flip_string;

  23.         printk("tty_insert_flip_string: %x\n", (unsigned int)tty_insert_flip_string);

  24.         return 0;
  25. }

  26. static void tty_exit(void)
  27. {
  28.         //tty_insert_flip_string = old_tty_insert_flip_string;

  29.         printk("tty test exit...\n");
  30. }

  31. module_init(tty_test);
  32. module_exit(tty_exit);

  33. MODULE_LICENSE("GPL");
  34. MODULE_AUTHOR("wzt");

复制代码


但是编译出错:
make -C /lib/modules/2.6.18-53.1.13.el5PAE/build M=/home/wzt/lkm/tty modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-53.1.13.el5-PAE-i686'
  CC [M]  /home/wzt/lkm/tty/tty.o
/home/wzt/lkm/tty/tty.c: In function 'tty_test':
/home/wzt/lkm/tty/tty.c:28: error: invalid lvalue in assignment
make[2]: *** [/home/wzt/lkm/tty/tty.o] Error 1
make[1]: *** [_module_/home/wzt/lkm/tty] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.18-53.1.13.el5-PAE-i686'
make: *** [default] Error 2

不知道这句:
tty_insert_flip_string = new_tty_insert_flip_string;
该怎么改?

论坛徽章:
0
2 [报告]
发表于 2008-07-03 13:43 |只看该作者
有这样替换的吗?这样是不行的

tty_insert_flip_string是内核函数,而且还不是系统调用,只能用其它特殊方式替换,例如替换开始的代码等

[ 本帖最后由 qtdszws 于 2008-7-3 13:51 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-07-03 13:56 |只看该作者
原帖由 qtdszws 于 2008-7-3 13:43 发表
有这样替换的吗?这样是不行的

tty_insert_flip_string是内核函数,而且还不是系统调用,只能用其它特殊方式替换,例如替换开始的代码等


能否提供下替换得代码呢? 我记得 曾在cu某板块看到过, 就是忘了

论坛徽章:
0
4 [报告]
发表于 2008-07-03 14:07 |只看该作者
http://bbs.chinaunix.net/viewthread.php?tid=752649

但是这样你就不能调用被替换的函数了

必须再做一些处理

[ 本帖最后由 qtdszws 于 2008-7-3 14:11 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-07-03 14:32 |只看该作者
兄弟们应该多用kprobe和jprobe, 在samples/下有示例代码。

论坛徽章:
0
6 [报告]
发表于 2008-07-03 14:33 |只看该作者
应该是这样吧, 但是貌似不起作用,dmesg看不到printk("i hjiack the tty_insert_flip_strintg...\n");这个信息。


  1. #include <linux/kernel.h>
  2. #include <linux/init.h>
  3. #include <linux/module.h>
  4. #include <linux/tty.h>

  5. extern int tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
  6.                                 size_t size);

  7. u_char tmp[5];

  8. int new_tty_insert_flip_string(struct tty_struct *tty, const unsigned char *chars,
  9.                                 size_t size)
  10. {
  11.         printk("i hjiack the tty_insert_flip_strintg...\n");

  12.         return (*tty_insert_flip_string)(tty, chars, size);
  13. }

  14. static int tty_test(void)
  15. {
  16.         u_char *buf;
  17.         long p;

  18.         printk("\nrepalce tty_insert_flip_string...\n");

  19.         //printk("tty_insert_flip_string: %x\n", (unsigned int)tty_insert_flip_string);
  20.         //printk("new_tty_insert_flip_string: %x\n", (unsigned int)new_tty_insert_flip_string);
  21.         buf = (u_char *)tty_insert_flip_string;
  22.         p = (long)new_tty_insert_flip_string - (long)tty_insert_flip_string + (long)5;
  23.         memcpy(tmp, buf, 5);
  24.         buf[0] = 0xe9;
  25.         memcpy(buf + 1, &p, 4);

  26.         printk("tty_insert_flip_string: %x\n", (unsigned int)tty_insert_flip_string);

  27.         return 0;
  28. }

  29. static void tty_exit(void)
  30. {
  31.         u_char *buf;

  32.         printk("restore tty_insert_flip_string...\n");

  33.         buf = (u_char *)tty_insert_flip_string;
  34.         memcpy(buf, tmp, 5);
  35. }

  36. module_init(tty_test);
  37. module_exit(tty_exit);

  38. MODULE_LICENSE("GPL");
  39. MODULE_AUTHOR("wzt");


复制代码

论坛徽章:
0
7 [报告]
发表于 2008-07-03 17:26 |只看该作者
原帖由 albcamus 于 2008-7-3 14:32 发表
兄弟们应该多用kprobe和jprobe, 在samples/下有示例代码。


使用jprobe已经截获了tty_insert_flip_string,  dmesg却没看到 printk("i hjiack the tty_insert_flip_strintg...\n"; 奇怪
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP