/*----------------------------------------------------------------------------- * ArmorKit.h *----------------------------------------------------------------------------- * ArmorKit ¶óÀ̺귯·¯ Çì´õ ÆÄÀÏ * ÃÖÃÊ ÀÛ¼º : ¼­½ÂÇö (truefroggie@gmail.com , shseo@webzen.co.kr) * 2005.11.16 ³ë¿ëȯ * - ÇÁ·ÎÁ§Æ® ±¸¼º ¹Ù²Ù¸é¼­ Çì´õÆÄÀϵµ ÇÔ²² Á¤¸®ÇÔ (¾çÀÌ ¸¹¾Æ ¾î¶²°É Á¤¸®ÇÑÁö Àß ¸ð¸§ ^_^) *----------------------------------------------------------------------------- * Copyright (c) , 2005, WEBZEN Inc. * All rights reserved. * * Author : Noh Yong Hwan, 2005, WEBZEN Inc. Research & Development Dept. * fixbrain@gmail.com , somma@webzen.co.kr **---------------------------------------------------------------------------*/ #ifndef _ARMOR_KIT_H_ #define _ARMOR_KIT_H_ /*----------------------------------------------------------------------------- * ArmorKit ¹öÀü Á¤º¸ **---------------------------------------------------------------------------*/ #define AKVERSION_MJ_HIGH 1 #define AKVERSION_MJ_LOW 3 #define AKVERSION_MN_HIGH 0 #define AKVERSION_MN_LOW 4 /*----------------------------------------------------------------------------- * ArmorKit ½ÇÇà ¸ðµå **---------------------------------------------------------------------------*/ #define AKMODE_ONCE 1 #define AKMODE_TIMER 2 #define AKMODE_DAEMON 3 #define AKMODE_LOOP 4 /*----------------------------------------------------------------------------- * SUN online ¿¡¼­ »ç¿ë°¡´ÉÇÑ Àü¼Û ¹öÆÛÀÇ ÃÖ´ë Å©±â (fixed size) **---------------------------------------------------------------------------*/ #define SUN_BUF_SIZE 1024 /*----------------------------------------------------------------------------- * ŽÁö½Ã°£ (DWORD), ¹Ð¸®¼¼ÄÁ (¸ðµå°¡ AKMODE_TIMER ÀÎ °æ¿ì) **---------------------------------------------------------------------------*/ #define AKTIME_DEFAULT 30000 // 30ÃÊ (DEFAULT) #define AKTIME_NORMAL 60000 // 1ºÐ #define AKTIME_LONG 300000 // 5ºÐ #define AKTIME_LONGLONG 60000*10 // 10ºÐ // ArmorKits ŸÀÌ¸Ó ¾ÆÀ̵ð // #define AKIDT_TIMER0 10001 /*----------------------------------------------------------------------------- * ŽÁöÇ÷¡±× (DWORD) - Ç÷¡±×¿¡ µû¶ó ÇØ´ç ±â´É ¼öÇà **---------------------------------------------------------------------------*/ // ½ºÇǵåÇ٠ŽÁö #define AKCHECK_SPEEDHACK 0x00000001 // Malware ŽÁö #define AKCHECK_MALWARE 0x00000002 // °ÔÀÓ¹ÙÀ̳ʸ®º¯Á¶ #define AKCHECK_PEINTEGRITY 0x00000004 // ¾Æ¸ÓŶ º¯Á¶ #define AKCHECK_AKINTEGRITY 0x00000008 // µð¹ö±× »óÅÂŽÁö #define AKCHECK_DEBUG 0x00000010 // ¸Þ¸ð¸®Á¶ÀÛ #define AKCHECK_MEMEDIT 0x00000020 // Àǽɰ¡´Â S/W ŽÁö #define AKCHECK_DOUBT 0x00000040 // ·±Å¸ÀÓ ÄÚµå º¯Á¶¸¦ ŽÁö #define AKCHECK_RUNCODE 0x00000080 // °ÔÀÓÇÔ¼öº¯Á¶ #define AKCHECK_IAT_HOOK 0x00000100 #define AKCHECK_EAT_HOOK 0x00000200 // ¸ðµÎüũ #define AKCHECK_ALL AKCHECK_SPEEDHACK | \ AKCHECK_MALWARE | \ AKCHECK_PEINTEGRITY | \ AKCHECK_AKINTEGRITY | \ AKCHECK_DEBUG | \ AKCHECK_MEMEDIT | \ AKCHECK_DOUBT | \ AKCHECK_RUNCODE| \ AKCHECK_IAT_HOOK| \ AKCHECK_EAT_HOOK /*----------------------------------------------------------------------------- * ArmorKit »ç¿ëÀÚ Á¤ÀÇ ÇÁ·Î½ÃÁ® °á°ú°ª Á¤ÀÇ (HackType) **---------------------------------------------------------------------------*/ // ArmorKit ³»ºÎ ¿¡·¯ ¹ß»ý #define AKRUNTIME_ERROR -1 // ½ºÇǵåÇ٠ŽÁö #define AKDETECT_SPEEDHACK 1 // Malware ŽÁö #define AKDETECT_MALWARE 2 // °ÔÀÓ¹ÙÀ̳ʸ®º¯Á¶ // ÀÌ ÀÎÁõÀ» ÇÏ·Á¸é VC ÄÄÆÄÀÏ·¯ÀÇ Linker ¿É¼Ç¿¡ /RELEASE °¡ Ãß°¡µÇ¾î¾ß ÇÑ´Ù. // ÁÖ¾îÁø È­ÀÏÀÇ Ã½¼¶À» °è»êÇÑ´Ù. #define AKDETECT_PEINTEGRITY 3 // °ÔÀÓÇÔ¼öº¯Á¶ #define AKDETECT_APIHOOK 4 // ¾Æ¸ÓŶ º¯Á¶ #define AKDETECT_AKINTEGRITY 5 // µð¹ö±× »óÅÂŽÁö #define AKDETECT_DEBUG 6 // ¸Þ¸ð¸®Á¶ÀÛ #define AKDETECT_MEMEDIT 7 // Àǽɰ¡´Â S/W ŽÁö #define AKDETECT_DOUBT 8 // ·±Å¸ÀÓ Äڵ庯Á¶¸¦ ŽÁö #define AKDETECT_RUNCODE 9 // API Hook ŽÁö by HOOKDefender // #define AKDETECT_HOOK_DETECT 10 // API Hook º¹¿ø ½ÇÆÐ by HOOKDefender // #define AKDETECT_HOOK_RESTORE_FAIL 11 // touch service #define AKDETECT_TOUCH 100 // // ŽÁöÇÑ ÇØÅ·¿¡ ´ëÇÑ Á¤º¸¸¦ ³Ñ°ÜÁÖ´Â ±¸Á¶Ã¼ // -- wops ¿¬µ¿¿¡ ÇÊ¿äÇÑ ±¸Á¶Ã¼ÀÓ // typedef struct _HACK_DETECT_INFO { INT HackType; // ŽÁöÇÑ ÇØÅ· ŸÀÔ (e.g. AKDETECT_SPEEDHACK) INT Size; // Buffer ÀÇ ±æÀÌ LPSTR Buf; // µ¥ÀÌÅÍ ¹öÆÛ } HACK_DETECT_INFO, *PHACK_DETECT_INFO; /*----------------------------------------------------------------------------- * Malicious S/W ÀÇ Å¸ÀÔ **---------------------------------------------------------------------------*/ // Ű·Î°Å·ù #define TYPE_KEYLOGER 1 // ¸Þ¸ð¸®¿¡µðÅÍ #define TYPE_MEMEDITOR 2 // µð¹ö°Å #define TYPE_DEBUGGER 3 // ¿ÀÅ丶¿ì½º #define TYPE_AUTOMOUSE 4 // ½ºÇǵåÇÙ #define TYPE_SPEEDHACK 5 // ±âŸ, ¹ÌºÐ·ù #define TYPE_UNKNOWN 99 /*----------------------------------------------------------------------------- * ¿¡·¯ ÄÚµå Á¤ÀÇ **---------------------------------------------------------------------------*/ // 2006. 07. 03 »èÁ¦´ë»óÀÓ AKError.h·Î ¿Å°ÜÁÖ»ï #define AKERROR_INIT_FAIL -1 #define AKERROR_GENERAL_APIFAIL -2 // Windows APIÇÔ¼ö È£ÃâÀÌ ½ÇÆÐÇßÀ½ #define AKERROR_SET_PRIVILEGE -11 // ÇÁ·Î¼¼½º¸¦ ½ºÄµÇϱâ À§ÇØ ±ÇÇÑ »ó½Â¿¡ ½ÇÆÐÇÏ¿´À½, // °ü¸®ÀÚ±ÇÇÑÀ¸·Î ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ´Â °ÍÀÌ ¿ä±¸µÊ #define AKERROR_INIT_INVALID_HANDLE -13 // ÃʱâÈ­º¯¼öÀÇ HWND °¡ À¯È¿ÇÏÁö ¾ÊÀ½ #define AKERROR_PECHKSUM_ZERO -14 // PEÇì´õÀÇ Ã¼Å©¼¶ÀÌ 0ÀÔ´Ï´Ù. #define AKERROR_FILEFROMID_GETFAIL -16 // ID·Î ºÎÅÍ È­ÀÏÀ» °¡Á®¿À´Âµ¥ ½ÇÆÐÇß½À´Ï´Ù. #ifndef ret_true #define ret_true 1 // ¸®ÅÏÄÚµå : ¼º°ø #endif #ifndef ret_false #define ret_false 0 // ÇÔ¼ö°¡ ½ÇÆÐÇϰųª °á°ú°ªÀÌ ¾øÀ½ #endif /*----------------------------------------------------------------------------- * ÀÚ·á ±¸Á¶ Á¤ÀÇ **---------------------------------------------------------------------------*/ // µð¹ö±×üũ¸¦ À§ÇÑ ÀڷᱸÁ¶ typedef struct _ANTI_DEBUG_CHECK_INFO { // °Ë»ç ¹æ¹ý ÁöÁ¤ BOOL bSpecificAPI; // Ưº°ÇÑ API µéÀ» »ç¿ëÇÑ Å½Áö BOOL bProcessInfo; // ÇÁ·Î¼¼½º Á¤º¸¿¡ ÀÇÇÑ Å½Áö BOOL bParentProcessInfo; // ºÎ¸ð ÇÁ·Î¼¼½º Á¤º¸¸¦ ÅëÇÑ Å½Áö BOOL bActiveDevices; // Soft-Ice ·ùÀÇ Æ¯Á¤ µð¹ÙÀ̽º Ȱ¼ºÈ­ ¿©ºÎ¿¡ ÀÇÇÑ Å½Áö BOOL bSEH; // SEH ¿¡ ÀÇÇÑ Å½Áö // °Ë»ç °á°ú°ª INT bResSpecificAPI; // Ưº°ÇÑ API µéÀ» »ç¿ëÇÑ Å½Áö °á°ú INT bResProcessInfo; // ÇÁ·Î¼¼½º Á¤º¸¿¡ ÀÇÇÑ Å½Áö °á°ú INT bResParentProcessInfo; // ºÎ¸ð ÇÁ·Î¼¼½º Á¤º¸¸¦ ÅëÇÑ Å½Áö °á°ú INT bResActiveDevices; // Soft-Ice ·ùÀÇ Æ¯Á¤ µð¹ÙÀ̽º Ȱ¼ºÈ­ ¿©ºÎ¿¡ ÀÇÇÑ Å½Áö °á°ú INT bResSEH; // SEH ¿¡ ÀÇÇÑ Å½Áö °á°ú } ANTI_DEBUG_CHECK_INFO, *PANTI_DEBUG_CHECK_INFO; // PE üũ¼¶À» À§ÇÑ ÀڷᱸÁ¶ typedef struct _PE_CHECKSUM_INFO { DWORD HeaderSum; // PE Çì´õÀÇ Ã¼Å©¼¶ DWORD CalcSum ; // °è»êµÈ üũ¼¶ (HeaderSum °úÀÇ ºñ±³´ë»ó°ª) } PE_CHECKSUM_INFO, *PPE_CHECKSUM_INFO; // ½ºÇǵåÇ٠üũ¸¦ À§ÇÑ ÀڷᱸÁ¶ typedef struct _SPEED_HACK_CHECK_INFO { DWORD dwTGT; // TimeGetTime() DWORD dwGTC; // GetTickCount() DWORD dwTSC; // RDTSC DWORD dwQPC; // QueryPerformanceCounter() } SPEED_HACK_CHECK_INFO, *PSPEED_HACK_CHECK_INFO; // ÇØ½¬°ª üũ¸¦ À§ÇÑ ÀڷᱸÁ¶ typedef struct _PE_HASH_INFO { DWORD HeaderSum; // PE Çì´õÀÇ Ã¼Å©¼¶ BYTE HashBytes[256]; // ÇØ½¬ ½ºÆ®¸µ DWORD HashLen ; } PE_HASH_INFO, *PPE_HASH_INFO; // ÇÁ·Î¼¼½º ½ºÄµÀ» À§ÇÑ ÀڷᱸÁ¶ typedef struct _PROCESS_SCAN_INFO { /// ÇÁ·Î¼¼½º Á¤º¸ TCHAR ProcessName[MAX_PATH + 1]; DWORD ProcessId; /// signature Á¤º¸ DWORD SignatureIndex; DWORD SianatureType; TCHAR SignatureName[MAX_PATH + 1]; // ½ºÆ®¸µÀº ³Î Å͹̳×ÀÌÆ®¸¦ º¸ÀåÇØ¾ßÇÔ } PROCESS_SCAN_INFO, *PPROCESS_SCAN_INFO; /*----------------------------------------------------------------------------- * checkspeedhack Çì´õ **---------------------------------------------------------------------------*/ // tick ŸÀ̸Ӱ¡ 10ÃÊÀÌ»ó Â÷À̳ª¸é ÀÌ»óÀ¸·Î °£ÁÖÇÏ°í º¸°í #define MAX_TICK_ELAPSE 10 // SYSTEM_POWER_STATUS ÀÇ ACÆÄ¿ö°ü·Ã Á¤ÀÇ #define AC_OFFLINE 0 #define AC_ONLINE 1 // ¹Ð¸®¼¼ÄÁµå ´ÜÀ§ #define UNIT_MILISECOND 1000 // ¹Ð¸®¼¼ÄÁµå Ŭ·° ÃøÁ¤´ÜÀ§ #define UNIT_CLOCKGAP 10 // ¹Ð¸® ¼¼ÄÁµå ÇѰèÂ÷ÀÌ #define VAL_ELAPSE 50 // QueryPerformanceFreqeuncy °ªµé #define FREQ_WIN98 1193000 #define FREQ_WINNT 3579545 #define FREQ_WINXP // 3579545 or CPU Clock #define FREQ_WIN2000 3579545 INT CheckSpeedHack( IN PSPEED_HACK_CHECK_INFO, IN DWORD MaxTickElapse ); /*----------------------------------------------------------------------------- * scanproc Çì´õ **---------------------------------------------------------------------------*/ #define MAX_SCANBUFF 256 // µð¹ö±ëÀ» À§ÇÑ °¡ºñÁö ij¸¯ÅÍ #define bGarbage '\xCC' #define MAX_SIGLEN 256 // Malicious S/W ¸¦ ŽÁöÇϱâ À§ÇÑ Å½Áö½Ã±×´ÏÃÄ ( runtime processÀÇ memory based ) // typedef struct _PROC_SIGNATURE { INT dwIdx; // signature¡¯s unique number DWORD ntype; // signature 's type TCHAR lptszSigName[MAX_SIGLEN]; // signature name DWORD dwOffset; // ÇÁ·Î¼¼½º»ó¿¡¼­ÀÇ signature ÀÇ offset (from Image base address) DWORD dwSigLen; // lpszSignature length TCHAR lpszSignature[MAX_SIGLEN * 2]; // ½ÇÁ¦ signature } PROC_SIGNATURE , *PPROC_SIGNATURE; /* * example * * * PROC_SIGNATURE procsigs[] = { * { 1, TYPE_MEMEDIT, "tsearch.exe", "Tsearch 1.6", 0x4000ff32 , 21, "TSEARCH 1.6 ", NULL } , * { 2, TYPE_MEMEDIT, "cheatengine.exe", "Cheat Engine 4.4", 0x3224241 , 22, "Cheat Engine 4.4", NULL } , * ... , ... * { -1, 0, NULL , 0, 0, NULL, NULL } * } ; */ // ScanDoubtProcessList() ¿¡¼­ »ç¿ëµÇ´Â ÀǽɵǴ ÇÔ¼ö¸¦ ã¾Æ³»±â À§ÇÑ ÀڷᱸÁ¶ // typedef struct _PROC_DOUBTAPI { TCHAR *lptszFuncName ; TCHAR *lptszDllName ; DWORD Reserved ; } PROC_DOUBTAPI, *PPROC_DOUBTAPI ; // ÇÁ·Î¼¼½º ½ºÄµÀ» À§ÇÑ Äݹé ÇÔ¼ö // //typedef BOOL (*lpfnProcessScanCB) (PPROCESS_SCAN_INFO pPSI, PVOID pTag); //INT ScanProcessList( lpfnProcessScanCB pfnPSCB, PVOID pTag ) ; INT ScanProcessList( PPROCESS_SCAN_INFO pPSI ); // °ÔÀÓ ÇÁ·Î¼¼½ºÀÇ ¸ðµâÀ» üũ INT CheckProxyDll(PBOOL pbResult, PPROCESS_SCAN_INFO pPSI); /*----------------------------------------------------------------------------- * AntiHook °ü·Ã * * HOOKED_API_INFO.API_TYPE ÀÌ 0 ÀÎ °æ¿ì HEA ±¸Á¶Ã¼ ÂüÁ¶ * 1 ÀÎ °æ¿ì HIA ±¸Á¶Ã¼ ÂüÁ¶ **---------------------------------------------------------------------------*/ /** ----------------------------------------------------------------------- HOOKED_API_INFO.API_TYPE == AT_EXPORTED ÀÎ °æ¿ì »ç¿ëµÇ´Â ±¸Á¶Ã¼ EXPORT API ÈÄÅ·ÀÌ Å½Áö °æ¿ì jmp Äڵ带 »ç¿ëÇÏ´Â °æ¿ì EXPORTED_API_INFO.ReadAddressOfApi °ªÀ» ÅëÇØ ŽÁöÇϹǷΠOriginalAddr, HookdAddr Àº EXPORTED_API_INFO.ReadAddressOfApi °ªÀÌ´Ù. -------------------------------------------------------------------------*/ typedef struct _HOOKED_EXPORT_API { INT HOOKED_CODE; // hooking ŸÀÔ(inline? address modify, ...) TCHAR DLLName[MAX_PATH]; TCHAR ApiName[MAX_PATH]; DWORD_PTR OriginalAddr; // hook µÇÁö ¾ÊÀº ¿ø·¡ÀÇ api ÀÇ ÁÖ¼Ò DWORD_PTR HookdAddr; // hooking µÈ ÇöÀçÀÇ api ÁÖ¼Ò } HOOKED_EXPORT_API, *PHOOKED_EXPORT_API; typedef BOOL (*lpfnHookedApiCB) (PHOOKED_EXPORT_API pHooked_API, PVOID pTag); /** ----------------------------------------------------------------------- HOOKED_API_INFO.API_TYPE == AT_IMPORTED ÀÎ °æ¿ì »ç¿ëµÇ´Â ±¸Á¶Ã¼ IMPORT API ÈÄÅ·ÀÌ Å½Áö °æ¿ì -------------------------------------------------------------------------*/ typedef struct _HOOKED_IMPORT_API { INT HOOKED_CODE; // hooking ŸÀÔ(inline? address modify, ...) TCHAR DLLName[_MAX_PATH]; TCHAR ApiName[MAX_PATH]; DWORD_PTR HookdAddr; // hooking µÈ ÇöÀçÀÇ api ÁÖ¼Ò DWORD_PTR DetourAddr; // jmp ÇÒ °÷ÀÇ ÁÖ¼Ò (INLINE HOOKING ŸÀÔÀÎ °æ¿ì¸¸ À¯È¿) DWORD_PTR dwStart; DWORD_PTR dwEnd; } HOOKED_IMPORT_API, *PHOOKED_IMPORT_API; typedef BOOL (*lpfnHookedImportApiCB) (PHOOKED_IMPORT_API pHookedImportApi, PVOID pTag); /** ----------------------------------------------------------------------- HOOKED_API_INFO.API_TYPE == AT_INTEGRITY ÀÎ °æ¿ì »ç¿ëµÇ´Â ±¸Á¶Ã¼ ¿ø·¡ÀÇ ÀÓÆ÷Æ® ¸ðµâ°¹¼ö¿Í ÇöÀçÀÇ ÀÓÆ÷Æ® ¸ðµâ °¹¼ö°¡ ´Ù¸¥ °æ¿ì¸¦ ŽÁö -------------------------------------------------------------------------*/ typedef struct _IMP_MOD_INTEGRITY { INT OrgImpModCount; INT CurImpModCount; } IMP_MOD_INTEGRITY, *PIMP_MOD_INTEGRITY; typedef union _UAPI_INFO { HOOKED_EXPORT_API HEA; // if (API_TYPE == AT_EXPORTED) HOOKED_IMPORT_API HIA; // if (API_TYPE == AT_IMPORTED) IMP_MOD_INTEGRITY IMI; // if (API_TYPE == AT_INTEGRITY) } UAPI_INFO; // API_TYPE Á¤ÀÇ // #define AT_EXPORTED 0 // exported api #define AT_IMPORTED 1 // imported api #define AT_INTEGRITY 2 // IAT ÀÇ º¯°æ À¯¹« °Ë»ç // ÄݹéÇÔ¼ö·Î ³Ñ±â´Â ÃÖÁ¾ ±¸Á¶Ã¼ // typedef struct _HOOKED_API_INFO { INT API_TYPE; // 0: EXPORTED API, 1: IMPORTED API, 2: AT_INTEGRITY UAPI_INFO API_INFO; } HOOKED_API_INFO, *PHOOKED_API_INFO; // API ¸®Åϰª // #define RETCODE_LIB_SUCCESS 0 // ¼º°ø #define RETCODE_LIB_ERROR -1 // ½ÇÆÐ // ÈÄÅ· üũÇÔ¼ö ¸®Åϰª // #define RETCODE_NOT_HOOKED 0 // ÈÄÅ·µÈ API °¡ ¾øÀ½ #define RETCODE_API_HOOKED 1 // API ÈÄÅ·ÀÌ Å½ÁöµÇ¾úÀ½ // HOOKED_CODE Á¤ÀÇ // // AT_EXPORTED ÀÎ °æ¿ì // #define AH_EAT_MODIFIED RETCODE_API_HOOKED // EAT ÁÖ¼Ò°ª º¯Á¶ ŽÁö #define AH_EAT_INLINE_HOOKED -2 // EAT ÀζóÀÎ ÈÄÅ· ŽÁö #define AH_EAT_COUNT_ERROR -3 // Disk ¿Í VAS »óÀÇ Export µÈ api Ä«¿îÆ®°¡ ´Ù¸§ #define AH_EAT_COUNT_ZERO -4 // Export µÈ api °¡ ¾ø´Ù ! (ÀÌ·± °æ¿ì°¡ »ý±æ¼ø ¾ø´Ù. ) // AT_IMPORTED ÀÎ °æ¿ì // #define AH_IAT_MODIFIED RETCODE_API_HOOKED // IAT ÁÖ¼Ò°ª º¯Á¶ ŽÁöµÊ #define AH_IAT_INLINE_HOOKED -6 // IAT ÀζóÀÎ ÈÄÅ· ŽÁö /** ----------------------------------------------------------------------- \brief touch service À϶§ touch °á°ú°ªÀ» ¸®ÅÏ -------------------------------------------------------------------------*/ int GetTouchValue(int seed); /** ----------------------------------------------------------------------- \brief ¿¡·¯¸Þ¼¼Áö ¹®ÀÚ¿­ ¸®ÅÏ -------------------------------------------------------------------------*/ LPCTSTR GetErrorString(void); /////////////////////////////////////////////////////////////////////////////// // °øÅë »ó¼ö Á¤ÀÇ // AkCommon.h ¿Í Áߺ¹µÊ /////////////////////////////////////////////////////////////////////////////// // ÆÄÀÏÀ̸§, °æ·Î¿¡ °üÇÑ »ó¼ö Á¤ÀÇ // from stdlib.h // #ifndef _INC_STDLIB // stdlib.h #define _MAX_PATH 260 /* max. length of full pathname */ #define _MAX_DRIVE 3 /* max. length of drive component */ #define _MAX_DIR 256 /* max. length of path component */ #define _MAX_FNAME 256 /* max. length of file name component */ #define _MAX_EXT 256 /* max. length of extension component */ #endif #ifndef _MAX_API_NAME #define _MAX_API_NAME 256 /* max length of api name */ #endif #ifndef _MAX_FORWARDER_NAME #define _MAX_FORWARDER_NAME _MAX_FNAME * 2 // ±×³É ³Ë³ËÇÏ°Ô Àâ¾Ò´Ù. -_- #endif #ifndef _OPCODE_DUMP_LENGTH #ifdef _DEBUG #define _OPCODE_DUMP_LENGTH 32 /* API ÀÇ ±¸ÇöºÎ ´ýÇÁ ±æÀÌ */ #else #define _OPCODE_DUMP_LENGTH 16 /* API ÀÇ ±¸ÇöºÎ ´ýÇÁ ±æÀÌ */ #endif #endif #ifndef _OPCODE_DUMP_BUF_LENGTH #define _OPCODE_DUMP_BUF_LENGTH ( (_OPCODE_DUMP_LENGTH * 2 ) + sizeof(TCHAR) ) /* API ÀÇ ±¸ÇöºÎ ´ýÇÁ¸¦ º¸°üÇÒ ¹öÆÛÀÇ ±æÀÌ */ #endif #ifndef MAX_SIG_NAME #define MAX_SIG_NAME 255 #endif /////////////////////////////////////////////////////////////////////////////// // HDCommon.h /////////////////////////////////////////////////////////////////////////////// #ifndef _HOOK_DEFENDER_COMMON_H_ #define _HOOK_DEFENDER_COMMON_H_ // // ¿¡·¯ ÄÚµå Á¤ÀÇ // #define HDERR_NONE 0 // ¿À·ù ¾øÀ½ #define HDERR_GENERIC -1 // ÀÏ¹Ý ÀûÀÎ ¿À·ù (SetErrorString() À¸·Î ¿À·ù Á¤º¸ ¼³Á¤) #define HDERR_IAT_RESTORE -2 // IMPORT TABLE º¹¿ø ½ÇÆÐ #define HDERR_EAT_RESTORE -3 // EXPORT TABLE º¹¿ø ½ÇÆÐ #define HDERR_INVALID_PE -4 // Á¤»óÀûÀÎ PE ÆÄÀÏÀÌ ¾Æ´Ô #define HDERR_NO_API_FOUNDED -5 // API ¸¦ PE ·ÎºÎÅÍ Ã£À» ¼ö ¾øÀ½ #define HDERR_INVALID_ADDRESS -6 // VirtualProtect() ¶Ç´Â ÇØ´ç ¸Þ¸ð¸® ¿¢¼¼½º°¡ ½ÇÆÐÇÑ °æ¿ì // // API Hook ŸÀÔ // typedef enum _ENUM_HOOK_TYPE { HT_NONE, HT_ENTRY_HOOK_INVALID_ADDR_IAT, // Entry point ¸¦ ¹Ù²ãÄ¡±â ÇÑ °æ¿ì(°¡Àå Àß ¾Ë·ÁÁø ¹æ½Ä) HT_ENTRY_HOOK_INVALID_ADDR_EAT, HT_ENTRY_HOOK_USE_CAVE_EAT, // cave (e.g. ÆÐµù ¿µ¿ª)¿¡ Á¡ÇÁ ÄÚµå »ðÀÔÈÄ entry ¸¦ ÇØ´ç cave ·Î ¹Ù²Ù´Â ±â¹ý HT_INLINE_HOOK_EAT // inline hook (a.k.a detours) } ENUM_HOOK_TYPE; // // API º¹¿øÀ» À§ÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â ±¸Á¶Ã¼ // // armorkit ¿¡¼­ callback À» ÅëÇØ¼­ ³Ñ°ÜÁØ HACK_DETECT_INFO.HackType ÀÌ // AKDETECT_HOOK_DETECT ÀÎ °æ¿ì »ç¿ëµÈ´À ±¸Á¶Ã¼ // (binary stream ÇüÅÂÀÇ ¹öÆÛ·Î Àü´ÞµÊ) // typedef struct _API_TO_RESTORE { ENUM_HOOK_TYPE HookType; TCHAR DLLName[_MAX_PATH]; INT Ordinal; // IAT ÈÅŽÁö½Ã API °¡ ¼­¼ö·Î import µÈ°æ¿ì »ç¿ëµÊ TCHAR ApiName[_MAX_API_NAME]; // IAT ÈÅŽÁö½Ã API °¡ À̸§À¸·Î import µÈ°æ¿ì »ç¿ëµÊ DWORD_PTR OriginalAddr; // hook µÇÁö ¾ÊÀº ¿ø·¡ÀÇ api ÀÇ ÁÖ¼Ò DWORD_PTR CurrentAddr; // hooking µÈ ÇöÀçÀÇ api ÁÖ¼Ò DWORD_PTR DetourAddr; // °è»êµÈ detour ÀÇ ÁÖ¼Ò TCHAR OriginalOpcodes[_OPCODE_DUMP_BUF_LENGTH]; TCHAR CurrentOpcodes[_OPCODE_DUMP_BUF_LENGTH]; TCHAR DetourAddrOpcodes[_OPCODE_DUMP_BUF_LENGTH]; // IAT ¿¡¼­´Â »ç¿ë¾ÈÇÔ. EAT ¿¡¼­¸¸ »ç¿ë DWORD_PTR ValidStartAddr; // dll ÀÇ À¯È¿ ½ÃÀÛ ÁÖ¼Ò DWORD_PTR ValidEndAddr; // dll ÀÇ À¯È¿ ³¡ ÁÖ¼Ò } API_TO_RESTORE, *PAPI_TO_RESTORE; // // API º¹¿ø¿¡ ½ÇÆÐÇÑ API ¿Í ÀÌ¿¡ ´ëÇÑ ¿¡·¯ Á¤º¸¸¦ ´ã±â À§ÇÑ ±¸Á¶Ã¼ // // armorkit ¿¡¼­ callback À» ÅëÇØ¼­ ³Ñ°ÜÁØ HACK_DETECT_INFO.HackType ÀÌ // AKDETECT_HOOK_RESTORE_FAIL ÀÎ °æ¿ì »ç¿ëµÇ´Â ±¸Á¶Ã¼ // (binary stream ÇüÅÂÀÇ ¹öÆÛ·Î Àü´ÞµÊ) // typedef struct _RESTORE_FAULT_API { INT ErrorCode; API_TO_RESTORE apiInfo; } RESTORE_FAULT_API, *PRESTORE_FAULT_API; #include typedef std::vector HOOKED_API_LIST; typedef std::vector HDFAULT_API_LIST; #endif // _HOOK_DEFENDER_COMMON_H_ #endif