Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- #ifndef GUID_DEFINED
- #define GUID_DEFINED
- typedef struct _GUID
- {
- DWORD Data1;
- WORD Data2;
- WORD Data3;
- BYTE Data4[ 8 ];
- } GUID;
- #endif // !GUID_DEFINED
- #if defined(__cplusplus)
- #ifndef _REFGUID_DEFINED
- #define _REFGUID_DEFINED
- #define REFGUID const GUID &
- #endif // !_REFGUID_DEFINED
- #else // !__cplusplus
- #ifndef _REFGUID_DEFINED
- #define _REFGUID_DEFINED
- #define REFGUID const GUID * const
- #endif // !_REFGUID_DEFINED
- #endif // !__cplusplus
- //
- //////////////////////////////////////////////////////////////////////////////
- #ifdef __cplusplus
- extern "C" {
- #endif // __cplusplus
- /////////////////////////////////////////////////// Instruction Target Macros.
- //
- #define INSTRUCTION_TARGET_NONE ((PBYTE)0)
- #define INSTRUCTION_TARGET_DYNAMIC ((PBYTE)~0ul)
- /////////////////////////////////////////////////////////// Trampoline Macros.
- //
- // TRAMPOLINE(trampoline_prototype, target_name)
- //
- // The naked trampoline must be at least DETOUR_TRAMPOLINE_SIZE bytes.
- //
- #define TRAMPOLINE_SIZE 32
- #define SECTION_HEADER_SIGNATURE 0x00727444 // "Dtr\0"
- #define TRAMPOLINE(trampoline,target) \
- static PVOID __fastcall _Detours_GetVA_##target(VOID) \
- { \
- return ⌖ \
- } \
- \
- __declspec(naked) trampoline \
- { \
- __asm { nop };\
- __asm { nop };\
- __asm { call _Detours_GetVA_##target };\
- __asm { jmp eax };\
- __asm { ret };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- }
- #define TRAMPOLINE_EMPTY(trampoline) \
- __declspec(naked) trampoline \
- { \
- __asm { nop };\
- __asm { nop };\
- __asm { xor eax, eax };\
- __asm { mov eax, [eax] };\
- __asm { ret };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- __asm { nop };\
- }
- /////////////////////////////////////////////////////////// Binary Structures.
- //
- #pragma pack(push, 8)
- typedef struct _SECTION_HEADER
- {
- DWORD cbHeaderSize;
- DWORD nSignature;
- DWORD nDataOffset;
- DWORD cbDataSize;
- DWORD nOriginalImportVirtualAddress;
- DWORD nOriginalImportSize;
- DWORD nOriginalBoundImportVirtualAddress;
- DWORD nOriginalBoundImportSize;
- DWORD nOriginalIatVirtualAddress;
- DWORD nOriginalIatSize;
- DWORD nOriginalSizeOfImage;
- DWORD nReserve;
- } SECTION_HEADER, *PDETOUR_SECTION_HEADER;
- typedef struct _SECTION_RECORD
- {
- DWORD cbBytes;
- DWORD nReserved;
- GUID guid;
- } SECTION_RECORD, *PDETOUR_SECTION_RECORD;
- #pragma pack(pop)
- #define SECTION_HEADER_DECLARE(cbSectionSize) \
- { \
- sizeof(SECTION_HEADER),\
- SECTION_HEADER_SIGNATURE,\
- sizeof(SECTION_HEADER),\
- (cbSectionSize),\
- \
- 0,\
- 0,\
- 0,\
- 0,\
- \
- 0,\
- 0,\
- 0,\
- 0,\
- }
- ///////////////////////////////////////////////////////////// Binary Typedefs.
- //
- typedef BOOL (CALLBACK *PF_BINARY_BYWAY_CALLBACK)(PVOID pContext,
- PCHAR pszFile,
- PCHAR *ppszOutFile);
- typedef BOOL (CALLBACK *PF_BINARY_FILE_CALLBACK)(PVOID pContext,
- PCHAR pszOrigFile,
- PCHAR pszFile,
- PCHAR *ppszOutFile);
- typedef BOOL (CALLBACK *PF_BINARY_SYMBOL_CALLBACK)(PVOID pContext,
- DWORD nOrdinal,
- PCHAR pszOrigSymbol,
- PCHAR pszSymbol,
- PCHAR *ppszOutSymbol);
- typedef BOOL (CALLBACK *PF_BINARY_FINAL_CALLBACK)(PVOID pContext);
- typedef BOOL (CALLBACK *PF_BINARY_EXPORT_CALLBACK)(PVOID pContext,
- DWORD nOrdinal,
- PCHAR pszName,
- PBYTE pbCode);
- typedef VOID * PDETOUR_BINARY;
- typedef VOID * PDETOUR_LOADED_BINARY;
- //////////////////////////////////////////////////////// Trampoline Functions.
- //
- PBYTE WINAPI Function(PBYTE pbTargetFunction,
- PBYTE pbDetourFunction);
- BOOL WINAPI FunctionWithEmptyTrampoline(PBYTE pbTrampoline,
- PBYTE pbTarget,
- PBYTE pbDetour);
- BOOL WINAPI FunctionWithEmptyTrampolineEx(PBYTE pbTrampoline,
- PBYTE pbTarget,
- PBYTE pbDetour,
- PBYTE *ppbRealTrampoline,
- PBYTE *ppbRealTarget,
- PBYTE *ppbRealDetour);
- BOOL WINAPI FunctionWithTrampoline(PBYTE pbTrampoline,
- PBYTE pbDetour);
- BOOL WINAPI FunctionWithTrampolineEx(PBYTE pbTrampoline,
- PBYTE pbDetour,
- PBYTE *ppbRealTrampoline,
- PBYTE *ppbRealTarget);
- BOOL WINAPI Remove(PBYTE pbTrampoline, PBYTE pbDetour);
- ////////////////////////////////////////////////////////////// Code Functions.
- //
- PBYTE WINAPI FindFunction(PCHAR pszModule, PCHAR pszFunction);
- PBYTE WINAPI GetFinalCode(PBYTE pbCode, BOOL fSkipJmp);
- PBYTE WINAPI CopyInstruction(PBYTE pbDst, PBYTE pbSrc, PBYTE *ppbTarget);
- PBYTE WINAPI CopyInstructionEx(PBYTE pbDst,
- PBYTE pbSrc,
- PBYTE *ppbTarget,
- LONG *plExtra);
- ///////////////////////////////////////////////////// Loaded Binary Functions.
- //
- HMODULE WINAPI EnumerateModules(HMODULE hModuleLast);
- PBYTE WINAPI GetEntryPoint(HMODULE hModule);
- BOOL WINAPI EnumerateExports(HMODULE hModule,
- PVOID pContext,
- PF_BINARY_EXPORT_CALLBACK pfExport);
- PBYTE WINAPI FindPayload(HMODULE hModule, REFGUID rguid, DWORD *pcbData);
- DWORD WINAPI GetSizeOfPayloads(HMODULE hModule);
- ///////////////////////////////////////////////// Persistent Binary Functions.
- //
- BOOL WINAPI BinaryBindA(PCHAR pszFile, PCHAR pszDll, PCHAR pszPath);
- BOOL WINAPI BinaryBindW(PWCHAR pwzFile, PWCHAR pwzDll, PWCHAR pwzPath);
- #ifdef UNICODE
- #define BinaryBind DetourBinaryBindW
- #else
- #define BinaryBind DetourBinaryBindA
- #endif // !UNICODE
- PDETOUR_BINARY WINAPI BinaryOpen(HANDLE hFile);
- PBYTE WINAPI BinaryEnumeratePayloads(PDETOUR_BINARY pBinary,
- GUID *pGuid,
- DWORD *pcbData,
- DWORD *pnIterator);
- PBYTE WINAPI BinaryFindPayload(PDETOUR_BINARY pBinary,
- REFGUID rguid,
- DWORD *pcbData);
- PBYTE WINAPI BinarySetPayload(PDETOUR_BINARY pBinary,
- REFGUID rguid,
- PBYTE pbData,
- DWORD cbData);
- BOOL WINAPI BinaryDeletePayload(PDETOUR_BINARY pBinary, REFGUID rguid);
- BOOL WINAPI BinaryPurgePayloads(PDETOUR_BINARY pBinary);
- BOOL WINAPI BinaryResetImports(PDETOUR_BINARY pBinary);
- BOOL WINAPI BinaryEditImports(PDETOUR_BINARY pBinary,
- PVOID pContext,
- PF_BINARY_BYWAY_CALLBACK pfByway,
- PF_BINARY_FILE_CALLBACK pfFile,
- PF_BINARY_SYMBOL_CALLBACK pfSymbol,
- PF_DBINARY_FINAL_CALLBACK pfFinal);
- BOOL WINAPI BinaryWrite(PDETOUR_BINARY pBinary, HANDLE hFile);
- BOOL WINAPI BinaryClose(PDETOUR_BINARY pBinary);
- /////////////////////////////////////////////// First Chance Exception Filter.
- //
- LPTOP_LEVEL_EXCEPTION_FILTER WINAPI
- FirstChanceExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelFilter);
- ///////////////////////////////////////////////// Create Process & Inject Dll.
- //
- typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEA)
- (LPCSTR lpApplicationName,
- LPSTR lpCommandLine,
- LPSECURITY_ATTRIBUTES lpProcessAttributes,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- BOOL bInheritHandles,
- DWORD dwCreationFlags,
- LPVOID lpEnvironment,
- LPCSTR lpCurrentDirectory,
- LPSTARTUPINFOA lpStartupInfo,
- LPPROCESS_INFORMATION lpProcessInformation);
- typedef BOOL (WINAPI *PDETOUR_CREATE_PROCESS_ROUTINEW)
- (LPCWSTR lpApplicationName,
- LPWSTR lpCommandLine,
- LPSECURITY_ATTRIBUTES lpProcessAttributes,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- BOOL bInheritHandles,
- DWORD dwCreationFlags,
- LPVOID lpEnvironment,
- LPCWSTR lpCurrentDirectory,
- LPSTARTUPINFOW lpStartupInfo,
- LPPROCESS_INFORMATION lpProcessInformation);
- BOOL WINAPI CreateProcessWithDllA(LPCSTR lpApplicationName,
- LPSTR lpCommandLine,
- LPSECURITY_ATTRIBUTES lpProcessAttributes,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- BOOL bInheritHandles,
- DWORD dwCreationFlags,
- LPVOID lpEnvironment,
- LPCSTR lpCurrentDirectory,
- LPSTARTUPINFOA lpStartupInfo,
- LPPROCESS_INFORMATION lpProcessInformation,
- LPCSTR lpDllName,
- PDETOUR_CREATE_PROCESS_ROUTINEA
- pfCreateProcessA);
- BOOL WINAPI CreateProcessWithDllW(LPCWSTR lpApplicationName,
- LPWSTR lpCommandLine,
- LPSECURITY_ATTRIBUTES lpProcessAttributes,
- LPSECURITY_ATTRIBUTES lpThreadAttributes,
- BOOL bInheritHandles,
- DWORD dwCreationFlags,
- LPVOID lpEnvironment,
- LPCWSTR lpCurrentDirectory,
- LPSTARTUPINFOW lpStartupInfo,
- LPPROCESS_INFORMATION lpProcessInformation,
- LPCWSTR lpDllName,
- PDETOUR_CREATE_PROCESS_ROUTINEW
- pfCreateProcessW);
- #ifdef UNICODE
- #define CreateProcessWithDll DetourCreateProcessWithDllW
- #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEW
- #else
- #define CreateProcessWithDll DetourCreateProcessWithDllA
- #define PDETOUR_CREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINEA
- #endif // !UNICODE
- BOOL WINAPI ContinueProcessWithDllA(HANDLE hProcess, LPCSTR lpDllName);
- BOOL WINAPI ContinueProcessWithDllW(HANDLE hProcess, LPCWSTR lpDllName);
- #ifdef UNICODE
- #define ContinueProcessWithDll DetourContinueProcessWithDllW
- #else
- #define ContinueProcessWithDll DetourContinueProcessWithDllA
- #endif // !UNICODE
- //
- //////////////////////////////////////////////////////////////////////////////
- #ifdef __cplusplus
- }
- #endif // __cplusplus
- /////////////////////////////////////////////////////////////////// Old Names.
- //
- #define ContinueProcessWithDll ContinueProcessWithDll
- #define ContinueProcessWithDllA ContinueProcessWithDllA
- #define ContinueProcessWithDllW ContinueProcessWithDllW
- #define CreateProcessWithDll CreateProcessWithDll
- #define CreateProcessWithDllA CreateProcessWithDllA
- #define CreateProcessWithDllW CreateProcessWithDllW
- #define TRAMPOLINE_WO_TARGET TRAMPOLINE_EMPTY
- #define BinaryPurgePayload BinaryPurgePayloads
- #define EnumerateExportsForInstance EnumerateExports
- #define EnumerateInstances EnumerateModules
- #define FindEntryPointForInstance GetEntryPoint
- #define FindFinalCode GetFinalCode
- #define FindPayloadInBinary FindPayload
- #define GetSizeOfBinary GetSizeOfPayloads
- #define RemoveWithTrampoline Remove
- #define PCREATE_PROCESS_ROUTINE PDETOUR_CREATE_PROCESS_ROUTINE
- #define PCREATE_PROCESS_ROUTINEA PDETOUR_CREATE_PROCESS_ROUTINEA
- #define PCREATE_PROCESS_ROUTINEW PDETOUR_CREATE_PROCESS_ROUTINEW
- //
- //////////////////////////////////////////////// Detours Internal Definitions.
- //
- #ifdef __cplusplus
- #ifdef INTERNAL
- //////////////////////////////////////////////////////////////////////////////
- //
- #ifdef IMAGEAPI // defined by IMAGEHLP.H
- typedef LPAPI_VERSION (NTAPI *PF_ImagehlpApiVersionEx)(LPAPI_VERSION AppVersion);
- typedef BOOL (NTAPI *PF_SymInitialize)(IN HANDLE hProcess,
- IN LPSTR UserSearchPath,
- IN BOOL fInvadeProcess);
- typedef DWORD (NTAPI *PF_SymSetOptions)(IN DWORD SymOptions);
- typedef DWORD (NTAPI *PF_SymGetOptions)(VOID);
- typedef BOOL (NTAPI *PF_SymLoadModule)(IN HANDLE hProcess,
- IN HANDLE hFile,
- IN PSTR ImageName,
- IN PSTR ModuleName,
- IN DWORD BaseOfDll,
- IN DWORD SizeOfDll);
- typedef BOOL (NTAPI *PF_SymGetModuleInfo)(IN HANDLE hProcess,
- IN DWORD dwAddr,
- OUT PIMAGEHLP_MODULE ModuleInfo);
- typedef BOOL (NTAPI *PF_SymGetSymFromName)(IN HANDLE hProcess,
- IN LPSTR Name,
- OUT PIMAGEHLP_SYMBOL Symbol);
- typedef BOOL (NTAPI *PF_BindImage)(IN LPSTR pszImageName,
- IN LPSTR pszDllPath,
- IN LPSTR pszSymbolPath);
- typedef struct _SYM_INFO
- {
- HANDLE hProcess;
- HMODULE hImageHlp;
- PF_ImagehlpApiVersionEx pfImagehlpApiVersionEx;
- PF_SymInitialize pfSymInitialize;
- PF_SymSetOptions pfSymSetOptions;
- PF_SymGetOptions pfSymGetOptions;
- PF_SymLoadModule pfSymLoadModule;
- PF_SymGetModuleInfo pfSymGetModuleInfo;
- PF_SymGetSymFromName pfSymGetSymFromName;
- PF_BindImage pfBindImage;
- } DETOUR_SYM_INFO, *PDETOUR_SYM_INFO;
- PDETOUR_SYM_INFO LoadImageHlp(VOID);
- #endif // IMAGEAPI
- //////////////////////////////////////////////////////////////////////////////
- //
- class CEnableWriteOnCodePage
- {
- public:
- CEnableWriteOnCodePage(PBYTE pbCode, LONG cbCode = TRAMPOLINE_SIZE)
- {
- m_pbCode = pbCode;
- m_cbCode = cbCode;
- m_dwOldPerm = 0;
- m_hProcess = GetCurrentProcess();
- if (m_pbCode && m_cbCode) {
- if (!FlushInstructionCache(m_hProcess, pbCode, cbCode)) {
- return;
- }
- if (!VirtualProtect(pbCode,
- cbCode,
- PAGE_EXECUTE_READWRITE,
- &m_dwOldPerm)) {
- return;
- }
- }
- }
- ~CEnableWriteOnCodePage()
- {
- if (m_dwOldPerm && m_pbCode && m_cbCode) {
- DWORD dwTemp = 0;
- if (!FlushInstructionCache(m_hProcess, m_pbCode, m_cbCode)) {
- return;
- }
- if (!VirtualProtect(m_pbCode, m_cbCode, m_dwOldPerm, &dwTemp)) {
- return;
- }
- }
- }
- BOOL SetPermission(DWORD dwPerms)
- {
- if (m_dwOldPerm && m_pbCode && m_cbCode) {
- m_dwOldPerm = dwPerms;
- return TRUE;
- }
- return FALSE;
- }
- BOOL IsValid(VOID)
- {
- return m_pbCode && m_cbCode && m_dwOldPerm;
- }
- private:
- HANDLE m_hProcess;
- PBYTE m_pbCode;
- LONG m_cbCode;
- DWORD m_dwOldPerm;
- };
- //////////////////////////////////////////////////////////////////////////////
- //
- inline PBYTE GenMovEax(PBYTE pbCode, UINT32 nValue)
- {
- *pbCode++ = 0xB8;
- *((UINT32*&)pbCode)++ = nValue;
- return pbCode;
- }
- inline PBYTE GenMovEbx(PBYTE pbCode, UINT32 nValue)
- {
- *pbCode++ = 0xBB;
- *((UINT32*&)pbCode)++ = nValue;
- return pbCode;
- }
- inline PBYTE GenMovEcx(PBYTE pbCode, UINT32 nValue)
- {
- *pbCode++ = 0xB9;
- *((UINT32*&)pbCode)++ = nValue;
- return pbCode;
- }
- inline PBYTE GenMovEdx(PBYTE pbCode, UINT32 nValue)
- {
- *pbCode++ = 0xBA;
- *((UINT32*&)pbCode)++ = nValue;
- return pbCode;
- }
- inline PBYTE GenMovEsi(PBYTE pbCode, UINT32 nValue)
- {
- *pbCode++ = 0xBE;
- *((UINT32*&)pbCode)++ = nValue;
- return pbCode;
- }
- inline PBYTE GenMovEdi(PBYTE pbCode, UINT32 nValue)
- {
- *pbCode++ = 0xBF;
- *((UINT32*&)pbCode)++ = nValue;
- return pbCode;
- }
- inline PBYTE GenMovEbp(PBYTE pbCode, UINT32 nValue)
- {
- *pbCode++ = 0xBD;
- *((UINT32*&)pbCode)++ = nValue;
- return pbCode;
- }
- inline PBYTE GenMovEsp(PBYTE pbCode, UINT32 nValue)
- {
- *pbCode++ = 0xBC;
- *((UINT32*&)pbCode)++ = nValue;
- return pbCode;
- }
- inline PBYTE GenPush(PBYTE pbCode, UINT32 nValue)
- {
- *pbCode++ = 0x68;
- *((UINT32*&)pbCode)++ = nValue;
- return pbCode;
- }
- inline PBYTE GenPushad(PBYTE pbCode)
- {
- *pbCode++ = 0x60;
- return pbCode;
- }
- inline PBYTE GenPopad(PBYTE pbCode)
- {
- *pbCode++ = 0x61;
- return pbCode;
- }
- inline PBYTE GenJmp(PBYTE pbCode, PBYTE pbJmpDst, PBYTE pbJmpSrc = 0)
- {
- if (pbJmpSrc == 0) {
- pbJmpSrc = pbCode;
- }
- *pbCode++ = 0xE9;
- *((INT32*&)pbCode)++ = pbJmpDst - (pbJmpSrc + 5);
- return pbCode;
- }
- inline PBYTE GenCall(PBYTE pbCode, PBYTE pbJmpDst, PBYTE pbJmpSrc = 0)
- {
- if (pbJmpSrc == 0) {
- pbJmpSrc = pbCode;
- }
- *pbCode++ = 0xE8;
- *((INT32*&)pbCode)++ = pbJmpDst - (pbJmpSrc + 5);
- return pbCode;
- }
- inline PBYTE GenBreak(PBYTE pbCode)
- {
- *pbCode++ = 0xcc;
- return pbCode;
- }
- inline PBYTE GenRet(PBYTE pbCode)
- {
- *pbCode++ = 0xc3;
- return pbCode;
- }
- inline PBYTE GenNop(PBYTE pbCode)
- {
- *pbCode++ = 0x90;
- return pbCode;
- }
- #endif INTERAL
- #endif // __cplusplus
- #endif //
- //
- //////////////////////////////////////////////////////////////// End of File.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement