반응형

 

Name Mangling 이라고 하면 저에게 생소한 부분이였습니다.

Cod, Map 파일을 분석하면서 연계가 되어 Name Mangling 까지 가게 되었네요.

 

이후 부터는 반어를 사용합니다. 이점 양해해 주시길 바랍니다.

////////////////////////////////////////////////////////////

 

1. Name Mangling 이란?

   프로그램에서 함수를 선언하거나 전역 변수 등의 선언 했을때, 실제 생성된 함수는 컴파일러의 특징에 따라서 일정한 규칙을 통하여 함수, 변수명이 변경 된다. 이것을 Name Mangling 또는 Name Decoration 이라고 한다. 

   즉, 임의로 Test() 함수가 !Test@@YAXHAPAK 와 같이 변경되는 것을 의미한다.

 

 

 

 

2. 바뀌는 이유가 무엇인가?

   Function Overloading과 관련이 있다. Function Overloading이란 동일한 이름으로 다른 기능을 수행하는 함수를 여러개 만들었다고 치자. 그럴 경우 어떤 함수를 불렀는지 확인 할 수 없으므로 동일한 이름이라고 하더라도 따른 이름을 부여하여 프로그램이 동작하는데 있어서 문제가 발생하지 않도록 하기 위한 하나의 방지 책이다. 그림으로 쉽게 설명하도록 하겠다.

 

 

< 출처 : http://spikez.tistory.com/19 >

 

3. Name Mangling을 적용 / 미 적용 방법

 

Name Mangling 미적용 

  extern "C" __declspec(dllexport) void h(void)

  void h()

Name Mangling 적용

  __declspec(dllexport)

  ?h@@YAXXZ

 

  위와 같이 extern "C"를 붙이게 되면 C Type으로 함수명을 Naming을 하겠다는 선언이다. C Type의 Naming은 코드 상에서 사용하는 함수명 그대로 사용하는 것을 의미 한다.

 

4. Name Mangling 적용된 파일 분석 하는 방법

 

   undname 이라는 유틸리티가 있습니다. undname 프로그램은 Visual Studio를 설치하게 되면

 

[VS 설치 폴더]\VC\bin\undname.exe 

  

   존재 할 것이다. 해당 파일을 그냥 때려 막으면 Name Mangling가 복원되어 화면에 출력해 준다. 그때 아래의 명령으로

   파일로 생성하여 분석에 활용하면 Name Mangling으로 된 함수로 인해서 눈 아픈 일은 없어질 것이다.

 

 

undname.exe TestProg.map > und_function_Map.txt 

 

  이와 같이 할 경우 아래와 같은 결과 물을 얻을 수 있어서 분석하는데 도움이 될 것이다.

 

 

/////////////////////////////////////////////////////////

이번 기회에 undname을 통하여 Name Mangling이 적용된 함수를 C Type의 함수로 변경하는 방법을 알 수 있었습니다.

굳이, 파일이 아니더라도 문자열을 넣어도 변환 되므로 편의에 맞게 사용하면 좋을 것 같습니다.

사용 방법은 동일 합니다.

 

    

반응형

+ Recent posts