C - 打印存储在符号位置的值
C - Print value stored at symbol location
我有一个简单的命令行应用程序(自定义 dir
二进制文件),我想对其进行检测。调试符号已启用,我可以在 objdump
和 nm -D
.
的输出中看到我感兴趣的全局字符串指针 the_full_path_name
是否有可能,在 c 中,以某种方式查找符号 name/location,并使用代码注入打印它指向的内存内容(即:LD_PRELOAD
库使用自定义 gcc attribute((constructor))
和附加功能)?我需要在不必将 gdb
附加到流程的情况下完成此操作。
谢谢。
我不太确定我是否理解你的问题,但下面的内容对你有帮助吗?
包含全局指针的文件
$ cat global.c
char mylongstring[] = "myname is nulled pointer";
$ gcc -fPIC -shared global.c -o libglobal.so
原库
$ cat get_orig.c
#include <stdio.h>
extern char * mylongstring;
char *get()
{
mylongstring = "get from orig";
return mylongstring;
}
$ gcc -fPIC -shared get_orig.c -o libget_orig.so -L. -lglobal
假图书馆
$ cat get_dup.c
#include <stdio.h>
extern char * mylongstring;
char *get()
{
mylongstring = "get from dup";
return mylongstring;
}
$ gcc -fPIC -shared get_dup.c -o libget_dup.so -L. -lglobal
全局变量的实际消费者:
$ cat printglobal.c
#include <stdio.h>
char *get();
int main(void)
{
printf("global value=%s\n",get());
return 0;
}
$ gcc printglobal.c -L. -lglobal -lget_orig -o a.out
otool 输出
$ otool -L a.out
a.out:
libglobal.so (compatibility version 0.0.0, current version 0.0.0)
libget_orig.so (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
运行 a.out
$ DYLD_LIBRARY_PATH=./ ./a.out
global value=get from orig
替换库
$ cp /tmp/libget_dup.so libget_orig.so
$ DYLD_LIBRARY_PATH=./ ./a.out
global value=get from dup
顺便说一句,我在 MAC 上测试了这个,所以 .so
确实是 .dylib
的误称
我有一个简单的命令行应用程序(自定义 dir
二进制文件),我想对其进行检测。调试符号已启用,我可以在 objdump
和 nm -D
.
the_full_path_name
是否有可能,在 c 中,以某种方式查找符号 name/location,并使用代码注入打印它指向的内存内容(即:LD_PRELOAD
库使用自定义 gcc attribute((constructor))
和附加功能)?我需要在不必将 gdb
附加到流程的情况下完成此操作。
谢谢。
我不太确定我是否理解你的问题,但下面的内容对你有帮助吗?
包含全局指针的文件
$ cat global.c
char mylongstring[] = "myname is nulled pointer";
$ gcc -fPIC -shared global.c -o libglobal.so
原库
$ cat get_orig.c
#include <stdio.h>
extern char * mylongstring;
char *get()
{
mylongstring = "get from orig";
return mylongstring;
}
$ gcc -fPIC -shared get_orig.c -o libget_orig.so -L. -lglobal
假图书馆
$ cat get_dup.c
#include <stdio.h>
extern char * mylongstring;
char *get()
{
mylongstring = "get from dup";
return mylongstring;
}
$ gcc -fPIC -shared get_dup.c -o libget_dup.so -L. -lglobal
全局变量的实际消费者:
$ cat printglobal.c
#include <stdio.h>
char *get();
int main(void)
{
printf("global value=%s\n",get());
return 0;
}
$ gcc printglobal.c -L. -lglobal -lget_orig -o a.out
otool 输出
$ otool -L a.out
a.out:
libglobal.so (compatibility version 0.0.0, current version 0.0.0)
libget_orig.so (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
运行 a.out
$ DYLD_LIBRARY_PATH=./ ./a.out
global value=get from orig
替换库
$ cp /tmp/libget_dup.so libget_orig.so
$ DYLD_LIBRARY_PATH=./ ./a.out
global value=get from dup
顺便说一句,我在 MAC 上测试了这个,所以 .so
确实是 .dylib