Где в PEB-е лежит EntryPoint модуля?

Тема в разделе "WASM.BEGINNERS", создана пользователем dyn, 25 авг 2010.

  1. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Никак не могу найти.
    Нашел описание структуры

    Код (Text):
    1. UCHAR InheritedAddressSpace;
    2.      UCHAR ReadImageFileExecOptions;
    3.      UCHAR BeingDebugged;
    4.      UCHAR BitField;
    5.      ULONG ImageUsesLargePages: 1;
    6.      ULONG IsProtectedProcess: 1;
    7.      ULONG IsLegacyProcess: 1;
    8.      ULONG IsImageDynamicallyRelocated: 1;
    9.      ULONG SpareBits: 4;
    10.      PVOID Mutant;
    11.      PVOID ImageBaseAddress;
    12.      PPEB_LDR_DATA Ldr;
    13.      PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
    14.      PVOID SubSystemData;
    15.      PVOID ProcessHeap;
    16.      PRTL_CRITICAL_SECTION FastPebLock;
    17.      PVOID AtlThunkSListPtr;
    18.      PVOID IFEOKey;
    19.      ULONG CrossProcessFlags;
    20.      ULONG ProcessInJob: 1;
    21.      ULONG ProcessInitializing: 1;
    22.      ULONG ReservedBits0: 30;
    23.      union
    24.      {
    25.           PVOID KernelCallbackTable;
    26.           PVOID UserSharedInfoPtr;
    27.      };
    28.      ULONG SystemReserved[1];
    29.      ULONG SpareUlong;
    30.      PPEB_FREE_BLOCK FreeList;
    31.      ULONG TlsExpansionCounter;
    32.      PVOID TlsBitmap;
    33.      ULONG TlsBitmapBits[2];
    34.      PVOID ReadOnlySharedMemoryBase;
    35.      PVOID HotpatchInformation;
    36.      VOID * * ReadOnlyStaticServerData;
    37.      PVOID AnsiCodePageData;
    38.      PVOID OemCodePageData;
    39.      PVOID UnicodeCaseTableData;
    40.      ULONG NumberOfProcessors;
    41.      ULONG NtGlobalFlag;
    42.      LARGE_INTEGER CriticalSectionTimeout;
    43.      ULONG HeapSegmentReserve;
    44.      ULONG HeapSegmentCommit;
    45.      ULONG HeapDeCommitTotalFreeThreshold;
    46.      ULONG HeapDeCommitFreeBlockThreshold;
    47.      ULONG NumberOfHeaps;
    48.      ULONG MaximumNumberOfHeaps;
    49.      VOID * * ProcessHeaps;
    50.      PVOID GdiSharedHandleTable;
    51.      PVOID ProcessStarterHelper;
    52.      ULONG GdiDCAttributeList;
    53.      PRTL_CRITICAL_SECTION LoaderLock;
    54.      ULONG OSMajorVersion;
    55.      ULONG OSMinorVersion;
    56.      WORD OSBuildNumber;
    57.      WORD OSCSDVersion;
    58.      ULONG OSPlatformId;
    59.      ULONG ImageSubsystem;
    60.      ULONG ImageSubsystemMajorVersion;
    61.      ULONG ImageSubsystemMinorVersion;
    62.      ULONG ImageProcessAffinityMask;
    63.      ULONG GdiHandleBuffer[34];
    64.      PVOID PostProcessInitRoutine;
    65.      PVOID TlsExpansionBitmap;
    66.      ULONG TlsExpansionBitmapBits[32];
    67.      ULONG SessionId;
    68.      ULARGE_INTEGER AppCompatFlags;
    69.      ULARGE_INTEGER AppCompatFlagsUser;
    70.      PVOID pShimData;
    71.      PVOID AppCompatInfo;
    72.      UNICODE_STRING CSDVersion;
    73.      _ACTIVATION_CONTEXT_DATA * ActivationContextData;
    74.      _ASSEMBLY_STORAGE_MAP * ProcessAssemblyStorageMap;
    75.      _ACTIVATION_CONTEXT_DATA * SystemDefaultActivationContextData;
    76.      _ASSEMBLY_STORAGE_MAP * SystemAssemblyStorageMap;
    77.      ULONG MinimumStackCommit;
    78.      _FLS_CALLBACK_INFO * FlsCallback;
    79.      LIST_ENTRY FlsListHead;
    80.      PVOID FlsBitmap;
    81.      ULONG FlsBitmapBits[4];
    82.      ULONG FlsHighIndex;
    83.      PVOID WerRegistrationData;
    84.      PVOID WerShipAssertPtr;
    85. } PEB, *PPEB;
    В PPEB_LDR_DATA там только список дллок. Самого ехе нет. Помогите найти энтрипоинт в пебе. Заранее спс
     
  2. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    PEB.ImageBaseAddress, а дальше находим EP
     
  3. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Где находим? Обошел весь список InLoadOrderModuleList
    там одни дллки.
    Базы ехешника нет :dntknw:

    Поиск в PE мне не подходит. Нужно с PEB-а энтри вытащить
     
  4. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    Код (Text):
    1. typedef struct _PEB
    2. {
    3.     UCHAR               InheritedAddressSpace;              // 0
    4.     UCHAR               ReadImageFileExecOptions;           // 1
    5.     UCHAR               BeingDebugged;                      // 2
    6.     BYTE                b003;                               // 3
    7.     PVOID               Mutant;                             // 4
    8. PVOID       ImageBaseAddress;               // 8 ========то что ты ищешь=======
    9.     PPEB_LDR_DATA       Ldr;                                // C
    10.     PPROCESS_PARAMETERS ProcessParameters;                  // 10
    11.     PVOID               SubSystemData;                      // 14  
    12.     PVOID               ProcessHeap;                        // 18
    13.     KSPIN_LOCK          FastPebLock;                        // 1C
    14.     PPEBLOCKROUTINE     FastPebLockRoutine;                 // 20
    15.     PPEBLOCKROUTINE     FastPebUnlockRoutine;               // 24
    16.     ULONG               EnvironmentUpdateCount;             // 28
    17.     PVOID               *KernelCallbackTable;               // 2C
    18.     PVOID               EventLogSection;                    // 30
    19.     PVOID               EventLog;                           // 34
    20.     PPEB_FREE_BLOCK     FreeList;                           // 38
    21.     ULONG               TlsExpansionCounter;                // 3C
    22.     PRTL_BITMAP         TlsBitmap;                          // 40
    23.     ULONG               TlsBitmapData[0x2];                 // 44
    24.     PVOID               ReadOnlySharedMemoryBase;           // 4C
    25.     PVOID               ReadOnlySharedMemoryHeap;           // 50
    26.     PTEXT_INFO          ReadOnlyStaticServerData;           // 54
    27.     PVOID               InitAnsiCodePageData;               // 58
    28.     PVOID               InitOemCodePageData;                // 5C
    29.     PVOID               InitUnicodeCaseTableData;           // 60
    30.     ULONG               KeNumberProcessors;                 // 64
    31.     ULONG               NtGlobalFlag;                       // 68
    32.     DWORD               d6C;                                // 6C
    33.     LARGE_INTEGER       MmCriticalSectionTimeout;           // 70
    34.     ULONG               MmHeapSegmentReserve;               // 78
    35.     ULONG               MmHeapSegmentCommit;                // 7C
    36.     ULONG               MmHeapDeCommitTotalFreeThreshold;   // 80
    37.     ULONG               MmHeapDeCommitFreeBlockThreshold;   // 84
    38.     ULONG               NumberOfHeaps;                      // 88
    39.     ULONG               AvailableHeaps;                     // 8C
    40.     PHANDLE             ProcessHeapsListBuffer;             // 90
    41.     PVOID               GdiSharedHandleTable;               // 94
    42.     PVOID               ProcessStarterHelper;               // 98
    43.     PVOID               GdiDCAttributeList;                 // 9C
    44.     KSPIN_LOCK          LoaderLock;                         // A0
    45.     ULONG               NtMajorVersion;                     // A4
    46.     ULONG               NtMinorVersion;                     // A8
    47.     USHORT              NtBuildNumber;                      // AC
    48.     USHORT              NtCSDVersion;                       // AE
    49.     ULONG               PlatformId;                         // B0
    50.     ULONG               Subsystem;                          // B4
    51.     ULONG               MajorSubsystemVersion;              // B8
    52.     ULONG               MinorSubsystemVersion;              // BC
    53.     KAFFINITY           AffinityMask;                       // C0
    54.     ULONG               GdiHandleBuffer[0x22];              // C4
    55.     ULONG               PostProcessInitRoutine;             // 14C
    56.     ULONG               TlsExpansionBitmap;                 // 150
    57.     UCHAR               TlsExpansionBitmapBits[0x80];       // 154
    58.     ULONG               SessionId;                          // 1D4
    59.     ULARGE_INTEGER      AppCompatFlags;                     // 1D8
    60.     PWORD               CSDVersion;                         // 1E0
    61. /*  PVOID               AppCompatInfo;                      // 1E4
    62.     UNICODE_STRING      usCSDVersion;
    63.     PVOID               ActivationContextData;
    64.     PVOID               ProcessAssemblyStorageMap;
    65.     PVOID               SystemDefaultActivationContextData;
    66.     PVOID               SystemAssemblyStorageMap;
    67.     ULONG               MinimumStackCommit; */
    68. } PEB, *PPEB;
    выделено
    почему поиск в PE не подходит не могу понять.
     
  5. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Может я что-то не понимаю...

    Мне нужна точка входа. AddressOfEntryPoint, а не база образа.
    Поиск в РЕ-хидере не подходит, потому что программа бьет хидер
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    dyn
    В PEB нет EP. Она только в базе данных.
     
  7. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    блин... берешь ImageBaseAddress, он указывает на то место, куда промаппирован твой бинарник, находишь смещение NT-заголовков относительно этого адреса через DOS-заголовок, в NT-заголовках будет смещение EntryPoint относительно этого адреса... бить NT-хедер нельзя, некоторый функционал будет некорректно работать... обнули DOS-заголовок и поставь другое число в сигнатуру NT-заголовка, а также в Magic в опциональном заголовке... этого в принципе достаточно, кому надо будет догадаться, что это PE-файл, тот и так догадается... далее начало NT-заголовка будет это самое число (сигнатура) после серии нулей...
     
  8. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Clerk
    Подробнее - в какой базе?

    Rel
    OptionalHeader.AddressOfEntryPoint - это не подходит. Программа зануляет первые 0x1000 байт образа ехе.
    Весь MZ и PE хидер занулены. Занулено все вплоть до начала первой секции.

    Я делаю инжект в эту программу. Нужно как-то альтернативно вытащить оригинальную энтри.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    [deleted]
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    а... ясно... как альтернативный вариант могу предложить такой алгоритм: найти главный поток в программе (самый первый поток в массиве SYSTEM_PROCESS_INFORMATION.aST), и посмотреть у него поле стартового адреса (SYSTEM_THREAD.pStartAddress)... это канеш может и не быть искомой EntryPoint, надо проверить на практике... просто идея, сам не пробовал...
     
  11. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    dyn
    Открыть исполняемый файл на диске и прочитать хеадер - не?
     
  12. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Нет, не подходит.
     
  13. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Так в PPEB_LDR_DATA - списке вообще должен быть ехе-модуль(у меня находит) - или его сама прога почикала? хм...
     
  14. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Прога только заголовок чикает.
    Если не сложно, можете дать простейший код поиска ехе в PPEB_LDR_DATA?
     
  15. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Эта тема обсуждалась здесь http://wasm.ru/forum/viewtopic.php?id=36963&p=1
    Код (Text):
    1. HMODULE MyGetModuleHandleW(LPCWSTR lpModuleName)
    2. {
    3.     PPEB peb = (PPEB)NtGetPeb();//MyCurrentPeb();
    4.  
    5.     // Если пользователь желает получить базовый адрес текущего модуля
    6.     if(lpModuleName == NULL)
    7.     { return (HMODULE)peb->ImageBaseAddress; }
    8.  
    9.     WCHAR strwModuleName[256];
    10.     WCHAR *strwP;
    11.     wcscpy(strwModuleName,lpModuleName);
    12.     strwP = &strwModuleName[wcslen(strwModuleName)-4];
    13.     if(wcsicmp(strwP,L".dll")!=0)
    14.         wcscat(strwModuleName,L".dll");
    15.  
    16.     // Если пользователь желает получить базовый адрес dll, то
    17.     // ищем в цикле по имени модуля
    18.     PPEB_LDR_DATA ldrpeb = peb->Ldr;//peb->LoaderData;
    19.     PLIST_ENTRY pointer  = ldrpeb->InLoadOrderModuleList.Flink;
    20.     PLIST_ENTRY start    = ldrpeb->InLoadOrderModuleList.Flink;
    21.     PLDR_MODULE ldrmod   = NULL;
    22.     PWSTR       dllname  = NULL;
    23.     while(1)
    24.     {
    25.         ldrmod  = (PLDR_MODULE)pointer;
    26.         dllname = ldrmod->BaseDllName.Buffer;
    27.         //TEST!!!
    28.         printf("Module: %S - EntryPoint: 0x%08X\n",dllname,ldrmod->EntryPoint);
    29.         //TEST!!!
    30.         if((dllname) && (_wcsicmp(strwModuleName, dllname) == 0))
    31.         {
    32.             return (HMODULE)ldrmod->BaseAddress;
    33.         }
    34.         //else { pointer = ldrmod->ModuleList.Flink; }
    35.         else
    36.         {
    37.             //pointer = ldrmod->InLoadOrderModuleList.Flink;
    38.             //Голова списка 'Ldr.InInitializationOrderModuleList' указывает не на начало
    39.             //структуры, а на соответствующий её элемент - на
    40.             //_LDR_DATA_TABLE_ENTRY.InInitializationOrderLinks. И, соответственно, все
    41.             //последующие элементы этого списка соединены так же. Стандартная практика.
    42.             pointer = (PLIST_ENTRY)CONTAINING_RECORD(ldrmod->InLoadOrderModuleList.Flink,
    43.                              LDR_MODULE, InLoadOrderModuleList);
    44.         }
    45.         if((pointer == NULL)||(pointer == start)) { break; }
    46.     }
    47.  
    48.     // Модуль не был найден
    49.     return NULL;
    50. }
    Ну из этой функции легко превратить в GetEntryPoint.
     
  16. 984259h

    984259h New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2007
    Сообщения:
    194
    вот самого себя база
    Код (Text):
    1. HANDLE hModule;
    2. __asm  {
    3.  push ebx                    
    4.  xor  ebx, ebx              
    5.  mov  ebx, fs:[ 0x30 ]       // get a pointer to the PEB
    6.  mov  ebx, [ebx + 0x08 ]   // get PEB->ImageBaseAddress
    7.  mov  [hModule], ebx        
    8.  pop  ebx }
     
  17. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    mov eax,dword ptr fs:[030h]
    mov eax,dword ptr ds:[eax+0ch]
    mov eax,dword ptr ds:[eax+0ch]
    mov eax,dword ptr ds:[eax+01ch]
     
  18. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Ребят. Мне база не нужна. Мне нужна точка входа. EntryPoint.

    Условия 2:
    1. В PE-хидере EntryPoint нет. Он потертый
    2. К файлу обращаться нельзя.
    Как узнать точку входа?
     
  19. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    А я тебе что дал?
     
  20. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Это я к 984259h :)