Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Упаковка dll |
Посл.ответ | Сообщение |
|
Создано: 25 мая 2006 09:44 · Личное сообщение · #1 Подскажите пожалуйста, в чём отличие упаковки dll от exe ? Как я понимаю, перебазировать экспорт - это еще не всё, надо еще и релоки сохранять. Почему то некоторые пакеры (аспак например) иногда вообще удаляют все релоки, оставив только что то типа 00 00 00 00 08 00 ,а иногда ребилдят... Если просто сохранять их, то упакованная дллка зачастую не работает.. ![]() ![]() |
|
Создано: 25 мая 2006 10:25 · Личное сообщение · #2 |
|
Создано: 25 мая 2006 10:25 · Личное сообщение · #3 |
|
Создано: 25 мая 2006 10:50 · Личное сообщение · #4 Licos вот те пример настройки, стоит в моём пакере: inline void ProcessRelocs() { WORD *pW; UINT i; DWORD dwItems; PIMAGE_NT_HEADERS pPeh; PIMAGE_BASE_RELOCATION pIBR; pPeh = GetNtHeader((LPVOID)dwLoadAddress); pIBR = (PIMAGE_BASE_RELOCATION)(globals.dwRVARelocs + dwLoadAddress); DWORD dwDelta = (dwLoadAddress - pPeh->OptionalHeader.ImageBase); // No relocation problem if(dwDelta == 0) return; while (pIBR->VirtualAddress) { // get relocation item count of current block dwItems = (pIBR->SizeOfBlock - sizeof(IMAGE_BASE_RELOCATION)) / sizeof(WORD); if (!dwItems) break; // apply relocation items to virtual image pW = (PWORD)(pIBR + 1); for (i = 0; i < dwItems; i++) { if ((*pW & 0xFFF) == 0xDB1) __asm NOP if ((*pW >> 12) == IMAGE_REL_BASED_HIGHLOW) *(PDWORD)((DWORD)dwLoadAddress + pIBR->VirtualAddress + (*pW & 0xFFF)) += dwDelta; ++pW; // next relocation item } // set pIBR where another block could start pIBR = MakePtr(PIMAGE_BASE_RELOCATION, pIBR, pIBR->SizeOfBlock); } return; } dwLoadAddress - адрес загрузки Dll globals.dwRVARelocs - сохранённые релоки проги ![]() |
|
Создано: 25 мая 2006 11:32 · Поправил: Smon · Личное сообщение · #5 |
|
Создано: 25 мая 2006 11:35 · Личное сообщение · #6 |
|
Создано: 25 мая 2006 11:46 · Личное сообщение · #7 |
|
Создано: 25 мая 2006 12:00 · Личное сообщение · #8 |
|
Создано: 25 мая 2006 12:27 · Личное сообщение · #9 PE_Kill пишет: А это зачем? Одну хреновину хотел прикрутить. Можно убрать. Smon пишет: офф: может кинешь сорц для ресурсов ? пиши сюда: 895465. это я тебе вроде обещал дать, но так и не дал) Licos пишет: Благодарю, т.е. я так понимаю, что в приведенном коде рассматриваются все случаи ? да. тебе тока надо сохранить старые релоки, и смещение на них. потом вызвать эту процедуру. она всё настроит. Keo пишет: А разве рессурсы обрабатываются?? конечно обрабатываются, тока если ты их сжимаешь. ![]() |
|
Создано: 25 мая 2006 12:35 · Личное сообщение · #10 Licos кста, в точке входа не забудь сделать что-то типа этого: // globals BOOL bFirst = FALSE; // loader entry point void __stdcall StubEntryPoint() { // DLL ret if(bFirst) return; // End MainLoader(); } и перед переходом на OEP, установить флаг: inline void JumpToOEP() { bFirst = TRUE; // jump to OEP globals.dwOEP += dwLoadAddress; __asm PUSH gev.dwOEP __asm RET return; } а то после распаковки кода, будешь ещё раз распаковывать уже распакованный код ) ибо StubEntryPoint() будет несколько раз вызываться. ![]() |
|
Создано: 25 мая 2006 13:47 · Личное сообщение · #11 |
|
Создано: 25 мая 2006 13:52 · Личное сообщение · #12 |
|
Создано: 25 мая 2006 15:00 · Личное сообщение · #13 |
|
Создано: 25 мая 2006 15:08 · Поправил: Smon · Личное сообщение · #14 |
![]() |
eXeL@B —› Программирование —› Упаковка dll |