반응형
HGLOBAL hRe;
char* pText;

hRe=LoadResource(hInst,FindResource(hInst,MAKEINTRESOURCE(IDR_GG2),TEXT("GG")));

pText=(char*)LockResource(hRe);
MessageBox(NULL,pText,"dfd",MB_OK);

FreeResource(hRe);

사용자 리소스를 사용하기 위해서는 리소스 타입를 Custom...에서 이름을 지정해주어야 한다

본인은 위체서 처럼 "GG"라는 이름으로 타입을 지정했다.

리소스를 사용하기 위해서는 일단 해당 리소스를 찾고 로딩하고.. 사용하게 된다.

HRSRC hResc=FindResource(hInst,MAKEINTRESOURCE(IDR_GG2),TEXT("GG"));

는 리소스를 찾는 과정으로 반환값은 HRSRC라는 이름의 핸들러다. 이때 필요한 정보는 인스턴스, 리소스 ID와 소속 타입...(실제론 모든 리소스를 접근하는 표준 방법임)

찾는후에 로딩하는 과정은

HGLOBAL hRe=LoadResource(hInst,hResc);

위와 같이 로딩을 한후에 실제로 사용하기 위해서는 LockResource와 FreeResource를 사용해서 메모리에 실제적으로 적재하거나 해제하는 작업을 시행한다.

char* pText=(char*)LockResource(hRe);
MessageBox(NULL,pText,"dfd",MB_OK);

FreeResource(hRe);

결국 LockResource를 호출하게 되면 해당 데이타에 대한 포인터를 반환하면 적당히 원하는 타입으로 변경하면 된다. 위의 경우엔 char* 로 했다.

사용후에는 hRe를  FreeResource해주면 된다.


OS에서는 메모리가 부족하면 자동으로 리소스 부분을 메모리에서 제거한다. 즉 필요할때 로딩을 언제든지 할수 있으며, 리소스는 메모리 문제로 인해서 제거될수 있는 유동적인 존재다.


따라서 실제 로딩을 하는 것은 LockResource이며 없다면 다시 로딩을 시행할 것이다. 있다면 존재하는 녀석을 반환하게 될 것이다.


FreeResource는 메모리에서 완벽한 제거가 아니라, 메모리가 부족하면 언제든지 메모리에서 제거될수 있다는 것을 부여한다고 보면 되겠다.
-----------------------------------------------------------------------------------------------------

HRSRC FindResource( HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType)


hModule:리소스를 가진 모듈 핸들

lpName:리소스 이름

lpType:리소스 타입


리턴:리소스 핸들 리턴 

ex)FindResource( g_hInstance,MAKEINTRESOURCE(IDR_SPR_TML),"TML" );



숫자로 정의된 리소스 이름을 문자열 형태로 바꿔주는 매크로 ex)MAKEINTRESOURCE(IDR_SPR_TML)  

-------------------------------------------------------------------------------------
SizeofResource 함수는 지정된 리소스의 바이트 단위 크기를 반환한다.

DWORD SizeofResource(
  HMODULE hModule, // resource-module handle
HRSRC hResInfo // resource handle );

Parameters

hModule
그 리소스를 포함하고 있는 실행가능한 파일의 모듈에 대한 핸들
hResInfo
리소스의 핸들. 이 핸들은 FindResource 나 FindResourceEx 함수를 사용해서 생성되어야만 한다.

Return Values

만약 함수가 성공하면 반환값은 리소스의 바이트 숫자 크기이다.

만약 실패하면 반환값은 0이다. 확장된 에러 정보를 원하면 GetLastError을 호출하라.

QuickInfo

  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.
-------------------------------------------------------------------------------------

HGLOBAL LoadResource(HMODULE hModule, HRSRC hResInfo);
hModule: 해당 모듈 핸들
hResInfo : 잀을 리소스 핸들
리턴: 16비트 호환성을 위해 HCLOBAL핸들을 리턴하자민 이 핸들은 
실제로 전역 메모리
핸들이 아닌 단순한 핸들이다,
이렇게 읽은 리소스의 포인터를 얻으려면 LockResource()함수를
써야함...

-------------------------------------------------------------------------------------

LockResource 함수는 지정된 리소스를 메모리에서 잠근다

LPVOID LockResource(
  HGLOBAL hResData   // handle to resource to lock
);
 

Parameters

hResData
잠겨질 리소스의 핸들. LoadResource 함수는 이 핸들을 리턴한다

Return Values

만약 로드된 리소스가 잠기면, 반환값은 리소스의 첫번째 바이트의 포인터이다.
그렇지 않으면 NULL

Remarks

FindeResource 나 FindResourceEX 함수에 의해 반환된 핸들을 사용함으로써
리소스를 잠그려고 시도하면 동작하지 않을 것이다.
당신은 정확하지 않거나 불규칙한 데이터를 가리키는 값을 얻게 될 것이다.

accelerator table, bitmap, cursor, icon, menu 등의 사용을 끝내고
다음 표에 있는 함수 중 하나를 호출해 관련 메모리를 해제할 수 있다.

ResourceRelease function
Accelerator tableDestroyAcceleratorTable
BitmapDeleteObject
CursorDestroyCursor
IconDestroyIcon
MenuDestroyMenu

그것들을 생성한 프로세스가 종료 될 때 시스템은 이들
리소스를 자동으로 제거하지만, 적절한 함수를 호출하는 것은
메모리를 보호하고, 프로세스의 작업량을 줄여준다.

QuickInfo

  Windows NT: Requires version 3.1 or later.
  Windows: Requires Windows 95 or later.
  Windows CE: Requires version 1.0 or later.
  Header: Declared in winbase.h.
  Import Library: Use kernel32.lib.

반응형

특정 디렉토리 아래에 있는 모든 파일과 디렉토리 혹은 특정 조건의 파일과 디렉토리를 얻고자 한다면, 다음 API 함수를 이용한다.

HANDLE FindFirstFile(LPCSTR lpFileName, LPWIN32_FIND_DATA finddata);
BOOL FindNextFile(HANDLE hFind, LPWIN32_FIND_DATA finddata);
BOOL FindClose(HANDLE hFind);


FindFirstFile : 파일 검색을 시작한다.
파일 검색 문자열이 잘못되었거나 다른 이유로 함수 실행이 실패했을 경우 INVALID_HANDLE_VALUE로 Define된 상수값을 반환한다. 성공했을 경우 파일 검색 핸들을 반환하고 두 번째로 전달되는 구조체에 첫 번째로 발견되는 파일의 정보를 넣어준다.

LPCSTR lpFileName
파일 검색 문자열을 넘겨준다.
예) "c:\*.*" 혹은 "c:\*.txt"

LPWIN32_FIND_DATA finddata
파일 검색 데이터 구조체의 포인터를 넘겨준다.


FindNextFile : 다음 파일의 정보를 얻는다.
함수 실행이 성공하였을 경우 TRUE를, 실패하였을 경우 FALSE를 반환한다. 함수 성공시 두 번째 인자로 전해지는 구조체에 파일의 정보를 넣어준다.

HANDLE hFind
FindFirstFile이 반환한 파일 검색 핸들을 넘겨준다.

LPWIN32_FIND_DATA finddata
파일 검색 데이터 구조체의 포인터를 넘겨준다.

FileClose
: 파일 핸들을 닫는다.
FindFirstFile에 의해 열린 파일 핸들을 닫는다. 성공하였을 경우 TRUE를, 실패하였을 경우 FALSE를 반환한다.
HANDLE hFind
FindFirstFile이 반환한 파일 검색 핸들을 넘겨준다.


 실제 사용 예는 다음과 같다.

Windows 디렉토리의 모든 파일 및 폴더 출력 (Language : c)
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main()
  6. {
  7.     WIN32_FIND_DATA FindData;
  8.     HANDLE hFind;
  9.     char path[255];
  10.  
  11.     strcpy(path, "c:\\windows\\*");
  12.    
  13.     hFind = FindFirstFile((LPCSTR)path, &FindData);
  14.     if(hFind==INVALID_HANDLE_VALUE)
  15.         return 0;
  16.    
  17.     do
  18.     {
  19.         printf ("%s\n", FindData.cFileName);
  20.     }while(FindNextFile(hFind, &FindData));
  21.  
  22.     FindClose(hFind);
  23.  
  24.     return 0;
  25. }


(2003/2005)LPCSTR 캐스팅에 문제가 있는 경우 Project -> Properties -> Configuration Properties -> General -> Character Set을 Not Set으로 설정하기 바랍니다.
반응형

Microsoft에서는 프로세스간의 주고 받는 메세지를 후킹할 수 있는 함수를 제공한다.
바 로 SetWindowsHookEx()함수이다. 이 함수를 통해 DLL을 특정 프로세스나 모든 프로세스에 Injection할 수 있다.그리고 User-mode(ring 3)에서 동작하는 Keylogger들 대부분이 이 함수를 사용하여 구현된다.(SetWindowsHookEx()함수를 통해 후킹(Hooking)을 할 경우 전역 후킹이 간단하므로 많이 사용한다.)

먼저 SetWindowsHookEx()함수의 원형부터 알아보자.
(MSDN에 있는 내용이다.)

HHOOK SetWindowsHookEx(
    int idHook,
    HOOKPROC lpfn,
    HINSTANCE hMod,
    DWORD dwThreadId
);

첫번째 파라메터인 idHook 변수는 후킹 하고자 하는 메세지의 ID라고 할 수 있다. WH_GETMESSAGE, WH_KEYBOARD 등 다양한 메세지가 있다.(MSDN 참조)
idHook 파라메터에 지정된 값의 이벤트(메세지)가 발생할 경우 훅 프로시저(lpfb 파라메터에 설정된)가 동작하게 된다. 훅 프로시저는 Injection할 DLL(앞으로 Injected.dll이라 부르겠다)에 지정되어 있어야한다.

/* Injected.dll */
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 /* 원하는 코드 삽입 */
 return CallNextHookEx(0, nCode, wParam, lParam);
};

마 지막에 CallNextHookEx()함수를 호출한 이유는 훅 체인에 있는 다른 훅 프로시저가 해당 메세지를 사용할 수도 있기때문이다. 예를들면 키보드메세지를 후킹하여 Keylogger를 만들었다고 하면 해당 메세지를 후킹 후 로깅을 하고 CallNextHookEx()함수를 통해 처리를 하지 않고 그냥 끝내 버린다면 들통나버릴것이다.

두번째 파라메터는 lpfn이다. 이 파라메터에는 Injected.dll에 지정된  훅 프로시저의 주소값을 지정한다.만약 IdHook에 WH_KEYBOARD를 지정하여 후킹 할경우 해당 훅 프로시저는 KeyboardProc이다. 주소 값을 지정해줘야하는데 하드코딩하여 지정해 줄 수 있지만 LoadLibrary()함수와 GetProcAddress를 이용하여 Injected.dll의 훅 프로시저의 주소를 구할 수 있다.

/* Injector.c */
HMODULE hDll;
unsigned long KeyboardProcAddr;

hDll = LoadLibrary("injected.dll");
KeyboardProcAddr = GetProcAddress(hDll, "KeyboardProc");

다음으로 세번째 파라메터인 hMod를 보자. hMod는 DLL의 핸들(Handle)을 지정해야한다.여기에선 Injected.dll의 핸들을 지정해주면 된다.
이미 Injector.c에서 LoadLibrary("Injected.dll"); 통해 핸들을 얻었으므로 hDll변수를 사용하면 된다.

네 번째 파라메터 dwThreadId는 후킹할 프로세스 즉 Injected.dll을 삽입할 스레드(Thread)의 ID이다. PID라고 하며 해당 파라메터에 0을 지정하면 모든 스레드에 훅(Hook)을 한다는 의미로 전역 훅을 할 수 있다. 특정 스레드에 Injection을 하려고 한다면 "작업관리자"를 통해 PID를 얻어 하드코딩하거나 아래와 같은 방법으로 PID를 얻어 사용할 수 있다.

/* 전역 훅 */
SetWindowsHookEx(WH_KEYBOARD, KeyboardProcAddr, hDll, 0)

/* 지역 훅*/
SetWindowsHookEx(WH_KEYBOARD, KeyboardProcAddr, hDll, GetCurrentThreadID());

dwThreadId 값을 얻기 위한 함수는 많다.

+ Recent posts