PE 64비트에서 최적화에 대한 이야기

2018. 5. 15. 20:190x03 Reversing Theory

728x90

64비트에서의 최적화 관련 처리


1. 강화 된 함수 인라인 처리 


"인라인 함수 확장(Inline Function Expansion)" 

조건에 따라 64비트 컴파일러는 함수 호출을 함수의 내용으로 대체하기도 하는데, 이를 인라인 함수 확장이라 한다.


인라인 처리라는것은, 함수를 CALL명령으로 처리하는게 아니라 함수 자체 코드를 호출 부분에 삽입하는 것이다.

물론, 함수 자체를 호출 부분에 삽입하기 때문에 프로그램의 크기는 증가하게 된다. 

하지만, 호출을 위한 스택 준비와 CALL 명령의 분기로 인한 부하는 없앨 수 있다.

디버깅은 다소 어려울 수 있다. 왜냐하면, 심볼을 제대로 찾을 수 없기 때문이다.


2. 최종 호출 제거 (Tail Call Elimination)


우선 기억해두어야 하는 것이 하나 있다.

스택이 새로 형성이 되면, 스택 프레임을 준비해야 하는 부하가 일어나게 된다.

그렇다면, 누군가가 이 부하를 없애고 싶다고 요청하면 당신은 어떻게 할 것인가?


어셈블리어로 프로그램을 작성해 본 자라면, 호출 할 때 CALL, JMP를 쓸 수 있는 것을 알고 있다.

바로 JMP를 이용하면 된다. 

JMP는 단순하게 RIP를 조작하는 것에 불과하다. 그렇기 때문에 스택 프레임을 새로 할당할 필요가 없는 것이다. 


최종 호출 제거 기법에서 전제 조건이 2가지가 있다. 

1. 부모 함수와 자식 함수의 매개변수가 동일해야 한다.

2. 매개변수가 전달된 각 레지스터 값이 변경되지 않았다는 사실을 입증할 수 있어야 한다.