옛날 생각.
중학교 2학년 때, 그러니깐 2005년도 중순.
게임 마비노기를 신나게 하던 시절,
써드파티 어플리케이션이었던 '
타임노기'가 그렇게 신기해하지 않을 수 없었다(조낸 신기했다고).
'옳거니, 나도 한 번 만들어보자' 해서 만들어보려고 했는데,
헐랭, Direct3D가 잡고 있는 윈도우에 어떻게 그린담????
당시 지식 수준은 API 갖고 깨작거리던 수준.
GDI 함수로 어떻게든 해보려고 했는데 GG.
'타임노기'를 제작하신 분께 직접 여쭤봤다.
어떻게 하나요?
나 : 어떻게 해야 잘했다고 칭찬받나요?
제작자 : Direct3D를 후킹하세요.
나 : 엥, Direct3D를 대체 어떻게 후킹하나요.
제작자 : 직접 해보세요.
나 : 네.
헐. 당시 내게 후킹이란 개념은, 윈도우 메세지를 가로채는 개념 밖엔 없었다.
설마 그때 내가 함수 호출을 따갈 수 있다는 걸 상상이나 했으려나.
게다가 윈도우 후킹 루틴도 dll로 만들어서 그 프로세스 공간에다 집어넣어야 한다는 사실도 이해가 안갔고,
심지어는 프로세스 메모리 공간이 나눠져있다는 사실도 몰랐고,
DLL Injection(DLL 주입)기법도 몰랐다.
인터넷 붙들고 계속 검색만 했다.
dasomnetwork.net이었던가, 그곳에서 후킹 관련 문서를 접하게 되었으나,
해석불가. GG
아, 이대로 포기인건가 하다가, '나비노리'라는 비슷한 써드파티 어플을 접하게 되었는데,
어랍쇼, 이놈은 뭔가 다르다?
보니깐, 임의로 만든 d3d9.dll 파일을 클라이언트와 같은 경로에 놓아버리는 것이 아닌가?
나중에 알게 된 사실인데, 이걸 Proxy DLL(대리 DLL)기법이라고 한다더라.
근데 문제는 d3d9.dll의 IDirect3D9와 IDirect3DDevice9를 몽땅 내가 래핑해야했다는 점!
우연히 구글에서 Direct3D8의 것을 래핑한 클래스를 찾아서, 조금 손봐서 완성.
그렇게해서 우여곡절 끝에 작품이 나왔다.
아, 근데 래핑 클래스를 쓰면 함수 호출하는 데에 오버헤드가 생기지 않을까?
(당시에는 오버헤드란 건 몰랐고, 그냥 call, ret이 쓸데없이 반복되면 성능저하가 나지 않을까라고 생각했음)
그래, 후킹이란 걸 해보자꾸나.
10월, 학교 축제가 끝나자 마자 충남대 맞은 편에 있는 PC방으로 곧장 달려갔다.
근데 갑자기 그때 본 후킹 문서가 어느 정도 이해가 되는 것이었다.
어렴풋이 이해는 했는데, 아, 역시 구현은 못하겠더라.
그래서 DLL 인젝션 코드와 API 후킹 코드를 샅샅이 뒤져봤다.
결국 찾아서, 원리도 이해하고 수정 없이 바로 적용.
물론, 래핑 클래스는 모조리 해체하고 주입/후킹 루틴도 작성.
결국에 그렇게 해서 제대로 된 놈이 나왔다.
욕심이 또 생겼다.
시계를 그려주는 기능과,
마우스 버튼이 눌려진 채로 있게 해주는 기능과,
쉬프트 버튼(마비노기에서 걸을 때)이 눌려진 채로 있게 해주는 기능을 넣어보고 싶었다.
얼떨결에 Direct3D 기초를 나도 모르게 익혀버렸고,
Direct Input 기초도 익혀버렸다.
(참고로 마비노기는 버퍼모드였던 것 같다)
중학교 2학년과 3학년은 정말 폭발적으로 이것 저것을 배우고 알게 되었다.
좀 걱정되는 건 너무 잡스럽게 배우는 건 아닐까, 좀 걱정되기도 한다.
하긴 그때는 모르는게 너무 많아서, 뻘짓과 삽질을 많이 해보는 게 가장 좋은게 아니었을까 싶다.
마치 수학 실력이, 모른다고 바로 답지 보고 아는 것보다는 비록 답은 못구해도 뻘짓과 삽질을 한 다음에 답지를 슬쩍 볼 때에 더 많이 느는 것처럼 말이지.
적절한 뻘짓은 건강에 좋다던데요 (???)
난 뻘짓 너무 많이해서 탈이다 ㅠㅠ
시간 많으니까 일단 어떻게든 배워두면, 나중에 써먹을 수 있다면, 그러면 되는겁니다.. -이게 현실
제가 중학교땐 뭘했나 싶네요 ' ㅅ'a 긁적...