Оповещение потока в QueueUserAPC - PullRequest
0 голосов
/ 19 сентября 2018

Я попытался реализовать инъекцию, используя QueueUserAPC.Но это ждет бесконечное время.код прилагается ниже.Во-первых, я получаю ручку процесса.Затем получите идентификатор основного потока и выполните вызов APC.как я вызываю .. Я пытаюсь внедрить некоторый код в процесс Chrome.`

    /* Obtain a handle the process */
hproc = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, proc32.th32ProcessID);
if (hproc == NULL) {
    printf("\t[+] OpenProcess error \n");
}

printf("\n\t[+] Opened process handle: 0x%Ix\n", (SIZE_T)hproc);

shctrl->pidtab[ninj] =  proc32.th32ProcessID;   // store process id (if inject fails, next attempt will overwrite it)
printf("\t[+]*************Calling injectionQUAPC*************\n");
injectQUAPC(hproc, proc32.th32ProcessID);
printf("\t[+] Returned value of thread[nink] after injection is %d\n", threadid[ninj]);

Я исправил эту функцию / DWORD GetMainThreadId (DWORD dwPid) /

DWORD GetMainThreadId( DWORD dwProcessId )
{
THREADENTRY32 te32 = { sizeof( THREADENTRY32 ) };
HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, dwProcessId );  
if( hSnapshot == INVALID_HANDLE_VALUE )
    return NULL;    if( Thread32First( hSnapshot, &te32 ) )
{
    do {
        if( te32.th32OwnerProcessID == dwProcessId )
        {
            CloseHandle( hSnapshot );
            return te32.th32ThreadID;
        }
    } while( Thread32Next( hSnapshot, &te32 ) );
}   CloseHandle( hSnapshot );
return NULL;
}

Моя функция this вызывает вышеуказанную функцию, и я проверил возвращенный threadidиспользуя инструмент ProcessthreadView `

void injectQUAPC( HANDLE hproc, DWORD dwProcessId ){
HANDLE          hThread;                        // snapshot and current process handles
PROCESSENTRY32W proc32;                                 // process entry
ushort          ninj = 0;                               // number of injected processes so far
int             skip;                                   // internal flag
LPVOID  funst, funent;                                  // executer() entry point in current and remote process
ULONG   funsz;                                          // executer() size
LPBYTE  p;                                              // auxilary pointer
DWORD   nwritten;                             // written bytes and thread ID

printf("\n************Inside injectQUAPC*************\n");
DWORD threadid;
/* Get thread id from process id */

printf("\t[+] Getting main thread id for proc id: %d\n", dwProcessId);  
threadid = GetMainThreadId(dwProcessId);
if (hThread == NULL){
    printf("\t[-] Error getting main thread. press enter to skip\n");
    getch();
}   

/* Getting thread hanlle from thread id */
hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, threadid);
printf("\t[+] Thread opened successfully.\n");
printf("\t[+] Thread handle: 0x%Ix\r\n", (SIZE_T)hThread);

if (!hThread){
    printf("[-] Couldn't open thread:  0x%Ix, trying next one...\r\n", (SIZE_T)hThread);
//  continue;
}

funst = executer;
funsz = sizeof(executer);

_tprintf(_T("\t[+] Allocating space for the path of the executor code\n"));
funent = VirtualAllocEx(hproc, NULL, funsz, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (funent == NULL) {
    printf("\t[-] VirtualAllocEx error \n");
    getch();
}
BOOL bStatus;
/* Write to the remote process */
printf("\t[+] Writing into the current process space at 0x%p\n", funent);
bStatus = WriteProcessMemory(hproc, funent, funst, funsz, NULL);
if (bStatus == NULL) {
    printf("\t[+] WriteProcessMemory errror \n");
    getch();
}
else printf("\t[+] WriteProcessMemory status %d \n", bStatus);


DWORD dResult;
/* Injection Happen here */
if (!QueueUserAPC((PAPCFUNC)hproc, hThread, (ULONG_PTR)funent)){

    printf("\t[-] QueueUserAPC error, trying next thread...\r\n");
    getch();
}   
else {
    printf("\t[+] QueueUserAPC successfully completed on thread ID %d....\n", threadid);
    printf("Waiting on thread %d.\n", threadid);
    WaitForSingleObject(hThread, INFINITE);
}   
printf("\t[+] Closing process handle.\n");
CloseHandle(hThread);
CloseHandle( hproc );   
printf("\t[+] Returning thread handle for thread ID %d....\n", threadid);

}

...