tool class
My pro tools class
it's mine jajaja
i'm so pro
it's mine jajaja
i'm so pro
Code:
#include "tools.h"
cTools* tools = NULL;
#ifdef _DEBUG_
void __cdecl cTools::add_log( char *file, const char *fmt, ... )
{
ofile.open( file , ios::app);
va_list va_alist;
char logbuf[256] = {0};
va_start (va_alist, fmt);
vsnprintf(logbuf + strlen(logbuf), sizeof(logbuf) - strlen(logbuf), fmt, va_alist);
va_end (va_alist);
ofile << logbuf << endl;
ofile.close();
return;
}
#endif
void *cTools::DetourCreate( BYTE *src, const BYTE *dst )
{
ASM_STATIC_BYTE
VM_START
ASM_STATIC_BYTE
int len = 5;
ASM_STATIC_BIT
BYTE *jmp = (BYTE*)malloc( len+5 );
ASM_STATIC_BIT
DWORD dwBack;
ASM_STATIC_BYTE
VirtualProtect( src, len, PAGE_EXECUTE_READWRITE, &dwBack );
ASM_STATIC_BYTE
memcpy( jmp, src, len );
ASM_STATIC_BIT
jmp += len;
ASM_STATIC_BIT
jmp[0] = 0xE9;
ASM_STATIC_BYTE
*(DWORD*)( jmp+1 ) = (DWORD)( src+len - jmp ) - 5;
ASM_STATIC_BIT
src[0] = 0xE9;
ASM_STATIC_BYTE
*(DWORD*)( src+1 ) = (DWORD)( dst - src ) - 5;
ASM_STATIC_BYTE
VirtualProtect( src, len, dwBack, &dwBack );
ASM_STATIC_BIT
VM_END
ASM_STATIC_BYTE
return( jmp-len );
ASM_LOL ASM_LOL ASM_LOL ASM_LOL ASM_LOL ASM_LOL ASM_LOL ASM_LOL ASM_LOL
}
static HWND OldWnd;
char *cTools::GetActiveWindowTitleLowerCase( void )
{
VM_START
char szWindow[256];
HWND TempWnd = GetForegroundWindow();
if( TempWnd != OldWnd )
{
OldWnd = TempWnd;
GetWindowText( TempWnd, szWindow, sizeof( szWindow ) );
CloseHandle( TempWnd );
}
int iWindowTextLength = strlen( szWindow );
for( int i = 0; i <= iWindowTextLength; i++ )
szWindow[i] = tolower( szWindow[i] );
VM_END
return szWindow;
}
// void cTools::CreateJump( DWORD dwOrigin, DWORD dwhkFunction )
// {
// VM_START
//
// DWORD OldProtect;
// VirtualProtect( (LPVOID) dwOrigin, 5, PAGE_EXECUTE_READWRITE, &OldProtect );
//
// if( *(BYTE*)dwOrigin != 0xE9 )
// {
// *(BYTE*)dwOrigin = 0xE9;
// *(DWORD*)( dwOrigin+1 ) = dwhkFunction - ( dwOrigin+5 );
// }
//
// VirtualProtect( (LPVOID) dwOrigin, 5, OldProtect, NULL );
//
// VM_END
// }
//DWORD cTools::VirtualTableHook( DWORD* pdwVirtualTable, int iVTableIndex, DWORD dwhkFunction )
//{
// VM_START
// DWORD dwOld, dwStor = 0x0;
// VirtualProtect( &pdwVirtualTable[ iVTableIndex ], 4, PAGE_EXECUTE_READWRITE, &dwOld );
//
// dwStor = *(DWORD*)&pdwVirtualTable[ iVTableIndex ];
//
// if( dwhkFunction != *(DWORD*)&pdwVirtualTable[ iVTableIndex ] )
// *(DWORD*)&pdwVirtualTable[ iVTableIndex ] = dwhkFunction;
//
// VirtualProtect( &pdwVirtualTable[ iVTableIndex ], 4, dwOld, &dwOld );
//
// VM_END
//
// return dwStor;
//}
void cTools::MemCopy_s( void* pvAddress, const void* pvBuffer, size_t stLen )
{
ASM_STATIC_BIT
VM_START
ASM_STATIC_BIT
MEMORY_BASIC_INFORMATION mbi;
ASM_STATIC_BYTE
VirtualQuery( ( void* )pvAddress, &mbi, sizeof( mbi ) );
ASM_STATIC_BYTE
VirtualProtect( mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect );
ASM_STATIC_BIT
memcpy( ( void* )pvAddress, ( void* )pvBuffer, stLen );
ASM_STATIC_BIT
VirtualProtect( mbi.BaseAddress, mbi.RegionSize, mbi.Protect, &mbi.Protect );
ASM_STATIC_BYTE
FlushInstructionCache( GetCurrentProcess( ), ( void* )pvAddress, stLen );
ASM_STATIC_BYTE
VM_END
ASM_STATIC_BYTE
}
void cTools::WriteOpCode( void* pvAddress, void* pvBuffer, int len )
{
ASM_STATIC_BIT
VM_START
ASM_STATIC_BIT
if( *(BYTE*)pvAddress == *(BYTE*)pvBuffer )
goto Skip;
ASM_STATIC_BIT
this->MemCopy_s( pvAddress, pvBuffer, ( size_t )len );
ASM_STATIC_BYTE
Skip:
VM_END
}
//
// void cTools::HideModule( HINSTANCE hModule )
// {
// DWORD dwPEB_LDR_DATA = 0;
//
// _asm
// {
// pushad;
// pushfd;
// mov eax, fs:[30h] // PEB
// mov eax, [eax+0Ch] // PEB->ProcessModuleInfo
// mov dwPEB_LDR_DATA, eax // Save ProcessModuleInfo
//
// InLoadOrderModuleList:
// mov esi, [eax+0Ch] // ProcessModuleInfo->InLoadOrderModuleList[FORWARD]
// mov edx, [eax+10h] // ProcessModuleInfo->InLoadOrderModuleList[BACKWARD]
//
// LoopInLoadOrderModuleList:
// lodsd // Load First Module
// mov esi, eax // ESI points to Next Module
// mov ecx, [eax+18h] // LDR_MODULE->BaseAddress
// cmp ecx, hModule // Is it Our Module ?
// jne SkipA // If Not, Next Please (@f jumps to nearest Unamed Lable @@:)
// mov ebx, [eax] // [FORWARD] Module
// mov ecx, [eax+4] // [BACKWARD] Module
// mov [ecx], ebx // Previous Module's [FORWARD] Notation, Points to us, Replace it with, Module++
// mov [ebx+4], ecx // Next Modules, [BACKWARD] Notation, Points to us, Replace it with, Module--
// jmp InMemoryOrderModuleList // Hidden, so Move onto Next Set
// SkipA:
// cmp edx, esi // Reached End of Modules ?
// jne LoopInLoadOrderModuleList // If Not, Re Loop
//
// InMemoryOrderModuleList:
// mov eax, dwPEB_LDR_DATA // PEB->ProcessModuleInfo
// mov esi, [eax+14h] // ProcessModuleInfo->InMemoryOrderModuleList[START]
// mov edx, [eax+18h] // ProcessModuleInfo->InMemoryOrderModuleList[FINISH]
//
// LoopInMemoryOrderModuleList:
// lodsd
// mov esi, eax
// mov ecx, [eax+10h]
// cmp ecx, hModule
// jne SkipB
// mov ebx, [eax]
// mov ecx, [eax+4]
// mov [ecx], ebx
// mov [ebx+4], ecx
// jmp InInitializationOrderModuleList
// SkipB:
// cmp edx, esi
// jne LoopInMemoryOrderModuleList
//
// InInitializationOrderModuleList:
// mov eax, dwPEB_LDR_DATA // PEB->ProcessModuleInfo
// mov esi, [eax+1Ch] // ProcessModuleInfo->InInitializationOrderModuleList[START]
// mov edx, [eax+20h] // ProcessModuleInfo->InInitializationOrderModuleList[FINISH]
//
// LoopInInitializationOrderModuleList:
// lodsd
// mov esi, eax
// mov ecx, [eax+08h]
// cmp ecx, hModule
// jne SkipC
// mov ebx, [eax]
// mov ecx, [eax+4]
// mov [ecx], ebx
// mov [ebx+4], ecx
// jmp Finished
// SkipC:
// cmp edx, esi
// jne LoopInInitializationOrderModuleList
//
// Finished:
// popfd;
// popad;
// }
// }




