반응형

후우~ 또 오랜만에 포스팅을 하네요~~
한 4개월 간의 '백수' 생활을 청산하고~ 저번달 12일부터 다시 회사생활을 시작했는데~
ㅋ.. 그러다보니 자연스레(?) 또~ 글을 쓰는데 신경을 못썼습니다...^^;;;
( 그저 핑계인거죠...;;; )

얼마전 우연히 알게된 소식인데~ '올리디버거 2.0' 이 릴리즈 되었네요~ : )
( 올리디버거 사이트 : http://www.ollydbg.de )

아직까지 '플러그인' 기능은 추가되지 않았고, Win64 환경은 지원하지 않는다고 합니다.
사이트에 올라온 내용으로는 Win64 환경의 지원은 2.01 버전에서...
'플러그인' 기능은 2.02 버전에서 추가할 예정이라고 하네요..^^;;
( 64비트 올리디버거도 개발 예정인 듯.... )

저 개인적으로는 '플러그인' 기능이 '올리디버거'의 꽃이라고 생각을 하는 만큼~~
얼른 추가가 되었으면~~~ 하는 바람이 있습니다. : )


반응형

'Reverse Engineering > RCE Tools' 카테고리의 다른 글

Kernel Detective v1.4.1  (2) 2010.12.19
Import REConstructor v1.7e FINAL ~  (0) 2010.10.13
XueTr 0.36 업데이트~  (2) 2010.08.07
Kernel Detective v1.3.1  (8) 2010.03.29
올리디버거의 유용한 플러그인들~!  (4) 2008.11.18
AND

반응형

예~~전에 있었던 어떤 사소한 계기로 인해 작업을 할 때마다~ 핸들에 대한 신경을 제법 쓰곤 합니다.
오늘도 이것저것 테스트를 하던 중에~ 제가 작성한 프로그램의 핸들수가 계속 증가하는 걸 보고~
꽤나 속쓰린(?) 마음으로 나름대로 원인을 찾아봤습니다.

처음에는 제가 코드 작성을 잘못한 줄 알았는데... 그게 아니더군요.;;;
제가 작성한 프로그램 뿐만 아니라~ 다른 프로그램들도 계속해서 핸들수가 증가하는 걸 보고는..
한 편으로는 코딩 실수가 아니라서 안심을 했지만, 다른 한 편으로는 시스템에 뭔가 문제가 있는건가 싶어~
굉장히 찜찜했습니다...;;;
( 참고로 프로세스가 포커스를 새로 받을 때마다 핸들수가 증가를 하는 상황이;;;; )

살펴본 결과, 핸들이 계속 증가하는 건 IME 랑 연관이 있는 듯 했습니다.
"정확히 이거다!!" 라고 할 수는 없지만, IMJKAPI.DLL, IMKRAPI.DLL, IMETIP.DLL, IMKRTIP.DLL 이 로딩된~
프로세스들의 경우 핸들이 증가하는 문제가 발생하더군요;;;

< 그림.01 > 핸들수 증가의 주범(?) IMEKR 레지스트리



모니터링 툴을 돌려봤더니~ RegOpenKey 로 키를 열고는 있지만 RegCloseKey 로 닫지를 않네요;;;

< 그림.02 > 레지스트리 모니터링 캡쳐



제 나름의 테스트로는 Office 2007 설치시 IME 까지 설치를 한 경우 문제가 발생했습니다.
일단 제가 사용하고 있는 Windows7 에서는 문제가 발생했지만, Vista 나 XP 는 어떨지 장담할 수가 없습니다 ^^;;;

이렇게 셋팅해두고 쓴지 몇 개월이나 됐는데~ 오늘에서야 요런 문제가 있는 걸 알았네요..
조금 전에 부랴부랴~ Office 2007 버전의 IME 를 제거를 했더니 문제가 발생하지 않는군요~~ 흐흐 : )

Windows7Office 2007 (IME 까지)을 설치하신 분들은 참고하시면(?) 될 듯 합니다~ : )
근데... Windows7 에다가 Office 2007 (IME 까지) 설치하신 분들 중~~
이런 문제가 발생하지 않은 분 계신가요~~?? +_+



반응형
AND

반응형

개인적으로 툴 하나 만들면서~ 이것저것 찾아보다가~ 그냥 정리차원에서 한번 올려봅니다.

1. GetModuleFileNameEx   - [ PSAPI ]

DWORD WINAPI GetModuleFileNameEx(
    __in          HANDLE hProcess,
    __in          HMODULE hModule,
    __out        LPTSTR LpFilename,
    __in          DWORD nSize
);

- Windows2000 / WinNT 4.0 이상에서 사용가능.
- 프로세스뿐만 아니라 로딩된 모듈의 경로까지 지원하는 범용 함수.
- 프로세스 PEBPEB_LDR_DATA 의 리스트를 돌면서 LDR_DATA_TABLE_ENTRY 에 저장된 이름을 가져옴.
   ( 내부적으로 NtQueryInformationProcess 사용 : ProcessInformationClass = 0 [ProcessBasicInformation] )


2. GetProcessImageFileName   - [ PSAPI ]

DWORD WINAPI GetProcessImageFileName(
    __in          HANDLE hProcess,
    __out        LPTSTR LpImageFileName,
    __in          DWORD nSize
);

- WindowsXP 이상에서 사용가능.
- NtQueryInformationProcess 를 사용 : ProcessInformationClass = 27 [ProcessImageFileName]


3. QueryFullProcessImageName   - [ KERNEL32 ]

BOOL WINAPI QueryFullProcessImageName(
    __in          HANDLE hProcess,
    __in          DWORD dwFlags,
    __out        LPTSTR LpExeName,
    __in_out    PDWORD LpdwSize
);

- Windows Vista 이상에서 사용가능
- NtQueryInformationProcess 를 사용.
  => dwFlags 가 0 이면, ProcessInformationClass = 43 [Unknown]
       dwFlags 가 1 이면, ProcessInformationClass = 27 [ProcessImageFileName]


다음은 각 함수를 사용한 예제코드 입니다~ : )

#include <windows.h>
#include <psapi.h>
#include <tchar.h>
#include <stdio.h>
 
#pragma comment(lib, "PSAPI.LIB")
 
int _tmain(void)
{
    DWORD dwLen = 0;
    TCHAR szImagePath[MAX_PATH] = { 0, };

    // 1. GetModuleFileNameEx (PSAPI)
    ZeroMemory(szImagePath, sizeof(szImagePath));
    GetModuleFileNameEx(GetCurrentProcess(), NULL, 
                        szImagePath, (sizeof(szImagePath)/sizeof(TCHAR)));
    _tprintf("# GetModuleFileNameEx\n\r  - %s\n\n\r", szImagePath);

    // 2. GetProcessImageFileName (PSAPI)
    ZeroMemory(szImagePath, sizeof(szImagePath));
    GetProcessImageFileName(GetCurrentProcess(), 
                            szImagePath, (sizeof(szImagePath)/sizeof(TCHAR)));
    _tprintf("# GetProcessImageFileName\n\r  - %s\n\n\r", szImagePath);

    // 3-1. QueryFullProcessImageName [Flags - 0] (KERNEL32)
    ZeroMemory(szImagePath, sizeof(szImagePath));
    dwLen = sizeof(szImagePath)/sizeof(TCHAR);
    QueryFullProcessImageName(GetCurrentProcess(), 0, szImagePath, &dwLen);
    _tprintf("# QueryFullProcessImageName [Flags - 0]\n\r  - %s\n\n\r", szImagePath);

    // 3-2. QueryFullProcessImageName [Flags - 1] (KERNEL32)
    ZeroMemory(szImagePath, sizeof(szImagePath));
    dwLen = sizeof(szImagePath)/sizeof(TCHAR);
    QueryFullProcessImageName(GetCurrentProcess(), 1, szImagePath, &dwLen);
    _tprintf("# QueryFullProcessImageName [Flags - 1]\n\r  - %s\n\n\r", szImagePath);

    return 0;
}


그리고 예제코드 실행결과~ : )

< 그림.01 > 예제코드 실행결과


각각의 장단점이 있으니~ 경우에 따라서 필요한 함수를 사용하면 될듯합니다.
개인적으로는 QueryFullProcessImageName 함수가 제일 괜찮았습니다만...
비스타 이상에서만 사용가능한게 흠이네요~ ^^;;



반응형
AND