Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых)

 eXeL@B —› Программирование —› Упаковка dll
Посл.ответ Сообщение

Ранг: 6.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 мая 2006 09:44
· Личное сообщение · #1

Подскажите пожалуйста, в чём отличие упаковки dll от exe ? Как я понимаю, перебазировать экспорт - это еще не всё, надо еще и релоки сохранять. Почему то некоторые пакеры (аспак например) иногда вообще удаляют все релоки, оставив только что то типа 00 00 00 00 08 00 ,а иногда ребилдят... Если просто сохранять их, то упакованная дллка зачастую не работает..



Ранг: 162.2 (ветеран)
Активность: 0.090
Статус: Участник

Создано: 25 мая 2006 10:25
· Личное сообщение · #2

Таблица релоков создаётся при создании программы для конкретного кода. Релоки обрабатывает загрузчик(прибавляет к указанным адресам дельта-смещение). Если код меняется, то загрузчик прибавляет дельту нейзвестно к чему, и в результате получается каша.



Ранг: 12.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 25 мая 2006 10:25
· Личное сообщение · #3

Licos пишет:
Если просто сохранять их, то упакованная дллка зачастую не работает..

Потому как пакеры сами настраивают фиксапы после того, как расшифруют/распакуют все секции... иначе OS сама попробует их настроить после запуска... но ещё до распаковки



Ранг: 20.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 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 - сохранённые релоки проги



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 25 мая 2006 11:32 · Поправил: Smon
· Личное сообщение · #5

NEOx
Спасибо за сорц, давно хотел обработку релоков на сях реализовать
офф: может кинешь сорц для ресурсов ?

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels




Ранг: 6.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 мая 2006 11:35
· Личное сообщение · #6

NEOx
Благодарю, т.е. я так понимаю, что в приведенном коде рассматриваются все случаи ?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 25 мая 2006 11:46
· Личное сообщение · #7

NEOx пишет:
if ((*pW & 0xFFF) == 0xDB1)
__asm NOP

А это зачем?

-----
Yann Tiersen best and do not fuck




Ранг: 44.7 (посетитель)
Активность: 0.040
Статус: Участник

Создано: 25 мая 2006 12:00
· Личное сообщение · #8

Smon пишет:
сорц для ресурсов

А разве рессурсы обрабатываются??
С втатье Криса(путь воина....) что-то про это есть..



Ранг: 20.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 25 мая 2006 12:27
· Личное сообщение · #9

PE_Kill пишет:
А это зачем?

Одну хреновину хотел прикрутить. Можно убрать.

Smon пишет:
офф: может кинешь сорц для ресурсов ?

пиши сюда: 895465. это я тебе вроде обещал дать, но так и не дал)


Licos пишет:
Благодарю, т.е. я так понимаю, что в приведенном коде рассматриваются все случаи ?

да. тебе тока надо сохранить старые релоки, и смещение на них. потом вызвать эту процедуру. она всё настроит.

Keo пишет:
А разве рессурсы обрабатываются??

конечно обрабатываются, тока если ты их сжимаешь.



Ранг: 20.7 (новичок)
Активность: 0.010
Статус: Участник

Создано: 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() будет несколько раз вызываться.



Ранг: 186.8 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 25 мая 2006 13:47
· Личное сообщение · #11

NEOx, а точнее? Сколько раз оно будет вызываться? =)



Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 25 мая 2006 13:52
· Личное сообщение · #12

один, т.к. на последующем упадет ;)



Ранг: 160.1 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 25 мая 2006 15:00
· Личное сообщение · #13

MoonShiner
это зависит от приложения. Как минимум 4 раза (process_attach, thread_attach, thread_detach, process_detach)



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 25 мая 2006 15:08 · Поправил: Smon
· Личное сообщение · #14

Т.е. нужно пропатчивать ep на оеп, чтобы дллка работала ? Теперь понятно, почему аспр не крадет оеп у дллкок

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels



 eXeL@B —› Программирование —› Упаковка dll
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати