제 dll이 injection 된 프로세스가 브라우저인 경우 해당 브라우저로부터 url을 뽑아내야하는 작업이 필요했습니다. 


첫 번째로 생각한 방법은 특정 url에 접속될 때 호출되는 인터넷 관련 함수들을 후킹해서 url을 뽑아오는 것이었습니다.

당연히 InternetExplorer, Chrome, Firefox 등등 모든 브라우저들에 대해서 전부 사용가능해야겠지요.


IE 같은 경우는 InternetCrackUrlW 라는 함수를 후킹하면 url을 얻을 수 있긴 했습니다.



www.nate.com 이라는 사이트를 url창에 치고 들어갔습니다만.. 처음에 한번만 나오고 그 뒤로 여러가지 url들에 대해 계속 요청을 하고 있어서 많은 값들이 나오게 됩니다. 그리고 chrome 같은 경우 InternetCrackUrlW함수를 호출조차 하지 않습니다.

Chrome은 getaddrinfo 라는 함수를 후킹해보면 url을 얻을 수 있긴한데 이 또한 하나의 url에 접속만해도 너무 많은 url 들이 보여지게 때문에 사용자가 실제로 들어간 사이트의 완벽한 url 주소를 판별하기가 어려웠습니다. 고로 후킹을 통한 url 뽑는 방식은 포기..


두 번째로 시도한 방법은 http request header 내용을 판별하는 것이었습니다.

http request header는 유저에서 함수를 후킹해서 얻을 수 있는게 아니고 프록시를 사용하거나 winpcap 라이브러리 같은 걸 사용해야 했습니다.. 고로 fail... 


세 번째는 IE BHO 라이브러리 사용 및 크롬 플러그인 사용.. 이렇게해서 얻어봤자 의미가 없을 것 같아서 시도 안했습니다.


그리고 검색검색하다가 SetWinEventHook 함수를 사용해서 이벤트 후킹하고 주소창을 나타내는 edit box 내부 값을 얻어오는 것이었습니다. 이 방법은 Internet Explorer, Chrome, Firefox 등등 브라우저의 영향을 받지않고 모든 url을 제대로 얻어낼 수 있는 방법이었습니다. good good good!


SetWinEventHook 를 사용해 EVENT_OBJECT_VALUECHANGE 를 등록시켜주면 edit box가 변경될 때마다 이벤트 후킹 함수가 호출됩니다. 그리고 AccessibleObjectFromEvent 함수를 사용해 IAccessible 인터페이스에 대한 클래스 주소를 얻어오면 됩니다. 윈도우 표준 컨트롤들은 대부분 IAccessible 이라는 인터페이스에 바인딩 되어 있기 때문입니다. 해당 클래스 내부적으로 get_accName, getaccValue 와 같은 메서드를 지원해주기 때문에 쉽게 컨트롤 이름 및 내부에 있는 값을 쉽게 얻어올 수 있습니다.


아래 동영상은 브라우저에 dll injection을 하고 SetWinEventHook을 사용해 해당 프로세스에서 발생되는 메시지를 후킹해 edit box 변화를 감지하고 해당 컨트롤 이름으로 필터링 규칙을 세운 후 컨트롤 내부 값을 OutputDebugString 으로 출력하는 영상입니다. ( IE, Chrome, Firefox 3개 브라우저에 대해서 테스트 했습니다. )




아직은 실제로 사용하기엔 미흡한 부분이 있지만 좀더 다듬으면 나아질 것 같네요.

그래도 조잡하지 않은 방법으로 끝낸거 같아서 마음은 홀가분하네요.


== 추가 ==

위 상태는 현재 사이트가 www.naver.com 일 때 url 부분에 www.nate.com을 치고 엔터를 누르지 않은 상태에 있는 경우 판단을 하지 못하고 있는 상황입니다. 즉, 현재 보여지는 사이트는 www.naver.com인데 url 에는 www.nate.com이 입력된 상태이죠. 이를 판단하기 위해선 get_accState 를 추가적으로 사용해 현재 오브젝트 상태 값을 가져와 판단하면 어느정도 깔끔하게 처리가 됩니다. 즐코즐코!

Posted by Ezbeat