⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 globalcexe.cpp

📁 Cracker终结者——提供最优秀的软件保护技术
💻 CPP
字号:
#define WIN32_LEAN_AND_MEAN
//#define UNICODE
#ifdef UNICODE
  #define _UNICODE
#endif
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#include <tchar.h>
#include <stdlib.h>
//#define AH_STATIC_LINKING
#include <ApiHooks.h>
//#define PW_STATIC_LINKING
#include <PrcWorks.h>

#include "GlobalC.h"

/////////////////////////////////////////////////////////
DWORD EnumPIDs(DWORD **pPIDs) {
  LONG r=0, s=r+1, t;
  DWORD *buf=NULL;
  while(s>r) { 
    r=s+0x100;  
    if(buf)
      LocalFree(buf);
    if(buf=(LPDWORD)LocalAlloc(LPTR, r*sizeof(LONG)))
       if((s = BuildPIDList(buf, r, PW_ALLSESSIONS)) == PW_MEMERROR)
         return((DWORD)LocalFree(buf));
       else
         *pPIDs = buf;
    else
      return(0);
  }
  return(s);
}

/////////////////////////////////////////////////////////
BOOL Active = TRUE;

DWORD WINAPI ReadMS(HANDLE hMS) {
  DWORD i;
  TCHAR Msg[MS_MAX_MSG_SIZE/sizeof(TCHAR)];
  while(Active)
    if(ReadFile(hMS, Msg, MS_MAX_MSG_SIZE, &i, NULL))
      _tprintf(Msg);
  return(CloseHandle(hMS));
}

/////////////////////////////////////////////////////////
LPTSTR ExeNameOnly(LPTSTR ProcName) {
  int i = _tcslen(ProcName);
  for(; i>=0; i--)
    if(ProcName[i] == '\\')
      return ProcName+i+1;
  return(ProcName);
}

/////////////////////////////////////////////////////////
  typedef union {
    COORD coord;
    WORD  wsize[2];
  } LCC32_COORD;

int _tmain(VOID) {
  LCC32_COORD cbsize = {{80, 0x910}};
  BOOL   TryLater;
  HANDLE hMS, hMU=NULL, StdOut, hMSC;
  DWORD  i, nPIDs, *PIDs, AHResult;
  BYTE sd[SECURITY_DESCRIPTOR_MIN_LENGTH];
  SECURITY_ATTRIBUTES sa = {sizeof(sa), &sd, FALSE}, *psa = NULL;
  TCHAR  ch, ProcName[MAX_PATH], Hooks_DLL[MAX_PATH]; 

  FreeConsole();
  AllocConsole();                 
  SetConsoleTitle(TEXT("GlobalC Messages (Press any key to perform unhooking)"));

  if(InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
    if(SetSecurityDescriptorDacl(&sd, TRUE, (PACL)NULL, FALSE))
      psa = &sa;


  if((hMS = CreateMailslot(MSName, MS_MAX_MSG_SIZE, 2000, psa)) == INVALID_HANDLE_VALUE) {
    _tprintf(TEXT("\nGCSRV: Can't create mailslot!"));
    return(getch());
  }

  if(!(hMU = CreateMutex(psa, FALSE, MUName)))
    hMU = CreateMutex(psa, FALSE, BaseMUName);
  if(!hMU) {
    _tprintf(TEXT("\nGCSRV: Can't create mutex!"));
    CloseHandle(hMS);
  }
  else {

    StdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    while(!SetConsoleScreenBufferSize(StdOut, cbsize.coord))
      cbsize.wsize[1] -= 0x10;

//get Hooks_DLL name assuming it's like main module name but with dll extension
    nPIDs = GetModuleFileName(NULL, Hooks_DLL, sizeof(Hooks_DLL)/sizeof(TCHAR));
    Hooks_DLL[nPIDs-1] = 'L';   
    Hooks_DLL[nPIDs-2] = 'L';   
    Hooks_DLL[nPIDs-3] = 'D';   

//enumerate processes
    if((nPIDs = EnumPIDs(&PIDs)) == 0)
      _tprintf(TEXT("\nGCSRV: No memory or BuildPIDList failed!"));
    else {


//filter system processes out, if requested
      HINSTANCE hntdll;
      BYTE WasEn;
      typedef LONG (WINAPI *TRAP)(DWORD, BOOL, DWORD, BYTE*);
      TRAP RAP;
      if(hntdll = GetModuleHandle(_T("ntdll.dll")))
        if(RAP = (TRAP)GetProcAddress(hntdll, "RtlAdjustPrivilege"))
          if(RAP(20, FALSE, 0, &WasEn) >=0) {
            do {
              _tprintf(TEXT("\nGCSRV: Do you wish to hook system processes [Y/N]?"));
              ch = getch() | ' ';
            } while(!((ch == 'y') || (ch == 'n')));
            if(ch == 'y')
              RAP(20, TRUE, 0, &WasEn);
          }


//create ReadMS thread
      HANDLE hThread = CreateThread(NULL, 0, ReadMS, hMS, 0, &i);


//apply hooks to enumerated processes
      for(i=0; i<nPIDs; i++) {
          ProcName[0] = '\0'; 
          PID2ProcessName(PIDs[i], ProcName);
          WaitForSingleObject(hMU, INFINITE);
          _tprintf(TEXT("\nGCSRV: Hooking 0x%.3X='%s' .."), PIDs[i], ExeNameOnly(ProcName));
          if(GetProcFlags(PIDs[i]) & RC_PF_DEBUGGED) {
#ifdef TRY_DEBUGGEE
            AHResult = EstablishApiHooks(NULL, Hooks_DLL, PIDs[i], TRY_DEBUGGEE);
#else
            AHResult = ErrorDebugged;
#endif
          }
          else
            AHResult = EstablishApiHooks(NULL, Hooks_DLL, PIDs[i], 40000);
           if(AHResult == 0)
             AHResult += (ErrorAHMin-1);  
          _tprintf(TEXT("%s"), EAHErrorMessages[AHResult-ErrorAHMin+1]);
          ReleaseMutex(hMU);
      }
      LocalFree(PIDs);
      
      do {
        getch();
//do unhooking
        TryLater = FALSE;

//enumerate processes
      if((nPIDs = EnumPIDs(&PIDs)) == 0) {
        _tprintf(TEXT("\nGCSRV: No memory or BuildPIDList failed!\n"));
        break;
      }
      else {
        for(i=0; i<nPIDs; i++) {
            ProcName[0] = '\0'; 
            PID2ProcessName(PIDs[i], ProcName);
            WaitForSingleObject(hMU, INFINITE);
            _tprintf(TEXT("\nGCSRV: Requesting unloading from 0x%.3X='%s' .."), PIDs[i], ExeNameOnly(ProcName));
            if(GetProcFlags(PIDs[i]) & RC_PF_DEBUGGED) {
#ifdef TRY_DEBUGGEE
              AHResult = LoadAndCall(NULL, Hooks_DLL, PIDs[i], TRY_DEBUGGEE, 0, TEXT("HooksCanUnloadNow"), 0, NULL);
#else
              AHResult = ErrorDebugged;
#endif
            }
            else {
              AHResult = LoadAndCall(NULL, Hooks_DLL, PIDs[i], 40000, 0, TEXT("HooksCanUnloadNow"), 0, NULL);
            }  
            if((ErrorAMMin <= AHResult) && (AHResult <= ErrorLACMax))
              _tprintf(TEXT("%s"), LACErrorMessages[AHResult-ErrorAHMin+1]);
            else
              _tprintf(TEXT("strange error!"));
            ReleaseMutex(hMU);
            BOOL WantsUnload = AHResult == ErrorUnloaded;
            if(AHResult >= ErrorOverHooked)
              TryLater = TRUE;
            else
              if(AHResult > ErrorUnloaded) {
                do {
                  _tprintf(TEXT("\nGCSRV: Unload from 0x%.3X='%s' anyway [Y/N]?"), PIDs[i], ExeNameOnly(ProcName));
                  ch = getch() | ' ';
                } while(!((ch == 'y') || (ch == 'n')));
                if(ch == 'y')
                  WantsUnload = ch == 'y';
                else
                  TryLater = TRUE;
              }
  
            if(WantsUnload) {
              WaitForSingleObject(hMU, INFINITE);
              _tprintf(TEXT("\nGCSRV: Unloading from 0x%.3X='%s' .."), PIDs[i], ExeNameOnly(ProcName));
              if(GetProcFlags(PIDs[i]) & RC_PF_DEBUGGED) {
#ifdef TRY_DEBUGGEE
                AHResult = UnloadModule(NULL, Hooks_DLL, PIDs[i], TRY_DEBUGGEE, 1);
#else
                AHResult = ErrorDebugged;
#endif
              } 
              else
                AHResult = UnloadModule(NULL, Hooks_DLL, PIDs[i], 40000, 1);
              if(AHResult == 0)
                AHResult += (ErrorAMMin-1);  
              if((ErrorAMMin-1 <= AHResult) && (AHResult <= ErrorULMMax))
                _tprintf(TEXT("%s"), ULMErrorMessages[AHResult-ErrorAHMin+1]);
              else {
                _tprintf(TEXT("still present. Try once again."));
                TryLater = TRUE;
              } 
              ReleaseMutex(hMU);
            }
        }//for
        LocalFree(PIDs);
      }//else pids 2
      } while(TryLater);
    Active = FALSE;
    WaitForSingleObject(hThread, 3000); 
    } //else pids 1
    CloseHandle(hMU);
  }//hMS
  SetConsoleTitle(TEXT("Press any key to quit"));
  return getch();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -