오늘은 운영체제를 끝내려 했으나...장보고 친구만나고 들어오니 자정이 넘어버렸다... 더욱 정진해야겠다..
"C++로 나만의 운영체제 만들기" 17장 DLL과정을 공부했고 18장 Advanced Debugging 앞부분 조금 공부했다.
DLL테스트 실행을 위해선 진입점을 기존의 EntryPoint에서 DllMain으로 바꿔주어야 한다.
DLL을 힙에서 작동하게하는 공격기법도 있기에 DLL이 실행될 때 유효한 공간인지를 프로세스에서 점검해야한다.
DLL을 실행시킬 때 모듈을 로드하여 핸들을 받은 후 GetDLLInterface의 주소값을 얻은 뒤 실행시켜 얻은 Interface로 원하는 함수를 호출한 뒤 언로드하여 해제한다.
GetDLLInterface함수는 __declspec(dllexport)키워드를 사용하여 PE파일의 Export디렉토리인 IMAGE_DIRECTORY_ENTRY_EXPORT에 등록된다.
DLL등록하면서 기존 DLL등록주소에서 선호되는 DLL주소로 재배치를 수행해야하는데 해당 함수가 PerformBaseRelocation이며 여러 DLL을 하나의 프로세스에서 재배치가능하게 한다. 선호되는 주소는 기존 DLL등록주소+주소재배치테이블(IMAGE_BASE_RELOCATION)의 가상주소(->VirtualAddress)값+WORD배열의 하위12비트값이기에, 선호주소-기존주소만큼의 delta값을 이미지재배치테이블에 더해주어 재배치를 수행한다.
Advanced Debugging은 Win32같은 기존 운영체제와 다른 포맷을 사용할 경우 디버깅이 어려운데, VirtualBox의 기본 디버깅 툴로 특정 주소를 breakpoint로 정하여 레지스터 상태를 확인하는 방법이 있고
DLL을 활용하여 디버깅을 하는 방법이 있는데, 다음엔 여기부터 공부하면 된다.