2011.12.24 13:49 System
아주 간만에 포스팅입니다.
1,2주 안하다보니 한달이 되고 두달이 되고..
좀 더 심도있는 내용을 올리고 싶었는데 그게 또 핑계거리가 되서 블로그에 글을 안쓰고 있네요.
그래서 간단한 내용이라도 올리고자 합니다.
Global Hooking 을 거는 손쉬운 방법으로는 SetWindowHookEx가 있죠.
Windows 에서 자동으로 Injection을 시켜주기 떄문에 Process의 생성을 catch 해서 따로 Injection 해줄필요도 없구요.
이 부분에 관해서는 Reversecore님 Blog에 아주 자세히 설명되어있기 떄문에 참조하시길 바랍니다.
제가 이번에 쓸 내용은 SetWindowsHookEX를 이용해서 Hooking 을 걸고 UnHookWindowHookEx를 이용하여 해제했는데도
박혀있는 DLL 을 강제로 Ejection 시키는 방법입니다.
[ 추후 UnHookWindowsHookEx를 이용하지 않고 Hooking을 해제하는 방법도 올리도록 하겠습니다 :D
Windows7 에 올라와서 물리 메모리에 접근하는게 좀 까다로워져서 고생중이네요. Driver 없이 User 모드에서 가능한지를 살펴보고 있습니다
XP는 되는데 음.. ]
[+]Problem
UnHookWindowsEx만 호출한 경우 대부분의 Process에서는 DLL이 Ejection 되지 않습니다.
[ 물론 해제가 되는 Process도 있습니다. Process 내부에서 Message 처리를 열심히 하는 녀석들이죠.
대부분 UI 가 사용자에게 보여지고 있는 상태의 녀석들이구요. ]
보통 UnHook 후에 SendMessage 를 Broadcasting 하게 뿌려서 Process에 해제하게 되죠.
이 Message는 의미있는 Message 일 필요는 없습니다.
Message가 오면 Hook Chain을 알아서 갱신하니까요.
아무튼 이렇게 Message 를 뿌려줘도 DLL이 빠지지 않는 Process가 존재하게 됩니다.
대표적으로 AdobeARM.exe Chrome의 Rundll32.exe가 있죠.
물론 항상 빠지지 않는건 아니고 간혹 빠지지 않는 현상을 보게 됩니다.
이런 Process들은 대부분 단일 Thread라는 점을 확인할 수 있는데요.
정리하자면
1. UnHook할 때는 Message를 뿌려서 받은 Process들은 해제가 된다.
2. UnHook 되지 않는 녀석들은 대부분 단일 Thread이다.
3. 위 Process 들도 항상 DLL이 Ejection 안되는건 아니다.
이 부분에서 문제점을 유추할 수 있습니다.
Process에 외부에서 들어온 Message를 처리할 Thread가 없으면 DLL이 Ejection 되지 않는다.
라는 점입니다.
[+]Solution
그렇다면 위 문제는 어떻게 해결해야 할까요?
많은 분들이 FreeLibrary를 CreateRemoteThread를 이용해서 삽입하는 방법을 생각하셨을겁니다.
흠, 하지만 이 방법에는 문제점이 있는데
FreeLibrary시에 해당 DLL에 접근하고 있는 Thread가 있으면 그대로 프로그램이 뻗어버린다는 것이죠.
DLL Unload 뭐 이런 Error가 났던걸로 기억합니다.
결국 DLL이 자동으로 Ejection 되게 하려면 Message를 처리하도록 만들어야한다는거죠.
Message 처리 루틴 Thread를 Process에 삽입하고 다시 Message를 보내볼까요?
너무 번거롭습니다.
생각해보면 Process 자체에서 Ejection 해주는게 아님을 파악할 수 있습니다.
빈 Message를 받았을 때 Hook Chain에 없는 DLL을 빼주는게 Process 자체 역할을 아니니까요.
Process는 단순히 Message를 받는 것이고 이 때 발생한 특정 Event를 Windows에서 받고 Ejection 해준다고 판단 내릴 수 있겠군요.
그렇다면 직접 Message를 발생시키면 어떨까요?
Code Injection을 통해서 DLL이 빠지지 않는 Process에서 Message를 발생하도록 하는거죠.
아래 Code Inejction Code는 Reversecore님의 Code를 상당부분 인용했습니다.
http://www.reversecore.com/82
먼저 사용할 함수를 정의합니다.
다음은 실행코드입니다.
함수 호출에 필요한 String을 먼저 삽입하고 그곳을 참조하는 방법입니다.
SendMessage를 쓰기 보다 SendMssageTimeOut을 썼고
Parameter 간소화를 위해 Broadcasting을 합니다.
위와 같은 방법을 이용하면 DLL이 정상적으로 잘 Ejection되는 것을 확인하실 수 있을겁니다.
어때요 참 쉽죠?
글이 올라온 날이 12월 24일이라는 건 신경안쓰셔도 됩니다
'System' 카테고리의 다른 글
Hiding files and folders using clsid (2) | 2012.07.29 |
---|---|
E-Book 보안에 관한 썰 (0) | 2012.07.28 |
SetWindowsHookEx로 삽입한 DLL Ejection이 안될때 (2) | 2011.12.24 |
Analysis about Pydbg Snapshot (1) | 2011.05.18 |
Consideration About Google Chrome Loading Problem [ 구글 크롬 로딩 문제에 관한 고찰 ] (2) | 2011.05.11 |
UAC 적용 조건 및 사례 (0) | 2010.09.29 |