2015-01-09 9 views
-4

Итак, мой вопрос следующий: у меня есть программа Main.exe (которая запускает игру), у меня есть dll, прикрепленная к ней, поэтому я могу загрузить некоторые функции. У меня есть другая программа под названием StartGame.exe (launcher + autoupdater), теперь вопрос в том, как я могу сделать функцию, чтобы убедиться, что Main.exe запущен только из StartGame.exe, когда клиент нажал кнопку START? Я не могу изменить ни main.exe, ни StartGame.exe ... Я сделал несколько простых чек следующим образом:Проверьте, запущена ли программа через другую.

if(FindWindow(NULL,"LiveMU") == NULL) //LiveMU is the name of window StartGame.exe 
{ 
    MessageBoxA(0,"English: Please use the Launcher! \nRomanian: Va rugam sa folositi Launcher-ul!", TitleMsgBox,MB_ICONERROR); 
    ExitProcess(0); 
} 

Проблема заключается в том, что если они открывают startgame.exe, и оставить его в лоток , они могут без проблем загружать Main.exe. Проблема MAIN заключается в том, что если я не могу защитить каким-то образом Main.exe от запуска без запуска, клиенты/игроки используют чит-программу, загружающую Main.exe (вводя ее или что-то, я действительно не знаю, поскольку она просто исчезает, и я могу " т найти)

LE: Я не могу добавить аргументы командной строки StartGame.exe потому что она с тяжелой защитой ...

+0

Используйте «секретно» параметр/внутренней командной строки, которая передается от «StartGame.exe» до «main.exe» , немедленно выйдите из «Main.exe», если этот параметр не передан. Если пользователь запускает Main.exe (скажем, двойным щелчком, командной строкой и т. Д.), Опция не будет присутствовать, и она не будет запущена. –

+0

Я уже сказал, что я не могу изменить/добавить/изменить StartGame.exe, потому что он защищен VMProtect ... Я не могу передать аргумент командной строки :( –

+0

Извините, не видел эту часть. Я думаю, что нет 100 % надежный способ в целом, а тем более, если вы пытаетесь контролировать эту зависимость «извне» в двух программах ... –

ответ

1

стандарт Windows API не позволяет напрямую найти родительский процесс. Но, надеюсь, в соответствии с this other SO question, у вас есть 2 другие решения (при условии, что родительский процесс еще не завершенные ...):

  • используют нативный API. Функция NtQueryInformationProcess может непосредственно предоставить вам информацию. но будьте осторожны:

    • у вас нет библиотеки импорта, так что вы должны использовать явно называть LoadLibrary и GetProcAddress
    • родительского идентификатором процесса является недокументированные полем ссылки Reserved3 в Microsoft SDK
    • Microsoft предупреждает, что эта функция не является частью публичного API и может измениться в будущих версиях.

    Если вы все еще хотите использовать его здесь полный пример получения родительского процесса имя исполняемого файла (вы должны связать с psapi.lib):

    #include <windows.h> 
    #include <psapi.h> 
    #include <TCHAR.h> 
    
    typedef struct _PROCESS_BASIC_INFORMATION { 
        PVOID Reserved1; 
        PVOID PebBaseAddress; 
        PVOID Reserved2[2]; 
        ULONG_PTR UniqueProcessId; 
        PVOID Reserved3; 
    } PROCESS_BASIC_INFORMATION; 
    
    DWORD getParentProcessId(HANDLE process) { 
        LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle, 
         ULONG ProcessInformationClass, PVOID ProcessInformation, 
         ULONG ProcessInformationLength, PULONG ReturnLength) = NULL; 
        HMODULE ntDll = ::LoadLibrary(_T("NTDLL.DLL")); 
        FARPROC ntQueryInformationProcess = ::GetProcAddress(ntDll, 
         "NtQueryInformationProcess"); 
        NtQueryInformationProcess = 
         (LONG (WINAPI *)(HANDLE,ULONG,PVOID,ULONG,PULONG))ntQueryInformationProcess; 
        if (NtQueryInformationProcess == NULL) { 
         ::FreeLibrary(ntDll); 
         return -1; 
        } 
        PROCESS_BASIC_INFORMATION pi; 
        ULONG piLen; 
        NtQueryInformationProcess(process, 0, &pi, sizeof(pi), & piLen); 
        DWORD ppid = (DWORD) pi.Reserved3; 
        ::FreeLibrary(ntDll); 
        return ppid; 
    } 
    
    int main() { 
        DWORD cr; 
        HANDLE proc = ::GetCurrentProcess(); 
        DWORD ppid = getParentProcessId(proc); 
    
        HANDLE pproc = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ppid); 
        TCHAR pFile[MAX_PATH]; 
        cr = ::GetModuleFileNameEx(pproc, NULL, pFile, sizeof(pFile)); 
        ::CloseHandle(pproc); 
        if (cr == 0) { 
         LPTSTR pBuff; 
         DWORD error = ::GetLastError(); 
         ::FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, error, 0, 
          (LPWSTR) &pBuff, 1, NULL); 
         ::MessageBox(NULL, pBuff, _T("Error"), MB_OK | MB_ICONERROR); 
        } 
        ::MessageBox(NULL, pFile, _T("Parent process"), MB_OK); 
        return 0; 
    } 
    
  • , если вам не нравится, используя плохо документированы встроенные функции API, вы можете использовать библиотеку toolhelp32: CreateToolhelp32Snapshot создает моментальный снимок всех запущенных процессов, которые вы можете просматривать с помощью Process32First и Process32Next. Надеемся, вы получите (задокументированные) PROCESSENTRY32 структуры, содержащие исполняемое имя, идентификатор процесса и идентификатор родителя процесса. Это в значительной степени документирована, и вы легко найдете множество примеров на StackOverflow (см ссылается вопрос)

+0

Спасибо, сэр, я попробую это. Но у меня уже есть SystemProcessesScan() и ScanProcessMemory (HANDLE hProcess) с определенным списком дампов исполняемых файлов, которые не могут обнаружить этот чит. Я пробовал отслеживать его, смотреть ближе, но ничего. В предыдущих версиях этого взлома программа маскировала себя как rundll32.dll поэтому мне было легко обнаружить его и закрыть его pid. Но новая версия убивает меня и других тоже :(Это программа (взломать): http://www.filedropper.com/muautoclicker возможно, если у вас есть время, то вы можете взглянуть ... –

+0

@ Mr.Mecanik Это сообщение отвечает на вопрос * как посмотреть, какая программа запустила другую. Но для реальной проблемы избежать обмана это действительно грязный хак и вы должны рассмотреть в будущей версии передачу тайны или лучше хэш в тайне и время запуска, чтобы иметь уникальный токен. –

+0

Спасибо, что ответили мне, но, пожалуйста, если у вас есть время, можете ли вы взглянуть на чит? это действительно продвинутый и интересный ... –

Смежные вопросы