- 프로세스 핸들 관련 설명
------------------------------------------------------------------------------
프로세스의 핸들을 얻어올 때 사용하는 함수
HANDLE WINAPI OpenProcess(
_In_ DWORD dwDesiredAccess,
_In_ BOOL bInheritHandle,
_In_ DWORD dwProcessId
);
성공시 지정한 프로세스의 핸들이 리턴
실패시 NULL 리턴
- dwDesiredAccess : 핸들을 얻어 접근 하고자 하는 프로세스의 접근 권한을 설정 한다.
(함수를 호출한 프로세스가 아닌 다른 프로세스의 전체 접근 권한을 지닌 핸들을 구하고자 할 때는
SeDebugPrivilege 특권을 활성화 시켜야 한다.)
- bInheritHandle : 핸들의 상속 여부를 지정 (TRUE : 상속, FLASE : 비상속)
- dwProcessId : 핸들을 얻고자 하는 프로세스의 ID를 지정
(함수를 호출한 프로세스 자신의 PID를 얻고자 할 때는
GetCurrentProcessId 함수를 사용한다.)
------------------------------------------------------------------------------------------------------------------------------------------------------------
http://choiwoo.tistory.com/5
출처
다른 프로세스의 가상메모리를 확보할때 사용
LPVOID VirtualAllocEx(
HANDLE hProcess,
LPVOID lpAddress,
DWORD dwSize,
DWORD FlAllocationType,
DWORD FlProtect
);
- hProcess : 대상 핸들
- lpAddress : 할당받을 주소 (NULL 입력시 자동으로 비어있는 주소 할당)
- dwSize : 할당받을 메모리의 크기 (NULL 입력시 하나의 페이지 크기를 할당)
- FlAllocationType : 메모리를 Reserve 아니면 Commit -> MEM_RESERVE, MEM_COMMIT
----------------------------------------------------------------------------------------------------------------
할당받은 메모리에 쓰기를 할때 사용
BOOL WINAPI WriteProcessMemory(
HANDLE hProcess,
LPVOID ipBaseAddress,
LPVOID lpBuffer,
SIZE_T nSize,
SIZE_T *lpNumberOfBytesWritten
)
- hProcess : 프로세스 핸들정보
- ipBaseAddress : VirtualAllocEx ()를 통해 얻은 메모리 주소위치
- lpBuffer : DLL 경로
- nSize : DLL 경로 문자열 길이 + NULL
- *lpNumberOfBytesWritten : 대상 프로세스 전달된 문자열 길이(? 무슨말인지)
----------------------------------------------------------------------------------------------------------------
모듈의 핸들 얻을때 사용하는 함수
HMODULE WINAPI GetModuleHandle( _In_opt_ LPCTSTR lpModuleName)
- lpModuleName : 얻고자 하는 핸들의 이름
----------------------------------------------------------------------------------------------------------------
함수의 주소를 얻어 올때 사용하는 함수
성공시 함수의 주소 리턴 실패시 ?
FARPROC GetProcAddress(
HMODULE hModule,
LPCSTR lpProcName
);
- hModule : 찾고자 하는 함수를 가진 모듈의 핸들값
- lpProcName : 찾고자 하는 함수 이름
----------------------------------------------------------------------------------------------------------------
다른 프로세스에 스레드를 생성할때 사용하는 함수
HANDLE WINAPI CreateRemoteThread (
__in HANDLE hProcess,
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out LPDWORD lpThreadID
);
- hProcess : 스레드가 생성될 프로세스의 핸들
- lpThreadAttributes : 스레드핸들을 자식 프로세스에게 상속할수있는지 여부(NULL 설정시 상속되지않음)
- dwStackSize : 스레드의 스택크기
- lpStartAddress : 스레드 함수 주소
- lpParameter : 스레드 파라미터 주소
- dwCreationFlags : 스레드가 시작되는 방식 지정 (0 : 바로 실행, 0x00000004 : 잠시 중지)
- lpThreadID : 생성될 스레드의 아이디 전달
----------------------------------------------------------------------------------------------------------------
http://artisticbit.tistory.com/…/WaitForSingleObject-%ED%95…
커널 오브젝트의 Signaled, Non-Signaled 상태 설명
https://www.joinc.co.kr/w/man/4100/WaitForsingleObject
함수에 관한 자세한 설명
지정된 객체가 시그널상태가 될때까지 혹은 비시그널 상태로 제한시간 까지 기다릴때사용하는 함수
성공시
WAIT_ABANDONED ( 지정된 객체가 파기된 뮤텍스 객체다.
뮤텍스를 소유한 쓰레드가 뮤텍스 객체의 소유권을 되돌려주지 않고 종료했다.
그래서 뮤텍스 객체의 소유권이 호출한 쓰레드로 옮겨졌으며, 뮤텍스는 비시그널 상태가 되었다.)
WAIT_OBJECT_0 ( 지정한 객체에 시그널 상태다.)
WAIT_TIMEOUT 리턴 ( 제한시간이 지날 때 까지 시그널 상태가 되지 않았다.)
DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
);
- hHandle : 기다릴 객체의 핸들
- dwMilliseconds : 제한시간을 밀리초 단위로 지정(0 : 객체의 상태를 확인하고 바로 반환, INFINITE : 시그널이 도착할때 까지 기다린다.)
'Reversing(리버싱 핵심 원리) > 공부 자료(정리x)' 카테고리의 다른 글
DLL Injection(레지스트리 수정) p331 (0) | 2018.06.23 |
---|---|
DLL Ejection p339 (0) | 2018.06.23 |
Dll Injection 공부 (0) | 2018.06.19 |
Windows 메시지 후킹 공부 (0) | 2018.06.19 |