Помогите опередить, что не так

Тема в разделе "WASM.NETWORKS", создана пользователем router, 10 авг 2009.

  1. router

    router New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2009
    Сообщения:
    3
    Написал функцию на С++, которая должна запустить процесс, остановить его,
    внедрить DLL с помощью CreateRemoteThread, и запустить.
    Вроде как написал я ее но, она не работает, и ошибок не выдает.

    Проблема в следующем:

    Поток отрабатывает корректно, и wait-функция нормаль ожидает завершения потока.
    Но при вызове ResumeThread для главного потока запущенного процесса,
    процесс не запускается, а так и остается остановленным.

    Я заметил, что если убрать wait-функцию, то приложения запустится.
    Мне очень нужно чтоб DLL выполнилась перед запуском основного приложения.

    Вот код всего приложения:
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. #pragma pack(push, 1)
    5. struct inj_code
    6. {
    7.     BYTE    PUSH_CMD;
    8.     DWORD   PUSH_ARG;
    9.     WORD    CALL_CMD;
    10.     DWORD   CALL_ARG;
    11.     BYTE    PUSH_CMD_EXIT;
    12.     DWORD   PUSH_ARG_EXIT;
    13.     WORD    CALL_CMD_EXIT;
    14.     DWORD   CALL_ARG_EXIT;
    15.     PVOID   _LoadLibraryA;
    16.     PVOID   _ExitThread;
    17.     CHAR    LibraryName[MAX_PATH];
    18. };
    19. #pragma pack(pop)
    20.  
    21. bool WINAPI SetDebugPrivileges()
    22. {
    23.     LUID LID;
    24.     HANDLE hToken;
    25.     TOKEN_PRIVILEGES prv;
    26.  
    27.     try
    28.     {
    29.         if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) == 0) throw NULL;
    30.         if (LookupPrivilegeValueA(NULL, "SeDebugPrivilege", &LID) == 0) throw NULL;
    31.         prv.PrivilegeCount = 1;
    32.         prv.Privileges[0].Luid = LID;
    33.         prv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    34.         if (AdjustTokenPrivileges(hToken, FALSE, &prv, sizeof(TOKEN_PRIVILEGES), NULL, NULL) == 0) throw NULL;
    35.     }
    36.     catch (...) { CloseHandle(hToken); return false; }
    37.     return true;
    38. }
    39.  
    40. bool WINAPI InjectDll(char * process_name, char * module_name)
    41. {
    42.     PROCESS_INFORMATION process; STARTUPINFOA sti;
    43.     memset(&sti, 0, sizeof(STARTUPINFOA));
    44.     sti.cb = sizeof(STARTUPINFOA);
    45.     HANDLE hOpenProcess;
    46.  
    47.     inj_code rcd;
    48.     LPVOID memory;
    49.     DWORD memaddr;
    50.     HMODULE hKernel32;
    51.     HANDLE hThread;
    52.    
    53.     try
    54.     {
    55.         if (!CreateProcessA(process_name, NULL, NULL, NULL, FALSE,
    56.             CREATE_SUSPENDED | NORMAL_PRIORITY_CLASS, NULL, NULL, &sti, &process)) throw 0;
    57.  
    58.         hOpenProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION
    59.                     | PROCESS_VM_WRITE | PROCESS_CREATE_THREAD, FALSE, process.dwProcessId);
    60.         if (hOpenProcess == NULL) throw 0;
    61.  
    62.         memory = VirtualAllocEx(hOpenProcess, NULL, sizeof(inj_code), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    63.         if (memory == NULL) throw 0;
    64.  
    65.         memaddr = (DWORD)memory;
    66.         rcd.PUSH_CMD    = 0x068;
    67.         rcd.PUSH_ARG    = memaddr + 0x01E;
    68.         rcd.CALL_CMD    = 0x015FF;
    69.         rcd.CALL_ARG    = memaddr + 0x016;
    70.         rcd.PUSH_CMD_EXIT = 0x068;
    71.         rcd.PUSH_ARG_EXIT = 0;
    72.         rcd.CALL_CMD_EXIT = 0x015FF;
    73.         rcd.CALL_ARG_EXIT = memaddr + 0x01A;
    74.         hKernel32 = GetModuleHandleA("kernel32.dll");
    75.         rcd._LoadLibraryA = GetProcAddress(hKernel32, "LoadLibraryA");
    76.         rcd._ExitThread   = GetProcAddress(hKernel32, "ExitThread");
    77.         strcpy_s(rcd.LibraryName, MAX_PATH, module_name);
    78.  
    79.         if (!WriteProcessMemory(hOpenProcess, memory, &rcd, sizeof(inj_code), NULL)) throw 0;
    80.        
    81.         hThread = CreateRemoteThread(hOpenProcess, NULL, 0, (DWORD (WINAPI *)(LPVOID)) memory, NULL, 0, NULL);
    82.         if (hThread == NULL) throw 0;
    83.         WaitForSingleObject(hThread, INFINITE);
    84.        
    85.         if (!VirtualFreeEx(hOpenProcess, memory, 0, MEM_RELEASE)) throw 0;
    86.        
    87.         ResumeThread(process.hThread);
    88.         CloseHandle(hThread);
    89.         CloseHandle(hOpenProcess);
    90.         CloseHandle(process.hThread);
    91.         CloseHandle(process.hProcess);
    92.     }
    93.     catch(...)
    94.     {
    95.         TerminateProcess(process.hProcess, 0);
    96.         CloseHandle(hThread);
    97.         CloseHandle(hOpenProcess);
    98.         CloseHandle(process.hThread);
    99.         CloseHandle(process.hProcess);
    100.         return false;
    101.     }
    102.     return true;
    103. }
    104.  
    105. void main()
    106. {
    107.     if (!SetDebugPrivileges()) return;
    108.     if (!InjectDll("D:\\calc.exe", "D:\\mod.dll")) return;
    109.     printf("success\n");
    110. }