//===============================================================================================//// Copyright (c) 2012, Stephen Fewer of Harmony Security (www.harmonysecurity.com)// All rights reserved.// // Redistribution and use in source and binary forms, with or without modification, are permitted // provided that the following conditions are met:// // * Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer.// // * Redistributions in binary form must reproduce the above copyright notice, this list of // conditions and the following disclaimer in the documentation and/or other materials provided // with the distribution.// // * Neither the name of Harmony Security nor the names of its contributors may be used to// endorse or promote products derived from this software without specific prior written permission.// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE.//===============================================================================================//#ifndef_REFLECTIVEDLLINJECTION_REFLECTIVELOADER_H#define_REFLECTIVEDLLINJECTION_REFLECTIVELOADER_H//===============================================================================================//#defineWIN32_LEAN_AND_MEAN#include<windows.h>#include<Winsock2.h>#include<intrin.h>#include"ReflectiveDLLInjection.h"typedefHMODULE(WINAPI* LOADLIBRARYA)(LPCSTR);typedefFARPROC(WINAPI* GETPROCADDRESS)(HMODULE, LPCSTR);typedefLPVOID(WINAPI* VIRTUALALLOC)(LPVOID, SIZE_T, DWORD, DWORD);typedefDWORD(NTAPI* NTFLUSHINSTRUCTIONCACHE)(HANDLE, PVOID, ULONG);#defineKERNEL32DLL_HASH0x6A4ABC5B#defineNTDLLDLL_HASH0x3CFA685D#defineLOADLIBRARYA_HASH0xEC0E4E8E#defineGETPROCADDRESS_HASH0x7C0DFCAA#defineVIRTUALALLOC_HASH0x91AFCA54#defineNTFLUSHINSTRUCTIONCACHE_HASH0x534C0AB8#defineIMAGE_REL_BASED_ARM_MOV32A5#defineIMAGE_REL_BASED_ARM_MOV32T7#defineARM_MOV_MASK(DWORD)(0xFBF08000)#defineARM_MOV_MASK2(DWORD)(0xFBF08F00)#defineARM_MOVW0xF2400000#defineARM_MOVT0xF2C00000#defineHASH_KEY13//===============================================================================================//#pragmaintrinsic( _rotr )
__forceinline DWORD ror(DWORD d){
return_rotr(d, HASH_KEY);}
__forceinline DWORD hash(char* c){
register DWORD h =0;do{
h =ror(h);
h +=*c;}while(*++c);return h;}//===============================================================================================//typedefstruct_UNICODE_STR{
USHORT Length;
USHORT MaximumLength;
PWSTR pBuffer;} UNICODE_STR,* PUNICODE_STR;// WinDbg> dt -v ntdll!_LDR_DATA_TABLE_ENTRY//__declspec( align(8) ) typedefstruct_LDR_DATA_TABLE_ENTRY{
//LIST_ENTRY InLoadOrderLinks; // As we search from PPEB_LDR_DATA->InMemoryOrderModuleList we dont use the first entry.
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
PVOID DllBase;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STR FullDllName;
UNICODE_STR BaseDllName;
ULONG Flags;
SHORT LoadCount;
SHORT TlsIndex;
LIST_ENTRY HashTableEntry;
ULONG TimeDateStamp;} LDR_DATA_TABLE_ENTRY,* PLDR_DATA_TABLE_ENTRY;// WinDbg> dt -v ntdll!_PEB_LDR_DATAtypedefstruct_PEB_LDR_DATA//, 7 elements, 0x28 bytes{
DWORD dwLength;
DWORD dwInitialized;
LPVOID lpSsHandle;
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
LPVOID lpEntryInProgress;} PEB_LDR_DATA,* PPEB_LDR_DATA;// WinDbg> dt -v ntdll!_PEB_FREE_BLOCKtypedefstruct_PEB_FREE_BLOCK// 2 elements, 0x8 bytes{
struct_PEB_FREE_BLOCK* pNext;
DWORD dwSize;} PEB_FREE_BLOCK,* PPEB_FREE_BLOCK;// struct _PEB is defined in Winternl.h but it is incomplete// WinDbg> dt -v ntdll!_PEBtypedefstruct__PEB// 65 elements, 0x210 bytes{
BYTE bInheritedAddressSpace;
BYTE bReadImageFileExecOptions;
BYTE bBeingDebugged;
BYTE bSpareBool;
LPVOID lpMutant;
LPVOID lpImageBaseAddress;
PPEB_LDR_DATA pLdr;
LPVOID lpProcessParameters;
LPVOID lpSubSystemData;
LPVOID lpProcessHeap;
PRTL_CRITICAL_SECTION pFastPebLock;
LPVOID lpFastPebLockRoutine;
LPVOID lpFastPebUnlockRoutine;
DWORD dwEnvironmentUpdateCount;
LPVOID lpKernelCallbackTable;
DWORD dwSystemReserved;
DWORD dwAtlThunkSListPtr32;
PPEB_FREE_BLOCK pFreeList;
DWORD dwTlsExpansionCounter;
LPVOID lpTlsBitmap;
DWORD dwTlsBitmapBits[2];
LPVOID lpReadOnlySharedMemoryBase;
LPVOID lpReadOnlySharedMemoryHeap;
LPVOID lpReadOnlyStaticServerData;
LPVOID lpAnsiCodePageData;
LPVOID lpOemCodePageData;
LPVOID lpUnicodeCaseTableData;
DWORD dwNumberOfProcessors;
DWORD dwNtGlobalFlag;
LARGE_INTEGER liCriticalSectionTimeout;
DWORD dwHeapSegmentReserve;
DWORD dwHeapSegmentCommit;
DWORD dwHeapDeCommitTotalFreeThreshold;
DWORD dwHeapDeCommitFreeBlockThreshold;
DWORD dwNumberOfHeaps;
DWORD dwMaximumNumberOfHeaps;
LPVOID lpProcessHeaps;
LPVOID lpGdiSharedHandleTable;
LPVOID lpProcessStarterHelper;
DWORD dwGdiDCAttributeList;
LPVOID lpLoaderLock;
DWORD dwOSMajorVersion;
DWORD dwOSMinorVersion;
WORD wOSBuildNumber;
WORD wOSCSDVersion;
DWORD dwOSPlatformId;
DWORD dwImageSubsystem;
DWORD dwImageSubsystemMajorVersion;
DWORD dwImageSubsystemMinorVersion;
DWORD dwImageProcessAffinityMask;
DWORD dwGdiHandleBuffer[34];
LPVOID lpPostProcessInitRoutine;
LPVOID lpTlsExpansionBitmap;
DWORD dwTlsExpansionBitmapBits[32];
DWORD dwSessionId;
ULARGE_INTEGER liAppCompatFlags;
ULARGE_INTEGER liAppCompatFlagsUser;
LPVOID lppShimData;
LPVOID lpAppCompatInfo