반응형

 

아..이 문제 때문에 얼마나 고생 했는지 정말 짜증이 난다.

나와 같은 상황이 발생하지 않길 바라며, Windows 7에서의 GetMoudleHandle과 kernel32.dll, kernelbase.dll에 대한

내용을 언급하도록 하겠다.

 

먼저, Windows Vista 이후 바뀐 부분은  kernel32.dll을 사용하느냐 사용하지 않느냐 이다.

Vista까지는 kernel32.dll에서 모든걸 관장하였다. 따라서, kernel32.dll만 사용하더라도 아무 이상이 없었다.

 

그러나,~~

Windows 7으로 넘어오면서 kernel32.dll에서 사용하는 거의 모든 함수들이 kernelbase.dll로 이관되었다.

(그냥 kernel32.dll을 사용해도 된다.

어짜피 kernel32.dll에서 kernelbase.dll를 jmp 하기 때문에 문제 없을 것 이다.)

-> 만약, 잘 안되거나 하면 kernelbase.dll과 kernel32.dll를 뒤져보길 바란다. 그럼 안되는 이유를 알 수 있을 것이다.

 

그럼, python에서 GetModuleHandle을 사용하기 위한 방법을 알려주겠다.

결론부터 말하자면 Windows 7에서는 GetModuleHandleA는 없어졌다.

따라서, 아무리 GetMoudleHandleA()를 이용해봤자 return 값은 "0" 이다.

 

이걸 알기 위해서 일주일이 걸렸다..

몬 짓을 한건지..

괜히 디버기 만든다고 삽질을 하는 거 같은 느낌이 들지만, 그럼 어떻게 찾았는지 History를 적어보도록 하겠다.

 

ollydbg로 모듈 상태를 확인 한다.

해당 Windows 7에서는 kernelbase.dll이 기본으로 올라가 있는 것을 확인 할 수 있다.

kernel32.dll를 열어 보면, kernelbase.dll로 링크가 걸려 있는 것을 확인 할 수 있다.

 

 

Memory Map을 통해 Load된 내용을 확인 하였으니, 이젠 찾아 보도록 하자.

kernel32.dll 내부에서 GetMoudleHandle을 찾아 보면 딱하니

GetMoudleHandleW만 존제하는 것을 볼 수 있다.

 

 

그래서 코드를 아래와 같이 수정하면, Module의 시작 주소를 얻어 올 수 있다.

 

 

 

        handle = kernel32.GetModuleHandleW(dll)

        if handle <= 0:
            print ("[##] GetModuleHandle False\n")
            return False

        print ("[##] \"%s\" GetModudleHandle : 0x%08x\n" % (dll, handle))

 

GetModueHandle을 가지고 나와 같이 삽질 하지 않길 바라며,

이 글을 올린다.

 

반응형

'프로그래밍 > Python' 카테고리의 다른 글

문자열 타입 확인  (0) 2013.07.23
Windows 7에서 GetProcAddress 사용하기  (0) 2013.07.22
64bit debugger 만들기  (0) 2013.07.02
python thread context 보기(win7 64bit)  (2) 2013.07.02
Context 32bit / 64bit 선언  (0) 2013.06.29
반응형

 

LoadLibrary는 사용하는 Application이 직접 DLL, EXE를 메모리에 올려 핸들을 얻어오는 함수이고,

GetModuleHandle현재 메모리에 올라와 있는 DLL, EXE의 Handle을 얻어오는 함수 이다.

 

그럼 이런걸 어디에 사용하면 좋은가???

 

LoadLibrary의 경우는 그냥 내가 필요한 DLL을 직접 호출 할때 사용하는 것이 좋고

 

GetMoudleHandle의 경우는 현재 올라가져 있는 DLL, EXE의 핸들을 얻어오는 과정

즉, 디버거 또는 현재 타겟이 되는 메모리 주소 번지를 확인 할 때 사용하는 것이 좋다.

 

단, GetModuleHandle로 얻어온 handle은 FreeLibrary를 하면 안된다.

현재 사용하고 있는 다른 곳(프로그램)에서 문제가 발생할 수 있다.

따라서 사용이 끝나면  CloseHandle로 마무리하는 것이 좋다.

 

또한, LoadLibrary의 경우는 reference count가 올라가게 된다.

Reference count의 경우는 메모리의 효율적인 관리에서 사용되는 데 count 수가 증가 될 경우 handle leak, memory leak이 발생할 가능성이 있다. (찾아봤는데 그거 말고는...ㅡㅡ;;)

 

 

 

 

반응형

+ Recent posts