RSS를 돌다가 재미있는 글을 발견했습니다. 외국 사이트인데 언패킹(Unpacking)을 쉽게하는 방법에 대해서 적어놨더군요. 원문은 http://www.websense.com/securitylabs/blog/blog.php?BlogID=176에서 볼 수 있습니다.

 위 링크의 내용을 간단히 요약하자면 다음과 같습니다.
1. 패커(Packer)들은 실행파일이 시작되었을 때 실행파일의 내용을 복원해야하므로 복원 함수를 호출합니다. 단 복원 후에 정상적인 실행을 위해서는 레지스터의 상태가 그대로 보존되어야 하기 때문에 레지스터의 값을 우선 스택에 보관합니다. 이때 PUSH 명령을 사용합니다.
2. 복원 함수를 호출해서 실행 파일을 복원합니다.
3. 복원이 끝난 뒤에 레지스터의 값을 복원 함수를 호출하기 전의 레지스터 값으로 복원합니다. 이때 POP 명령을 사용합니다.

 위의 과정을 보면 PUSH와 POP이 쌍을 이룬다는 것을 알 수 있고, POP이 되어 모든 레지스터의 복원이 끝난 상태는 실행파일 복원이 끝난 상태라고 볼 수 있습니다. 이러한 약간의 팁을 이용해서 스택 포인터(ESP)에 브레이크 포인터를 걸고 계속 체크해 나가는 방법입니다.
사용자 삽입 이미지

사용자 삽입 이미지

 하지만 레지스터를 보관하기 위해서 꼭 PUSH/POP을 써야하는 것은 아니기 때문에 한계는 있지만, 괜찮은 아이디어 같습니다. ;)  또 이렇게 잡 지식이 하나 늘었군요. ^^)/~

 

+ Recent posts