Никак не могу найти. Нашел описание структуры Код (Text): UCHAR InheritedAddressSpace; UCHAR ReadImageFileExecOptions; UCHAR BeingDebugged; UCHAR BitField; ULONG ImageUsesLargePages: 1; ULONG IsProtectedProcess: 1; ULONG IsLegacyProcess: 1; ULONG IsImageDynamicallyRelocated: 1; ULONG SpareBits: 4; PVOID Mutant; PVOID ImageBaseAddress; PPEB_LDR_DATA Ldr; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; PVOID SubSystemData; PVOID ProcessHeap; PRTL_CRITICAL_SECTION FastPebLock; PVOID AtlThunkSListPtr; PVOID IFEOKey; ULONG CrossProcessFlags; ULONG ProcessInJob: 1; ULONG ProcessInitializing: 1; ULONG ReservedBits0: 30; union { PVOID KernelCallbackTable; PVOID UserSharedInfoPtr; }; ULONG SystemReserved[1]; ULONG SpareUlong; PPEB_FREE_BLOCK FreeList; ULONG TlsExpansionCounter; PVOID TlsBitmap; ULONG TlsBitmapBits[2]; PVOID ReadOnlySharedMemoryBase; PVOID HotpatchInformation; VOID * * ReadOnlyStaticServerData; PVOID AnsiCodePageData; PVOID OemCodePageData; PVOID UnicodeCaseTableData; ULONG NumberOfProcessors; ULONG NtGlobalFlag; LARGE_INTEGER CriticalSectionTimeout; ULONG HeapSegmentReserve; ULONG HeapSegmentCommit; ULONG HeapDeCommitTotalFreeThreshold; ULONG HeapDeCommitFreeBlockThreshold; ULONG NumberOfHeaps; ULONG MaximumNumberOfHeaps; VOID * * ProcessHeaps; PVOID GdiSharedHandleTable; PVOID ProcessStarterHelper; ULONG GdiDCAttributeList; PRTL_CRITICAL_SECTION LoaderLock; ULONG OSMajorVersion; ULONG OSMinorVersion; WORD OSBuildNumber; WORD OSCSDVersion; ULONG OSPlatformId; ULONG ImageSubsystem; ULONG ImageSubsystemMajorVersion; ULONG ImageSubsystemMinorVersion; ULONG ImageProcessAffinityMask; ULONG GdiHandleBuffer[34]; PVOID PostProcessInitRoutine; PVOID TlsExpansionBitmap; ULONG TlsExpansionBitmapBits[32]; ULONG SessionId; ULARGE_INTEGER AppCompatFlags; ULARGE_INTEGER AppCompatFlagsUser; PVOID pShimData; PVOID AppCompatInfo; UNICODE_STRING CSDVersion; _ACTIVATION_CONTEXT_DATA * ActivationContextData; _ASSEMBLY_STORAGE_MAP * ProcessAssemblyStorageMap; _ACTIVATION_CONTEXT_DATA * SystemDefaultActivationContextData; _ASSEMBLY_STORAGE_MAP * SystemAssemblyStorageMap; ULONG MinimumStackCommit; _FLS_CALLBACK_INFO * FlsCallback; LIST_ENTRY FlsListHead; PVOID FlsBitmap; ULONG FlsBitmapBits[4]; ULONG FlsHighIndex; PVOID WerRegistrationData; PVOID WerShipAssertPtr; } PEB, *PPEB; В PPEB_LDR_DATA там только список дллок. Самого ехе нет. Помогите найти энтрипоинт в пебе. Заранее спс
Где находим? Обошел весь список InLoadOrderModuleList там одни дллки. Базы ехешника нет Поиск в PE мне не подходит. Нужно с PEB-а энтри вытащить
Код (Text): typedef struct _PEB { UCHAR InheritedAddressSpace; // 0 UCHAR ReadImageFileExecOptions; // 1 UCHAR BeingDebugged; // 2 BYTE b003; // 3 PVOID Mutant; // 4 PVOID ImageBaseAddress; // 8 ========то что ты ищешь======= PPEB_LDR_DATA Ldr; // C PPROCESS_PARAMETERS ProcessParameters; // 10 PVOID SubSystemData; // 14 PVOID ProcessHeap; // 18 KSPIN_LOCK FastPebLock; // 1C PPEBLOCKROUTINE FastPebLockRoutine; // 20 PPEBLOCKROUTINE FastPebUnlockRoutine; // 24 ULONG EnvironmentUpdateCount; // 28 PVOID *KernelCallbackTable; // 2C PVOID EventLogSection; // 30 PVOID EventLog; // 34 PPEB_FREE_BLOCK FreeList; // 38 ULONG TlsExpansionCounter; // 3C PRTL_BITMAP TlsBitmap; // 40 ULONG TlsBitmapData[0x2]; // 44 PVOID ReadOnlySharedMemoryBase; // 4C PVOID ReadOnlySharedMemoryHeap; // 50 PTEXT_INFO ReadOnlyStaticServerData; // 54 PVOID InitAnsiCodePageData; // 58 PVOID InitOemCodePageData; // 5C PVOID InitUnicodeCaseTableData; // 60 ULONG KeNumberProcessors; // 64 ULONG NtGlobalFlag; // 68 DWORD d6C; // 6C LARGE_INTEGER MmCriticalSectionTimeout; // 70 ULONG MmHeapSegmentReserve; // 78 ULONG MmHeapSegmentCommit; // 7C ULONG MmHeapDeCommitTotalFreeThreshold; // 80 ULONG MmHeapDeCommitFreeBlockThreshold; // 84 ULONG NumberOfHeaps; // 88 ULONG AvailableHeaps; // 8C PHANDLE ProcessHeapsListBuffer; // 90 PVOID GdiSharedHandleTable; // 94 PVOID ProcessStarterHelper; // 98 PVOID GdiDCAttributeList; // 9C KSPIN_LOCK LoaderLock; // A0 ULONG NtMajorVersion; // A4 ULONG NtMinorVersion; // A8 USHORT NtBuildNumber; // AC USHORT NtCSDVersion; // AE ULONG PlatformId; // B0 ULONG Subsystem; // B4 ULONG MajorSubsystemVersion; // B8 ULONG MinorSubsystemVersion; // BC KAFFINITY AffinityMask; // C0 ULONG GdiHandleBuffer[0x22]; // C4 ULONG PostProcessInitRoutine; // 14C ULONG TlsExpansionBitmap; // 150 UCHAR TlsExpansionBitmapBits[0x80]; // 154 ULONG SessionId; // 1D4 ULARGE_INTEGER AppCompatFlags; // 1D8 PWORD CSDVersion; // 1E0 /* PVOID AppCompatInfo; // 1E4 UNICODE_STRING usCSDVersion; PVOID ActivationContextData; PVOID ProcessAssemblyStorageMap; PVOID SystemDefaultActivationContextData; PVOID SystemAssemblyStorageMap; ULONG MinimumStackCommit; */ } PEB, *PPEB; выделено почему поиск в PE не подходит не могу понять.
Может я что-то не понимаю... Мне нужна точка входа. AddressOfEntryPoint, а не база образа. Поиск в РЕ-хидере не подходит, потому что программа бьет хидер
блин... берешь ImageBaseAddress, он указывает на то место, куда промаппирован твой бинарник, находишь смещение NT-заголовков относительно этого адреса через DOS-заголовок, в NT-заголовках будет смещение EntryPoint относительно этого адреса... бить NT-хедер нельзя, некоторый функционал будет некорректно работать... обнули DOS-заголовок и поставь другое число в сигнатуру NT-заголовка, а также в Magic в опциональном заголовке... этого в принципе достаточно, кому надо будет догадаться, что это PE-файл, тот и так догадается... далее начало NT-заголовка будет это самое число (сигнатура) после серии нулей...
Clerk Подробнее - в какой базе? Rel OptionalHeader.AddressOfEntryPoint - это не подходит. Программа зануляет первые 0x1000 байт образа ехе. Весь MZ и PE хидер занулены. Занулено все вплоть до начала первой секции. Я делаю инжект в эту программу. Нужно как-то альтернативно вытащить оригинальную энтри.
а... ясно... как альтернативный вариант могу предложить такой алгоритм: найти главный поток в программе (самый первый поток в массиве SYSTEM_PROCESS_INFORMATION.aST), и посмотреть у него поле стартового адреса (SYSTEM_THREAD.pStartAddress)... это канеш может и не быть искомой EntryPoint, надо проверить на практике... просто идея, сам не пробовал...
Так в PPEB_LDR_DATA - списке вообще должен быть ехе-модуль(у меня находит) - или его сама прога почикала? хм...
Прога только заголовок чикает. Если не сложно, можете дать простейший код поиска ехе в PPEB_LDR_DATA?
Эта тема обсуждалась здесь http://wasm.ru/forum/viewtopic.php?id=36963&p=1 Код (Text): HMODULE MyGetModuleHandleW(LPCWSTR lpModuleName) { PPEB peb = (PPEB)NtGetPeb();//MyCurrentPeb(); // Если пользователь желает получить базовый адрес текущего модуля if(lpModuleName == NULL) { return (HMODULE)peb->ImageBaseAddress; } WCHAR strwModuleName[256]; WCHAR *strwP; wcscpy(strwModuleName,lpModuleName); strwP = &strwModuleName[wcslen(strwModuleName)-4]; if(wcsicmp(strwP,L".dll")!=0) wcscat(strwModuleName,L".dll"); // Если пользователь желает получить базовый адрес dll, то // ищем в цикле по имени модуля PPEB_LDR_DATA ldrpeb = peb->Ldr;//peb->LoaderData; PLIST_ENTRY pointer = ldrpeb->InLoadOrderModuleList.Flink; PLIST_ENTRY start = ldrpeb->InLoadOrderModuleList.Flink; PLDR_MODULE ldrmod = NULL; PWSTR dllname = NULL; while(1) { ldrmod = (PLDR_MODULE)pointer; dllname = ldrmod->BaseDllName.Buffer; //TEST!!! printf("Module: %S - EntryPoint: 0x%08X\n",dllname,ldrmod->EntryPoint); //TEST!!! if((dllname) && (_wcsicmp(strwModuleName, dllname) == 0)) { return (HMODULE)ldrmod->BaseAddress; } //else { pointer = ldrmod->ModuleList.Flink; } else { //pointer = ldrmod->InLoadOrderModuleList.Flink; //Голова списка 'Ldr.InInitializationOrderModuleList' указывает не на начало //структуры, а на соответствующий её элемент - на //_LDR_DATA_TABLE_ENTRY.InInitializationOrderLinks. И, соответственно, все //последующие элементы этого списка соединены так же. Стандартная практика. pointer = (PLIST_ENTRY)CONTAINING_RECORD(ldrmod->InLoadOrderModuleList.Flink, LDR_MODULE, InLoadOrderModuleList); } if((pointer == NULL)||(pointer == start)) { break; } } // Модуль не был найден return NULL; } Ну из этой функции легко превратить в GetEntryPoint.
вот самого себя база Код (Text): HANDLE hModule; __asm { push ebx xor ebx, ebx mov ebx, fs:[ 0x30 ] // get a pointer to the PEB mov ebx, [ebx + 0x08 ] // get PEB->ImageBaseAddress mov [hModule], ebx pop ebx }
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]
Ребят. Мне база не нужна. Мне нужна точка входа. EntryPoint. Условия 2: 1. В PE-хидере EntryPoint нет. Он потертый 2. К файлу обращаться нельзя. Как узнать точку входа?