ImageBase по ProcID

Тема в разделе "WASM.BEGINNERS", создана пользователем GeNeZiS, 26 янв 2011.

  1. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Доброго времени суток.
    собственно вопрос: каким образом возможно получить ImageBase запущенного процесса если заранее известен его ProcessID?
    Благодарю за внимание
     
  2. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    CreateToolhelp32Snapshot/Module32First/CloseHandle
     
  3. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    fsd спасибо большое. както не подумал про это. смотрел в сторону Native.
    а как будет нативными ф-циями реализовать сабж, никто не в курсе?
     
  4. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    посмотреть в IDA Pro какой тип информации запрашивается функциями CreateToolhelp32Snapshot(TH32CS_SNAPMODULE|TH32CS_SNAPMODULE32)/Module32First у NtQuerySystemInformation
     
  5. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    логично. по модулям NtQuerySystemInformation(5), по базе NtQuerySystemInformation(11). а как это все связать вместе - ума не приложу) сорри за тупость. с 4 утра по мск пишу. наткнулся в одном месте на грабли - бегом на форум. может кто сталкивался и подпнёт в правильном направлении))
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    еще вариант... получить адрес PEB другого процесса и считать базовый адрес оттуда...
     
  7. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    GeNeZiS
    Помимо NtQuerySystemInformation
    примерно так
    Код (Text):
    1.   DWORD dwProcessId = NtGetProcessID(L"explorer.exe");
    2.   PDEBUG_BUFFER  pDebugBuffer =  RtlCreateQueryDebugBuffer(NULL, NULL);
    3.   RtlQueryProcessDebugInformation(dwProcessId,PDI_MODULES, (PDEBUG_BUFFER)pDebugBuffer);
    4.   PVOID pModBase = NULL;
    5.   for(int i = 0; i < pDebugBuffer->ModuleInformation->Count; i++)
    6.   {
    7.       pModBase = (PVOID)pDebugBuffer->ModuleInformation->aSH[i].Base;
    8.       char *szModuleName = pDebugBuffer->ModuleInformation->aSH[i].ImageName +    pDebugBuffer->ModuleInformation->aSH[i].ModuleNameOffset ;  
    9.       if ( lstrcmpA("calc.exe",szModuleName) == 0 ) break;
    10.   }
    11.  
    12.  
    13.   HANDLE hProcess = OpenProcess(PROCESS_VM_READ,FALSE,dwProcessId);
    14.   IMAGE_DOS_HEADER pDosh = {0};
    15.   ReadProcessMemory(hProcess,pModBase,&pDosh,sizeof(IMAGE_DOS_HEADER),NULL);
    16.  
    17.   CloseHandle(hProcess);
    18.   RtlDestroyQueryDebugBuffer(pDebugBuffer);
     
  8. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    ну и структуры на всякий случай

    Код (Text):
    1. typedef struct _DEBUG_MODULE  
    2. {
    3.     ULONG   Reserved[2];
    4.     ULONG   Base;
    5.     ULONG   Size;
    6.     ULONG   Flags;
    7.     USHORT  Index;
    8.     USHORT  Unknown;
    9.     USHORT  LoadCount;
    10.     USHORT  ModuleNameOffset;
    11.     CHAR    ImageName[256];
    12. } DEBUG_MODULE,*PDEBUG_MODULE;
    13.  
    14.  
    15. typedef struct _DEBUG_MODULE_INFORMATION
    16. {
    17.    ULONG Count;
    18.    DEBUG_MODULE aSH[];
    19. }DEBUG_MODULE_INFORMATION, *PDEBUG_MODULE_INFORMATION;
    20.  
    21. // Debug Functions
    22. typedef struct _DEBUG_BUFFER
    23. {
    24.   HANDLE  SectionHandle;
    25.   PVOID  SectionBase;
    26.   PVOID  RemoteSectionBase;
    27.   ULONG  SectionBaseDelta;
    28.   HANDLE  EventPairHandle;
    29.   ULONG  Unknown[2];
    30.   HANDLE  RemoteThreadHandle;
    31.   ULONG  InfoClassMask;
    32.   ULONG  SizeOfInfo;
    33.   ULONG  AllocatedSize;
    34.   ULONG  SectionSize;
    35.   //PVOID  ModuleInformation;
    36.   PDEBUG_MODULE_INFORMATION ModuleInformation;
    37.   PVOID  BackTraceInformation;
    38.   PVOID  HeapInformation;
    39.   PVOID  LockInformation;
    40.   PVOID  Reserved[8];
    41. } DEBUG_BUFFER, *PDEBUG_BUFFER;
    42.  
    43. #define PDI_MODULES     0x01
     
  9. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Код (Text):
    1. call GetCurrentProcessId
    2. mov dword ptr ds:[pid], eax
    3.            
    4. push dword ptr ds:[pid]
    5. push 0
    6. push PROCESS_ALL_ACCESS
    7. Call OpenProcess
    8.            
    9. mov dword ptr ds:[hid], eax
    10.            
    11. push 0
    12. push 24
    13. push offset buff
    14. push 0
    15. push eax
    16. call ZwQueryInformationProcess
    17.  
    18. mov eax, offset buff
    19. mov eax, dword ptr ds:[eax + 4]
    20. mov dword ptr ds:[PEB], eax
     
  10. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Flint_ta
    можно и через GetThreadSelectorEntry.
     
  11. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    984259h

    GetThreadSelectorEntry is only functional on x86-based systems. For systems that are not x86-based, the function returns FALSE.
     
  12. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    Flint_ta
    согласен что только x86 ))