Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15515448
  • 博文数量: 112
  • 博客积分: 11195
  • 博客等级: 上将
  • 技术积分: 1989
  • 用 户 组: 普通用户
  • 注册时间: 2005-06-20 11:04
文章分类

全部博文(112)

文章存档

2013年(2)

2012年(27)

2011年(6)

2010年(11)

2009年(6)

2007年(7)

2006年(23)

2005年(30)

分类: LINUX

2006-09-03 19:46:54

linux同一个进程下面的线程都是在同一个进程空间的,那么是否会存在越界访问的问题呢?
刚刚做了一个试验,答案是:存在越界问题。

[root@FC5 thread]# gcc -o hk hookpthread.c -lpthread;./hk;cat hookpthread.c
&a:[b7f77464]-----a:[20]
&b:[b7576464]
hook-->&a:[20]
&a:[b7f77464]-----a:[30]
#include
#include
void * fun(void * i)
{
int a=20;
printf("&a:[%x]-----a:[%d]\n", &a,a);
sleep(1);
printf("&a:[%x]-----a:[%d]\n", &a,a);
pthread_exit(NULL);

}

void * hook(void * a)
{
int b=10;
printf("&b:[%x]\n", &b);
printf("hook-->&a:[%d]\n", *(&b+2622464));
*(&b+2622464)=30;
pthread_exit(NULL);

}
int main()
{
pthread_t pidfun,pidhook;
pthread_create(&pidfun, NULL, fun, NULL);
pthread_create(&pidhook, NULL, hook, NULL);
sleep(2);
return 0;
}


阅读(166607) | 评论(13) | 转发(4) |
0

上一篇:毕业五年(续)

下一篇:VIM的配置

给主人留下些什么吧!~~

a525274592013-07-31 17:13:46

a52527459:好久以前的文章了,我测试了下,我的a,b两个函数内的变量的地址差值为:8392688

要做点小修改,对地址强制变化,否则对变量地址加减 直接段错误的。

printf("hook-->&a:[%d]\n", *(((char *)&b)+8392688));
*(((char *)&b)+8392688)=30;

----------------------------
linux gcc 版本号
----------------------------
[root@xen ~]# uname -a
Linux xen.server、
 3.9.3-1.el6xen.x86_64 #1 SMP Tue May 21 11:55:32 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@xen ~]# gcc 

结果是:

[root@xen1 ~]# gcc hpthread.c -lpthread;./a.out
&a:[8c3c5e9c]-1942200676-----a:[20]
&b:[8bbc4eac]-1950593364
hook-->&a:[20]
&a:[8c3c5e9c]-1942200676-----a:[30]
[root@xen1 ~]#

确实可以的。但是你的越界始终在自己的程序的空间内,如果到另一个程序的某个变量地址,应该就不行了吧。

回复 | 举报

a525274592013-07-31 17:12:01

好久以前的文章了,我测试了下,我的a,b两个函数内的变量的地址差值为:8392688

要做点小修改,对地址强制变化,否则对变量地址加减 直接段错误的。

printf("hook-->&a:[%d]\n", *(((char *)&b)+8392688));
*(((char *)&b)+8392688)=30;

----------------------------
linux gcc 版本号
----------------------------
[root@xen ~]# uname -a
Linux xen.server、
 3.9.3-1.el6xen.x86_64 #1 SMP Tue May 21 11:55:32 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@xen ~]# gcc 

zhang007z2011-07-13 10:25:25

当然有很多方法可以修改内存的权限,不如修改cr0寄存器!还有就是通过调用门,使你的程序具有ring0权限,然后对内存就可以随意操作!

zhang007z2011-07-13 10:24:00

当然存越界问题了!这个是由操作系统控制的!因为linux的操作系统中对内存的管理有可读可写可执行之分,和windows一样!

hcconquer2011-07-08 16:46:09

线程是有运行空间的