Name Mangling in C++ (三)

2014-11-24 12:06:07 · 作者: · 浏览: 4
:allocator >::~basic_string()
19.
20. U std::ios_base::Init::Init()
21. U std::ios_base::Init::~Init()
22. 0000000000000000 b std::__ioinit
23.
24. U __cxa_atexit
25. U __dso_handle
26. U __gxx_personality_v0
27. 0000000000000076 t __tcf_0
28.
29. 000000000000008e T main
又到了Last but not least important的时候了,还有一个特别重要的接口函数就是__cxa_demangle(),此函数的原型为:

1. namespace abi {
2. extern "C" char* __cxa_demangle (const char* mangled_name,
3.
4. char* buf,
5. size_t* n,
6. int* status);
7. }
用于将mangled_name所指向的mangled进行demangle并将结果存放在buf中,n为buf的大小。status存放函数执行的结果,返回值为0表示执行成功。
下面是使用这个接口函数进行demangle的例子:

1. /*
2. * Author: Chaos Lee
3.
4. * Description: Employ __cxa_demangle to demangle a mangling function name.
5.
6. * Date:2012/05/06
7.
8. *
9. */
10. #include
11. #include
12. using namespace std;
13.
14. using namespace abi;
15.
16. int main(int argc,char *argv[])
17.
18. {
19. const char * mangled_string = "_Z9test_funcRiPKcdSsf";
20.
21. char buffer[100];
22. int status;
23. size_t n=100;
24. __cxa_demangle(mangled_string,buffer,&n,&status);
25.
26. cout< 27. cout< 28. return 0;
29. }
测试结果:

1. [lichao@sg01 name_mangling]$ g++ cxa_demangle.cpp -o cxa_demangle
2.
3. [lichao@sg01 name_mangling]$ ./cxa_demangle
4.
5. test_func(int&, char const*, double, std::string, float)
6.
7. 0
name mangling与黑客
l 使用demangling可以破解动态链接库中的没有公开的API
l 编写名称为name mangling接口函数,打开重复符号的编译开关,可以替换原来函数中链接函数的指向,从而改变程序的运行结果。


摘自 相信并热爱着http://hipercomer.blog.51cto.com/4415661/855223