#include "stdio.h"
#include "conio.h"
#include "windows.h"

 

#define DEF_DLL_NAME  "KeyHook.dll"
#define DEF_HOOKSTART  "HookStart"
#define DEF_HOOKSTOP  "HookStop"

 

typedef void (*PFN_HOOKSTART)();
typedef void (*PFN_HOOKSTOP)();

 

void main()
{
 HMODULE   hDll = NULL;
 PFN_HOOKSTART HookStart = NULL;
 PFN_HOOKSTOP HookStop = NULL;
 char   ch = 0;

 

    // KeyHook.dll 로딩
 hDll = LoadLibraryA(DEF_DLL_NAME);


    if( hDll == NULL )
    {
        printf("LoadLibrary(%s) failed!!! [%d]", DEF_DLL_NAME, GetLastError());
        return;
    }

 

    // export 함수 주소 얻기
 HookStart = (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART);
 HookStop = (PFN_HOOKSTOP)GetProcAddress(hDll, DEF_HOOKSTOP);

 

    // 후킹 시작
 HookStart();

 

    // 사용자가 'q' 를 입력할 때까지 대기
 printf("press 'q' to quit!\n");
 while( _getch() != 'q' ) ;

 

    // 후킹 종료
 HookStop();
 
    // KeyHook.dll 언로딩
 FreeLibrary(hDll);
}

 

 

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

HookMain.exe 파일의 소스코드(HookMain.cpp) 분석

 

1. LoadLibraryA(DEF_DLL_NAME);

- 프로세스에서 Dll을 로드 할때 사용하는 함수

 

HMODULE WINAPI LoadLibrary(

_In_ LPCTSTR lpFileName

);

-> lpFileName : Dll 파일의 이름

 

 

 

2. (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART); 

- 함수의 주소를 얻어 올때 사용하는 함수

 

 

FARPROC GetProcAddress(
    HMODULE hModule,
    LPCSTR lpProcName
);

-> hModule : 찾고자 하는 함수를 가진 모듈의 핸들값 
-> lpProcName : 찾고자 하는 함수 이름

 

3. FreeLibrary(hDll);

 

- 로드되어 있는 DLL 을 언로드(해제)할때 사용하는 함수

(로드된 DLL은 모두 1이상의 값으로 설정된 자신의 사용계수를 가진다. FreeLibrary 함수는 사용계수를 감소시키는 역할만한다. 시스템은 사용계수가 0이 되면 그제서야 실제로 해당 DLL을 해제하게 된다.)

0

 

BOOL FreeLibrary(HMODULE hModule);

-> hModule : 해제할 모듈의 핸들값



 

 

 

http://jrich.tistory.com/2 

출처 


BOOL CreateProcess(

  LPCTSTR lpApplicationName,

  LPTSTR lpCommandLine,

  LPSECURITY_ATTRIBUTES lpProcessAttributes,

  LPSECURITY_ATTRIBUTES lpThreadAttributes,

  BOOL bInheritHandles,

  DWORD dwCreationFlags,

  LPVOID lpEnvironment,

  LPCTSTR lpCurrentDirectory,

  LPSTARTUPINFO lpStartupInfo,

  LPPROCESS_INFORMATION lpProcessInformation

);


- lpApplicationName : 윈도우즈 기반 어플리케이션의 실행 파일 이름 이다. 

파일 이름의 확장자를 반드시 명시해 주어야 한다.

(NULL 설정시 lpCommandLine에서 파일 이름 설정)


- lpCommandLine : 실행 시 전달 할 명령 행 인자 이다. 

lpApplicationName이 NULL일 경우 이 파라메터에서 파일 이름 또는 

파일 이름과 명령행 인자를 설정할 수 있다.

전달할 값을 상수로 설정할 수 없다, 

반드시 배열 변수에 전달할 인자를 입력 후 배열의 시작 주소를 설정 한다.

명령행 인자가 없을 경우 NULL을 줄 수 있으나 lpApplicationName과 함께 둘 다 NULL이 될 수는 없다.



- lpProcessAttributes : 프로세스 보안 속성을 설정 한다. 일반적으로 사용하지 않으며 NULL을 설정 한다.


- lpThreadAttributes :  스레드 보안 속성을 지정 한다. 일반적으로 사용하지 않으며 NULL을 설정 한다.


- bInheritHandles :  프로세스 핸들의 상속 여부를 설정 한다.

( TRUE 면 자식 프로세스에게 상속 가능한 핸들을 생성하고, FALSE 면 상속 불가능한 핸들을 생성 한다.)


- dwCreationFlags : 우선 순위 등급 및 프로세스의 생성을 제어하는 플래그 이다.

Process Creation Flags의 값을 설정 한다. 

일반적인 프로세스 생성 시 0을 설정 한다.


- lpEnvironment : 프로세스의 환경 블록을 설정 한다, 이 값이 NULL이면 부모 프로세스의 환경 블록을 사용 한다.

  일반적으로 NULL값을 설정 한다.


- lpCurrentDirectory : 프로세스의 현재 디렉토리를 설정 한다, NULL값을 설정 하면 부모 프로세스의 현재 디렉토리가 해당 프로세스의 현재 디렉토리로  설정 된다.

일반적으로 NULL값을 설정 한다.



- lpStartupInfo : 프로세스의 초기화 정보를 설정 한다.

STARTUPINFO(또는 STARTUPINFOEX) 구조체 변수의 값을 설정 하여 주소를 전달 한다.

  일반적으로 멤버 값들을 설정하지 않으나 구조체의 크기를 설정하는 cb의 값은 반드시 입력이 되어 있어야 한다.

  설정하지 않은 멤버 들은 0으로 초기화하여 전달 한다. 


- lpProcessInformation : 프로세스의 생성 후 결과 정보를 받기 위한 파라메터이다.

PROCESS_INFORMATION 구조체 변수의 주소를 전달 한다.


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

typedef struct _STARTUPINFO {

  DWORD  cb;

  LPTSTR lpReserved;

  LPTSTR lpDesktop;

  LPTSTR lpTitle;

  DWORD  dwX;

  DWORD  dwY;

  DWORD  dwXSize;

  DWORD  dwYSize;

  DWORD  dwXCountChars;

  DWORD  dwYCountChars;

  DWORD  dwFillAttribute;

  DWORD  dwFlags;

  WORD   wShowWindow;

  WORD   cbReserved2;

  LPBYTE lpReserved2;

  HANDLE hStdInput;

  HANDLE hStdOutput;

  HANDLE hStdError;

} STARTUPINFO, *LPSTARTUPINFO;



typedef struct _PROCESS_INFORMATION {

  HANDLE hProcess;

  HANDLE hThread;

  DWORD  dwProcessId;

  DWORD  dwThreadId;

} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;











'Reversing(리버싱 핵심 원리) > 공부 자료(정리x)' 카테고리의 다른 글

DLL Ejection p339  (0) 2018.06.23
Dll Injection 공부 (injectdll.cpp )  (0) 2018.06.22
Dll Injection 공부  (0) 2018.06.19
Windows 메시지 후킹 공부  (0) 2018.06.19

32bit인 process의 정보를 가져올때 사용하는 함수


성공시 생선된 스냅샷의 정보의 핸들 리턴

실패시 INVALID_HANDLE_VALUDE(-1) 리턴


HANDLE WINAPI CreateToolhelp32Snapshot(

 _In_ DWORD dwFlags,

 _In_ DWORD th32ProcessID

);


- dwFlags : 어떤 정보를 가져올것인가를 정하는 것(주로 사용 :  TH32CS_SNAPMODULE32으로 모듈정보 가져옴)

(3번째 인자를 0으로 해서  TH32CS_SNAPPROCESS 를 사용해 process정보를 가져옴)

- th32ProcessID : 프로세스의 ID


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

http://jrich.tistory.com/38

출처


스냅샷 정보에서 첫번째 모듈의 정보를 읽어올때 사용하는 함수


BOOL WINAPI Module32First(

 _In_ HANDLE hSnapshot,

 _Inout_ LPMODULEENTRY32 lpme

);


- hSnapshot : CreateToolhelp32Snapshot 함수 호출의 반환 값인 스냅샷 정보의 핸들

- lpme : 읽어온 모듈의 정보를 저장 할 MODULEENTRY32 구조체 변수의 주소

(구조체의 크기를 나타내는 dwSize의 멤버는 sizeof 연산자로 크기를 구하여 반드시 설정 해야한다.)


typedef struct tagMODULEENTRY32 {


  DWORD   dwSize;    // 구조체 크기


  DWORD   th32ModuleID;    // 사용하지 않음, 1로 설정


  DWORD   th32ProcessID;    // 모듈이 속해있는 프로세스의 식별자


  DWORD   GlblcntUsage;    // 모듈의 로드 횟수, 일반적으로 -1로 설정


  DWORD   ProccntUsage;    // 모듈의 로드 횟수, 일반적으로 -1로 설정


  BYTE    *modBaseAddr;    // 프로세스 메모리 공간에서의 모듈의 기준 주소


  DWORD   modBaseSize;    // 모듈의 크기(바이트 단위)


  HMODULE hModule;    // 프로세스 메모리 공간에서의 모듈의 핸들


  TCHAR   szModule[MAX_MODULE_NAME32 + 1];    // 모듈 이름


  TCHAR   szExePath[MAX_PATH];    // 경로를 포함한 모듈 이름


} MODULEENTRY32, *PMODULEENTRY32;


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


http://jrich.tistory.com/39

출처


Module32First 호출 이후 스냅샷 정보에서 다음 프로세스의 정보를 읽어온다.


BOOL WINAPI Module32Next(

 _In_ HANDLE hSnapshot,

 _Out_ LPMODULEENTRY32 lpme

)l;


- hSnapshot :  CreateToolhelp32Snapshot 함수 호출의 반환 값인 스냅샷 정보의 핸들

- lpme : 읽어온 프로세스의 정보를저장할 MODULEENTRY32 구조체 변수의 주소 


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

http://jrich.tistory.com/27

출처


스냅샷 정보에서 첫 번째 프로세스의 정보를 읽어올때 사용하는 함수


BOOL WINAPI Process32First(

 _In_ HANDLE hSnapshot,

 _Inout_ LPPROCESSENTRY32 lppe

);


- hSnapshot : CreateToolhelp32Snapshot 함수 호출의 반환 값

- lppe : 읽어온 프로세스의 정보를 저장할 PROCESSENTRY32 구조체 변수의 주소


typedef struct tagPROCESSENTRY32 {


  DWORD     dwSize;    // 구조체의 크기


  DWORD     cntUsage;    // 사용하지 않음, 0으로 설정


  DWORD     th32ProcessID;    // 프로세스 식별자


  ULONG_PTR th32DefaultHeapID;    //  사용하지 않음, 0으로 설정


  DWORD     th32ModuleID;    // 사용하지 않음, 0으로 설정


  DWORD     cntThreads;    // 프로세스의 스레드 개수


  DWORD     th32ParentProcessID;    // 부모 프로세스 식별자


  LONG      pcPriClassBase;    // 프로세스의 기본 우선 순위


  DWORD     dwFlags;    // 사용하지 않음, 0으로 설정


  TCHAR     szExeFile[MAX_PATH];    // 프로세스의 실행 파일 이름


} PROCESSENTRY32, *PPROCESSENTRY32;



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

SetPrivilege 함수 설명


+ Recent posts