Вставить APC из 32битного приложения в 64битное

Тема в разделе "WASM.WIN32", создана пользователем tylerdurden, 8 май 2007.

  1. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Собсно надо на создании нового процесса заинжектить в него длл. Делаю это с помощью NtQueueApcThread в обработчике NtResumeThread. Но ! Но, но, но... Если битное приложение создает 64битное то что делать непонятно (NtQueueApcThread не канает) :dntknw: Обратную задачу решил ф-ией RtlQueueApcWow64Thread. Код собсно вот (он на коленке забацан, так что немного путанный, сори):
    Код (Text):
    1. DWORD newNtResumeThread(HANDLE ThreadHandle,PULONG SuspendCount)
    2. {
    3.     THREAD_BASIC_INFORMATION tbiThreadInfo;
    4.     HANDLE hProcess;
    5.     DWORD dwHandlesCount;
    6.     LPVOID remoteMem;
    7.     BOOL bProcess64b=FALSE;
    8.    
    9.     if((pNtQueryInformationThread!=0)&&(pNtQueueApcThread!=0))
    10.     {
    11.         if(pNtQueryInformationThread(ThreadHandle,ThreadBasicInformation,&tbiThreadInfo,sizeof(tbiThreadInfo),0)==0)
    12.         {
    13.             hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,(DWORD)tbiThreadInfo.ClientId.UniqueProcess);
    14.             if(hProcess!=0)
    15.             {
    16.                 if((pNtQueryInformationProcess(hProcess,20,&dwHandlesCount,sizeof(dwHandlesCount),0)==0)
    17.                 &&(dwHandlesCount==0))
    18.                 {
    19.                     if((pIsWow64Process!=0)&&pIsWow64Process(hProcess,&bProcess64b)&&(!bProcess64b))
    20.                     {
    21.                         remoteMem=VirtualAllocEx(hProcess,0,strlen(g_szDllName64),MEM_COMMIT,PAGE_READWRITE);
    22.                         if(remoteMem!=0)
    23.                         {
    24.                             WriteProcessMemory(hProcess,remoteMem,g_szDllName64,strlen(g_szDllName64),0);
    25. #ifdef _WIN64
    26.                             pNtQueueApcThread(ThreadHandle,(PVOID)g_dwProc64,remoteMem,0,0);
    27. #else
    28. //что делать тут ?!
    29. #endif
    30.                         }
    31.                     }
    32.                     else
    33.                     {
    34.                         remoteMem=VirtualAllocEx(hProcess,0,strlen(g_szDllName32),MEM_COMMIT,PAGE_READWRITE);
    35.                         if(remoteMem!=0)
    36.                         {
    37.                             WriteProcessMemory(hProcess,remoteMem,g_szDllName32,strlen(g_szDllName32),0);
    38. #ifdef _WIN64
    39.                             if(pRtlQueueApcWow64Thread!=0)
    40.                             {
    41.                                 pRtlQueueApcWow64Thread(ThreadHandle,(PVOID)g_dwProc32,remoteMem,0,0);
    42.                             }
    43. #else
    44.                             pNtQueueApcThread(ThreadHandle,(PVOID)g_dwProc32,remoteMem,0,0);
    45. #endif
    46.                         }
    47.                     }
    48.                 }
    49.                 CloseHandle(hProcess);
    50.             }
    51.         }
    52.     }
    53.     return origNtResumeThread(ThreadHandle,SuspendCount);
    54. }
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    tylerdurden
    По-моему, не получится даже WriteProcessMemory сделать из 32-го в 64-й процесс. По крайней мере, 32-я psapi не работает с 64-битными процессами.

    Может быть, просто создать временный 64-битный процесс ?
     
  3. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Все получится, просто KiUserApcDispatcher всегда выполняется в 64битном режиме, pRtlQueueApcWow64Thread там заглушку вставляет... Память пишется нормально кстати (проверенно)
     
  4. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Шото у меня даже CreateRemoteThread из 32б в 64б не действует :dntknw:
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    tylerdurden
    Могу посоветовать 1 вещь - все делать через 64х битное приложение (или длл) , вести с ней контакт как говорится... Тогда все работать будет. :) И так проще
     
  6. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    В общем вроде понял, при инжекте из 32б в 64б параметры APC сливаются (т.к. они реально DWORD а 64б воспринимает их как QWORD) поэтому надо вызывать с параметром (0,address,0,remotemem)
     
  7. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    tylerdurden
    может быть, говорю глупость, но нельзя ли в 32-битном процессе напрямую заюзать API 64-битной ntdll (вручную переключившись в long mode)?
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    green
    В принцыпе можно поставить бит L в CS у процесса. Но это могое не изменит, кроме того что команды будут интерпретироваться как 64х битные.. Врапперы WOW64 что-то еще делают, помимо этого, но в принцыпе реализуемо (Тока вот переключатся ничего не нужно :) Все уже включено, но урезано). А еще лучше идти простыми путями.
     
  9. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Ложная тревога... ZwQueueApcThread из 32битного процесса вставляет в качестве адреса заглушку RtlQueueApcWow64Thread, а ее соответственно в 64битном процессе нема, вот все и падает (а если указать в качестве адреса 0, как я пытался, то АПС просто не вставляется)