能力值:
( LV2,RANK:10 )
2 楼
能力值:
( LV2,RANK:10 )
3 楼
学习了 !!!
能力值:
( LV2,RANK:10 )
4 楼
版主,我同事用dlsym是将返回的函数地址转成二级指针使用的,但是我理解转成函数指针和转成二级指针都是指针,做左值都是修改指针指向的内容。看了版主的分析原来编译器对函数指针是有特殊处理的。dlsym返回的函数地址强转二级指针就可以做左值,但是在ubuntu上无法正常执行。
版主你的代码编译有问题,我修改了一下:
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>
static char *testChar = "test hook!!";
typedef char* (*p_strcat)(void *dest, const void *src);
static p_strcat _p_s = NULL;
void call_strcat() {
char test[100];
strcat(test, "test");
printf("call_strcat -> test=%s\n", test);
}
char* my_strcat(void *dest, const void *src) {
printf("testChar=%s\n", testChar);
return testChar;
}
int main(void) {
printf("my_strcat=%p,&my_strcat= %p\n", my_strcat, &my_strcat);
printf("address of strcat=%p\n", (int*) strcat);
void *handle;
//strcat
handle = dlopen(" /lib/x86_64-linux-gnu/libc.so.6",
RTLD_LAZY | RTLD_GLOBAL);
p_strcat p_s_aa = (p_strcat)dlsym(handle, "strcat");
printf("to p -> p_s_aa=%p,*p_s_aa=%p\n", p_s_aa, *p_s_aa);
// 不能做左值,编译器提示 read - only
// *p_s_aa = my_strcat;
p_strcat *p_s_bb = (p_strcat*) dlsym(handle, "strcat");
printf("to p* -> p_s_bb=%p,*p_s_bb=%p\n", p_s_bb, *p_s_bb);
p_strcat * p_p_s = &_p_s;
*p_p_s = *p_s_bb;
char arr[20];
_p_s(arr, "hhee");
printf("arr=%s\n", arr);
*p_s_bb = my_strcat;
printf("bb p_s_bb=%p,*p_s_bb=%p\n", p_s_bb, *p_s_bb);
call_strcat();
dlclose(handle);
return 0;
}
执行结果:
my_strcat=0x400803,&my_strcat= 0x400803 address of strcat=0x400680 to p -> p_s_aa=0x400680,*p_s_aa=0x400680 to p* -> p_s_bb=0x400680,*p_s_bb=0x668002009c225ff
后面的没有打印,应该是段错误
能力值:
( LV2,RANK:10 )
5 楼
多谢版主,我搞明白啦~
能力值:
(RANK:200 )
6 楼
andwei
多谢版主,我搞明白啦~[em_13]
哈哈
,明白就好
能力值:
(RANK:135 )
7 楼
赞!
能力值:
( LV1,RANK:0 )
8 楼
学习了
能力值:
( LV2,RANK:10 )
9 楼
感谢分享