IDA로 분석 후 올리로 확인하면 되지만 너무 귀찮고 매번 쫏아가서 확인하기도 귀찮고...해서 열심히 찾아봤지만
API가 아닌 사용자 정의 함수(USER Function)에 대한 모니터링 도구가 없었다.
그래서 하나 만들어 써야겠다는 생각에 만들었는데 제법(?) 쓸만하다.. ㅋㅋㅋ
만든 도구인데...
간단히 설명하면...
1. 분석하고자 하는 대상 프로세스를 선택 후
2. 내부에서 사용하는 DLL 리스트를 확인. 이 후 분석하고자 하는 DLL를 선택하면, 내부 im/export 함수 목록과 기본 정보가 출력하며, 등록되지 않은 다른 함수들도 출력(내부에서 사용자가 구현한, 또는 im/export 되지 않은 함수들)
3. 원하는 대상을 클릭 시 해당 함수 내부에서 호출 또는 점프하는 주소를 출력
4. 주소값 확인 후 모니터링 대상에 추가 후 모니터링 ( 모니터링 주소값은 임의로 추가 가능)
아직 버그가 몇개 남아있어서 수정중이긴 하지만 지금도 나름 쓸만해보인다...극히 개인적인 생각.. ㅋㅋ
API와 같은 함수들은 파라미터들을 확인하고 원하는 값을 뽑는게 가능하지만, 사용자 정의 함수는 파라미터이 몇개인지 알 도리가 없으므로(물론 IDA와 같은 좋은 도구들은 어떻게 찾는지 모르지만, 뽑아줌...하지만 난 모름..ㅋ) 파라미터 3개까지만 각 자료형별로 출력하도록 했다.
어차피 이건 Memget Project에 포함되있는 기능이고, 해당 파라미터가 만약 포인터 또는 구조체일 경우 주소를 덤프떠보면 뭐가 나오지 않을까? ...
그중 가장 크게 나눈다면 타 프로세스에서 IE에 접근하는 방법과 IE내부(BHO 설치 후)에서 접근하는 방법으로 나눌수 있을것 같습니다.
그 중 개인적으로는 가장 구현하기 편하고, 응용하기도 편한 타 프로세스에서 IE에 접근하는 방법을 포스팅하겠습니다.
포스팅할 내용은 주요 코드 위주로 설명하며 세부적인 응용은 포스팅하지 않겠습니다.
일단....가장먼저 IE의 PID를 알아야겠죠.
PID를 얻어오는 방법은 생략하겠습니다. 뭐 직접 입력해줘도 되는거니깐요.
PID를 얻었다면
DWORD dwPID;
HWND hwnd = GetWinHandle(dwPID);
로 IE의 핸들을 얻어옵니다. 해당 핸들을 이용하여 다음은 접근할 IE를 찾아야하는데, 요세 나오는 브라우져들 특징은 탭기능이 있다는겁니다. 그 많은 탭중에서 현재 사용하고 있는 탭을 찾아야합니다. 저같은 경우는 모든 핸들을 출력해주고, 원하는 핸들을 선택하도록 했는데 이 방법은 다음에 포스팅 하도록 하겠습니다.
외부에서 BHO에 접근하는 방법도 여러가지가 있는데 이번엔 ObjectFromLresult을 이용하여 접근하는 방법입니다.
HINSTANCE hins = ::LoadLibrary(_T("OLEACC.DLL"));
위와 같이 OLEACC.DLL의 인스턴스를 얻어옵니다.
이 후 얻은 인스턴스를 이용하여 ObjectFromLresult 함수의 주소를 얻습니다.
LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hins , "ObjectFromLresult" );
ObjectFromLresult함수에 대한 설명은 MSDN을 참고하시면될것같습니다.
ObjectFromLresult의 2번째 인자값을 IID_IHTMLDocument2 로 주시면 4번째 인자값이 OUT으로써 IHTMLDocument2 의 주소값을 받아옵니다. 간단히 작성하면,