Показано с 1 по 10 из 13
Комбинированный просмотр
-
11.11.2024, 17:48 #1
- Регистрация
- 18.04.2018
- Адрес
- HP-Compaq DX2300 microtower PC
- Сообщений
- 269
- Сказал(а) спасибо
- 69
- Поблагодарили 1818 раз(а) в 397 сообщениях
Re: универсальный патчер памяти процесса для линукса
в файле glibc-src/elf/dl-reloc.c находим строку "relocation processing: %s":
в процедуре
_dl_relocate_object (struct link_map *l, struct r_scope_elem *scope[], int reloc_mode, int consider_profiling)
написано:
Код:if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_RELOC, 0)) _dl_debug_printf ("\nrelocation processing: %s%s\n", l->l_name[0] ? l->l_name : rtld_progname, lazy ? " (lazy)" : ""); /* DT_TEXTREL is now in level 2 and might phase out at some time. But we rewrite the DT_FLAGS entry to a DT_TEXTREL entry to make testing easier and therefore it will be available at all time. */ if (__builtin_expect (l->l_info[DT_TEXTREL] != NULL, 0)) { /* Bletch. We must make read-only segments writable long enough to relocate them. */ const ElfW(Phdr) *ph; for (ph = l->l_phdr; ph < &l->l_phdr[l->l_phnum]; ++ph) if (ph->p_type == PT_LOAD && (ph->p_flags & PF_W) == 0) { /* read-only секция выполняемого кода (p_type==PT_LOAD) будет сделана writable перед патчингом, он же relocation; сделает это функция __mprotect */ struct textrels *newp; newp = (struct textrels *) alloca (sizeof (*newp)); newp->len = (((ph->p_vaddr + ph->p_memsz + GLRO(dl_pagesize) - 1) & ~(GLRO(dl_pagesize) - 1)) - (ph->p_vaddr & ~(GLRO(dl_pagesize) - 1))); newp->start = ((ph->p_vaddr & ~(GLRO(dl_pagesize) - 1)) + (caddr_t) l->l_addr); if (__mprotect (newp->start, newp->len, PROT_READ|PROT_WRITE) < 0) // секция выполняемого кода writable если функция __mprotect вернёт код возврата >=0 { errstring = N_("cannot make segment writable for relocation"); call_error: _dl_signal_error (errno, l->l_name, NULL, errstring); } #if (PF_R | PF_W | PF_X) == 7 && (PROT_READ | PROT_WRITE | PROT_EXEC) == 7 newp->prot = (PF_TO_PROT >> ((ph->p_flags & (PF_R | PF_W | PF_X)) * 4)) & 0xf; #else newp->prot = 0; if (ph->p_flags & PF_R) newp->prot |= PROT_READ; if (ph->p_flags & PF_W) newp->prot |= PROT_WRITE; if (ph->p_flags & PF_X) newp->prot |= PROT_EXEC; #endif newp->next = textrels; textrels = newp; } }
"кинжал хорош для того, у кого он есть, и плохо тому у кого он не окажется в нужное время"
Похожие темы
-
уни-патч для линукса и для макоси
от HPDX2300 в разделе Установка и администрирование 1С - ПредприятиеОтветов: 48Последнее сообщение: 18.10.2024, 15:23 -
Проблема с размером процесса
от denis.zubarev. в разделе Конфигурирование, программирование 1С - ПредприятиеОтветов: 2Последнее сообщение: 22.07.2013, 16:14 -
Запись игрового процесса с компа
от Deus Ex в разделе Железо (hardware)Ответов: 40Последнее сообщение: 10.05.2013, 21:56 -
Патчер для 7%ЕСХН
от ЛюдмилаЧ в разделе ПолезностиОтветов: 0Последнее сообщение: 31.01.2011, 15:37 -
Установка Линукса.
от Большой Брат в разделе LINUXОтветов: 18Последнее сообщение: 09.11.2007, 05:26
Социальные закладки