■ CreateWaitableTimer API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
using Microsoft.Win32.SafeHandles; using System; using System.Runtime.InteropServices; #region 대기 가능한 타이머 생성하기 - CreateWaitableTimer(timerAttributeHandle, manualReset, timerName) /// <summary> /// 대기 가능한 타이머 생성하기 /// </summary> /// <param name="timerAttributeHandle">타이머 어트리뷰트 핸들</param> /// <param name="manualReset">수동 리셋 여부</param> /// <param name="timerName">타이머명</param> /// <returns>타이머 핸들</returns> [DllImport("kernel32")] private static extern SafeWaitHandle CreateWaitableTimer(IntPtr timerAttributeHandle, bool manualReset, string timerName); #endregion |
■ FreeLibrary API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
using System; using System.Runtime.InteropServices; #region 라이브러리 해제하기 - FreeLibrary(moduleHandle) /// <summary> /// 라이브러리 해제하기 /// </summary> /// <param name="moduleHandle">모듈 핸들</param> /// <returns>처리 결과</returns> [DllImport("kernel32", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool FreeLibrary(IntPtr moduleHandle); #endregion |
■ GetProcAddress API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
using System; using System.Runtime.InteropServices; #region 프로시저 주소 구하기 - GetProcAddress(moduleHandle, procedureName) /// <summary> /// 프로시저 주소 구하기 /// </summary> /// <param name="moduleHandle">모듈 핸들</param> /// <param name="procedureName">프로시저명</param> /// <returns>프로시저 핸들</returns> [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] private static extern IntPtr GetProcAddress(IntPtr moduleHandle, string procedureName); #endregion |
■ LoadLibrary API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System; using System.Runtime.InteropServices; #region 라이브러리 로드하기 - LoadLibrary(filePath) /// <summary> /// 라이브러리 로드하기 /// </summary> /// <param name="filePath">파일 경로</param> /// <returns>처리 결과</returns> [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] private static extern IntPtr LoadLibrary(string filePath); #endregion |
■ CreateRemoteThread API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
using System; using System.Runtime.InteropServices; #region 원격 스레드 생성하기 - CreateRemoteThread(processHandle, threadAttributeHandle, stackSize, startAddressHandle, parameter, creationFlag, threadID) /// <summary> /// 원격 스레드 생성하기 /// </summary> /// <param name="processHandle">프로세스 핸들</param> /// <param name="threadAttributeHandle">스레드 어트리뷰트</param> /// <param name="stackSize">스택 크기</param> /// <param name="startAddressHandle">시작 주소 핸들</param> /// <param name="parameter">매개 변수</param> /// <param name="creationFlag">생성 플래그</param> /// <param name="threadID">스레드 ID</param> /// <returns>스레드 핸들</returns> [DllImport("kernel32")] private static extern IntPtr CreateRemoteThread ( IntPtr processHandle, IntPtr threadAttributeHandle, uint stackSize, IntPtr startAddressHandle, IntPtr parameter, uint creationFlag, IntPtr threadID ); #endregion |
■ WriteProcessMemory API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
using System; using System.Runtime.InteropServices; #region 프로세스 메모리 쓰기 - WriteProcessMemory(processHandle, baseAddressHandle, bufferByteArray, size, byteCountWritten) /// <summary> /// 프로세스 메모리 쓰기 /// </summary> /// <param name="processHandle">프로세스 핸들</param> /// <param name="baseAddressHandle">베이스 주소 핸들</param> /// <param name="bufferByteArray">버퍼 바이트 배열</param> /// <param name="size">크기</param> /// <param name="byteCountWritten">쓴 바이트 수</param> /// <returns>처리 결과</returns> [DllImport("kernel32", SetLastError = true)] private static extern bool WriteProcessMemory ( IntPtr processHandle, IntPtr baseAddressHandle, byte[] bufferByteArray, uint size, out UIntPtr byteCountWritten ); #endregion |
■ VirtualAllocEx API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
using System; using System.Runtime.InteropServices; #region 가상 메모리 할당하기 (확장) - VirtualAllocEx(processHandle, addressHandle, size, allocationType, protect) /// <summary> /// 가상 메모리 할당하기 (확장) /// </summary> /// <param name="processHandle">프로세스 핸들</param> /// <param name="addressHandle">주소 핸들</param> /// <param name="size">크기</param> /// <param name="allocationType">할당 타입</param> /// <param name="protect">보호 여부</param> /// <returns>가상 메모리 핸들</returns> [DllImport("kernel32", SetLastError = true, ExactSpelling = true)] private static extern IntPtr VirtualAllocEx ( IntPtr processHandle, IntPtr addressHandle, uint size, uint allocationType, uint protect ); #endregion |
■ OpenProcess API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
using System; using System.Runtime.InteropServices; #region 프로세스 열기 - OpenProcess(desiredAccess, inheritHandle, processID) /// <summary> /// 프로세스 열기 /// </summary> /// <param name="desiredAccess">희망 액세스</param> /// <param name="inheritHandle">핸들 상속 여부</param> /// <param name="processID">프로세스 ID</param> /// <returns>프로세스 핸들</returns> [DllImport("kernel32")] private static extern IntPtr OpenProcess(int desiredAccess, bool inheritHandle, int processID); #endregion |
■ GetModuleHandle API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System; using System.Runtime.InteropServices; #region 모듈 핸들 구하기 - GetModuleHandle(moduleName) /// <summary> /// 모듈 핸들 구하기 /// </summary> /// <param name="moduleName">모듈명</param> /// <returns>모듈 핸들</returns> [DllImport("kernel32", CharSet = CharSet.Auto)] private static extern IntPtr GetModuleHandle(string moduleName); #endregion |
■ GetLastError API 함수를 선언하는 방법을 보여준다. ▶ 예제 코드 (C#)
|
using System.Runtime.InteropServices; #region 마지막 에러 코드 구하기 - GetLastError() /// <summary> /// 마지막 에러 코드 구하기 /// </summary> /// <returns>마지막 에러 코드</returns> [DllImport("kernel32")] private static extern uint GetLastError(); #endregion |