Naked Function

 원본 :  http://danguria.springnote.com/pages/2407072

 작성자 : danguria

 이 글을  마음껏 이용하시되 출처를 꼭 밝혀 주세요

 

 

요즘 루트킷 관련 과제를 하다보니 C코드를 많이 보고 있습니다.. 대부분 커널모드에서 동작하는 코드들인데

IDT후킹관련 코드를 보는데 "__declspec(naked) Function()" 이런식의 함수가 보이는 것입니다.

분명히 이건 표준C에내용은 아닌것 같은데.. 뭐지.. 하면서 그냥 지나 치다가 우연히 "Windows 구조와 원리 그리고 Codes"라는 책에서

그 설명을 볼 수 가 있었습니다.

 

결론 부터 간단히 말하자면!!

위와 같은(__declspec(naked)) prefix를 붙이게 되면, 컴파일러가 스택 프레임코드를 생성 시켜 주지 않는다는 것입니다.

스택 프레임은 함수의 파라미터를 편하게 접근하기 위해서 ebp레지스터를 통해 접근하는 방법입니다.

(자세한것은 [어셈블러] 어셈블러로 함수의 호출 원리를 알아보자!! 2탄 을 참고 하세요^^)

시스템 프로그래머에 있어서 어떤 경우에는(특히 후킹에 경우) 스택프레임과 관련된 코드를 자신의 입맛에 맞게 작성해야 할경우 이런 naked함수가 필요 하겠죠.

이름에서도 알수 있듯이 함수의 기본틀을 벗겨서 아무것도 없는 함수를 제공하는 격이 되네요^^

 

다음의 코드는 naked 형식에 의한 함수가 구성된 예입니다.

  1. /*
  2. * Windows 구조와 원리 그리고 Codes책에 있는 예제를 가져 왔습니다.
  3. */
  4. __declspec(naked) NakedFunc()
  5. {
  6. int i;
  7. int j;
  8. _asm  //prolog
  9. {
  10. push ebp
  11. mov ebp, esp
  12. sub esp, _LOCAL_SIZE
  13. }
  14. i = 1;
  15. j = 2;
  16. // Function Body

    _asm   //epilog

  17. {
  18.  mov esp, ebp

    pop ebp

  19. ret
  20. }
  21. }

 

위의 코드에서 어셈코드가 들어간 부분이 스택프레임인데 prolog와 epilog부분이 디폴트로 함수선언시 들어가지만 naked 함수는 이 두부분이 없어진다는 뜻입니다.