Собсно надо на создании нового процесса заинжектить в него длл. Делаю это с помощью NtQueueApcThread в обработчике NtResumeThread. Но ! Но, но, но... Если битное приложение создает 64битное то что делать непонятно (NtQueueApcThread не канает) Обратную задачу решил ф-ией RtlQueueApcWow64Thread. Код собсно вот (он на коленке забацан, так что немного путанный, сори): Код (Text): DWORD newNtResumeThread(HANDLE ThreadHandle,PULONG SuspendCount) { THREAD_BASIC_INFORMATION tbiThreadInfo; HANDLE hProcess; DWORD dwHandlesCount; LPVOID remoteMem; BOOL bProcess64b=FALSE; if((pNtQueryInformationThread!=0)&&(pNtQueueApcThread!=0)) { if(pNtQueryInformationThread(ThreadHandle,ThreadBasicInformation,&tbiThreadInfo,sizeof(tbiThreadInfo),0)==0) { hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,(DWORD)tbiThreadInfo.ClientId.UniqueProcess); if(hProcess!=0) { if((pNtQueryInformationProcess(hProcess,20,&dwHandlesCount,sizeof(dwHandlesCount),0)==0) &&(dwHandlesCount==0)) { if((pIsWow64Process!=0)&&pIsWow64Process(hProcess,&bProcess64b)&&(!bProcess64b)) { remoteMem=VirtualAllocEx(hProcess,0,strlen(g_szDllName64),MEM_COMMIT,PAGE_READWRITE); if(remoteMem!=0) { WriteProcessMemory(hProcess,remoteMem,g_szDllName64,strlen(g_szDllName64),0); #ifdef _WIN64 pNtQueueApcThread(ThreadHandle,(PVOID)g_dwProc64,remoteMem,0,0); #else //что делать тут ?! #endif } } else { remoteMem=VirtualAllocEx(hProcess,0,strlen(g_szDllName32),MEM_COMMIT,PAGE_READWRITE); if(remoteMem!=0) { WriteProcessMemory(hProcess,remoteMem,g_szDllName32,strlen(g_szDllName32),0); #ifdef _WIN64 if(pRtlQueueApcWow64Thread!=0) { pRtlQueueApcWow64Thread(ThreadHandle,(PVOID)g_dwProc32,remoteMem,0,0); } #else pNtQueueApcThread(ThreadHandle,(PVOID)g_dwProc32,remoteMem,0,0); #endif } } } CloseHandle(hProcess); } } } return origNtResumeThread(ThreadHandle,SuspendCount); }
tylerdurden По-моему, не получится даже WriteProcessMemory сделать из 32-го в 64-й процесс. По крайней мере, 32-я psapi не работает с 64-битными процессами. Может быть, просто создать временный 64-битный процесс ?
Все получится, просто KiUserApcDispatcher всегда выполняется в 64битном режиме, pRtlQueueApcWow64Thread там заглушку вставляет... Память пишется нормально кстати (проверенно)
tylerdurden Могу посоветовать 1 вещь - все делать через 64х битное приложение (или длл) , вести с ней контакт как говорится... Тогда все работать будет. И так проще
В общем вроде понял, при инжекте из 32б в 64б параметры APC сливаются (т.к. они реально DWORD а 64б воспринимает их как QWORD) поэтому надо вызывать с параметром (0,address,0,remotemem)
tylerdurden может быть, говорю глупость, но нельзя ли в 32-битном процессе напрямую заюзать API 64-битной ntdll (вручную переключившись в long mode)?
green В принцыпе можно поставить бит L в CS у процесса. Но это могое не изменит, кроме того что команды будут интерпретироваться как 64х битные.. Врапперы WOW64 что-то еще делают, помимо этого, но в принцыпе реализуемо (Тока вот переключатся ничего не нужно Все уже включено, но урезано). А еще лучше идти простыми путями.
Ложная тревога... ZwQueueApcThread из 32битного процесса вставляет в качестве адреса заглушку RtlQueueApcWow64Thread, а ее соответственно в 64битном процессе нема, вот все и падает (а если указать в качестве адреса 0, как я пытался, то АПС просто не вставляется)