Сейчас на форуме: vsv1, _MBK_ (+3 невидимых)

 eXeL@B —› Вопросы новичков —› Как правильно снять дамп с DLL
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 56.4 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 27 июня 2006 13:08
· Личное сообщение · #1

Пытаюсь распаковать DLL запакованную PECompact v1.x (какая точно не знаю). Вобoм нашел я в OllyDbg оригинальную DllEntryPoint и вот как ни пытался снять нормальны дамп - ничего не выходит, все время получается не валидный PE файл По форуму искал, ничего похожего не нашел (обычно все вопросы сосредаточены на поиске EP и востановлении импорта, а такой простой вещи ни где нет). Помогите разобраться...
На всяк случай эта самая Dll

4e9e_27.06.2006_CRACKLAB.rU.tgz - UiSupport.zip



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 27 июня 2006 16:09
· Личное сообщение · #2

На выбор - результат в аттаче или в олли делаешь hr ESP-24 ( а не -4 как везде советуют)
и 2-й останов на команде popfd и тут же недалеко RET 4 на точку входа.
Переход на точку входа нашел после безуспешных трассировок, путем визуального просмотра кода.
Посмотрел что в ESP - вот вам и алгоритм. Спасибо за интересную задачку. Сегодня я поднялся на 1 ступеньку вверх про лестнице крака
-----------------------------------------------------------
DLL написана на Дельфи 6.0, DeDe плохо ее берет, но TDCP_rijndael TDCP_hash TDCP_blockcipher и
TDCP_sha1 видит. Это подтверждает kanal из PEID2006.
-----------------------------------------------------------
Кстати подумалось, что алгоритм типа :
доходим до PUSHAD , выполняем ее и ставим HR ESP
более универсален, т.к. HR ESP-4 в данном случае брякается безостановочно где попало ?!
----------------------------------------------------------
P.S. unpecompact 1.32 c DLL не работает, а unpecompact2 работает со 2-ми версиями


08fb_27.06.2006_CRACKLAB.rU.tgz - UiSupport_.zip



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

Создано: 27 июня 2006 18:38
· Личное сообщение · #3

Dll дампится точно также как exe, только дампу нужно прописать потом ImageBase при котором
dll была загружена в память во время дампа, а также обратить внимание на тот факт что у DLL должны быть
релоки, иначе ее можно будет загрузить только по той же базе по которой она была загружена в момент
дампа



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

Создано: 27 июня 2006 19:51 · Поправил: Bitfry
· Личное сообщение · #4

tundra37
Релоки не создал (будем подниматься ещё выше ;) ).
Получается:
Asterix пишет:
ее можно будет загрузить только по той же базе по которой она была загружена в момент дампа


А для dll, это совсем нехорошо!

Нужно воспользоваться утилитой типа ReloX.
Придётся:
- принудительно замапить dll на 2 разные базы.
- распаковать их обе
- ReloX, сравнивая их, создаст новую директорию релоков.

Немного теории.
PE-формат предполагает загрузку образа не только по значению из ImageBase. Exe-файлы обычно не используют такую возможность, а вот dll вынуждены, так как заранее определить свободное виртуальное пространство для размещения образа библиотеки не всегда возможно. Кроме того, система кеширует dll и я столкнулся с тем, что при повторной загрузке некоторых программ, dll мапится, игнорируя ImageBase, на первые свободные VA (отведённые для dll). Я уже писал, что предполагаю здесь замысел дефрагментации виртуального адресного пространства (хотя суть мне не ясна).

Пояснения для новичков.
Весь код dll должен быть отвязан от базы размещения кода.
Пример команды (разумеется, не все =):
jmp [offset] (опкод FF25)
call [offset] (FF15)
или просто таблицы, сгенерированные для операторов switch
dd offset
dd offset
...

Здесь offset - абсолютный эффективный адрес. То есть когда указывается не относительное смещение от текущей команды до места назначения, а, допустим, dd 00720010.
Если базовый адрес изменяется, то такие offset'ы нуждаются в коррекции. Это и называется "релокация образа".
В PE-файлах предусмотрена директория релоков (она же Fixup Table).
В случае если был STATUS_CONFLICTING_ADDRESSES, загрузчик выясняет, есть ли директория релоков и есть ли у неё размер. Если всё правильно, он выполняет коррекцию смещений, указанных в этой таблице. Если нет, dll не будет загружена.

Так вот запакованные dll, могут иметь всего лишь один релок (как в этом случае). Протектор сам корректирует образ, если это нужно. Он просто вычитает из эталонного значения текущее значение этого единственного пофиксенного offset'a, получая таким образом дельту для всех необходимых исправлений.

Подробно об устройстве таблицы релоков можно прочесть в:
статье "об упаковщиках в последний раз",
у CyberManiac'а в "Теоретические основы крэкинга".
И не вздумайте брать инфу из доки M$, так как там описаны релоки obj-файлов, они устроены по-другому.

ЗЫ Пишу редактор релоков, поэтому тема для меня насущная. =)

-----
Всем привет, я вернулся




Ранг: 56.4 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 27 июня 2006 20:03
· Личное сообщение · #5

Спасибо.




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

Создано: 28 июня 2006 09:28
· Личное сообщение · #6

Там релоки в чистом виде, пересчитываем размер и всё. Зачем новые создавать?

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




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

Создано: 28 июня 2006 14:04
· Личное сообщение · #7

tundra37
Где взять unpecompact2 ?
Заранее спасибо!



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

Создано: 28 июня 2006 14:34
· Личное сообщение · #8

Bitfry пишет:
И не вздумайте брать инфу из доки M$, так как там описаны релоки obj-файлов


гон какой-то

Инфу нужно брать из заголовков MS VC/VS или SDK
а также статей про формат PE типа:
Inside Windows
An In-Depth Look into the Win32 Portable Executable File Format
Matt Pietrek



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 28 июня 2006 15:21
· Личное сообщение · #9

ppetroff пишет:
Где взять unpecompact2 ?



ed12_28.06.2006_CRACKLAB.rU.tgz - unpec2.tgz



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 28 июня 2006 15:45
· Личное сообщение · #10

Блин, а PESniffer 3.2b из PETools говорит, что упаковано Exe Shield v1.7
Правда сигнатуры 2003 года. Придется все выверять.



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

Создано: 28 июня 2006 16:35
· Личное сообщение · #11

Раз пошла такая пьянка (кстати спасибо tundra37 за файл) - у меня вопрос: как загрузить DLL в OllyDbg на другой ImageBAse (руками этой dll PE заголовок временно изменить?) с целью кормить потом дампами reloX? Неужели нет стандартных средств?



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

Создано: 28 июня 2006 16:48
· Личное сообщение · #12

загрузить на тот адрес на который в первый раз грузилась длл фейковую ДЛЛ, при компиляции
ее указать нужный ImageBase и пострипать релоки указав специальный ключ



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

Создано: 28 июня 2006 17:28 · Поправил: ppetroff
· Личное сообщение · #13

Накропал по-быстрому в Delphi мини-dll указав нужный imagebase {$IMAGEBASE $00780000}, загружаю ее - она нормально грузится по указанному адресу (смотрю Lord PE), засада в том что исследуемая dll в OllyDBG все равно ТОЖЕ грузится по тому же адресу! Как пофиксить? Почитав хелп по опциям компилятора Delphi ничего про "пострипать релоки" не нашел Ткните носом.



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 28 июня 2006 17:46
· Личное сообщение · #14

ppetroff пишет:
Неужели нет стандартных средств?

Плаг в PETools однако. Таблицу сделал - кто хочет, может проверить ...
Прямо из уже распакованной.

f083_28.06.2006_CRACKLAB.rU.tgz - UiSupport_rel.zip



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

Создано: 28 июня 2006 18:26
· Личное сообщение · #15

Asterix пишет:
гон какой-то

=)
Хорошо поясню.
Написал так, потому что уже не один человек логично поступил, как я в первый раз.
Не имея под рукой MSDN, лезем на wasm, там сразу находим архивчик с подборкой инфы о PE:
===
Документация по PE-файлам by Microsoft Corp/Bernd Luevelsmeyer/Hard Wisdom
В этом файле будут лежать все документы по формату PE-файлов, достойные внимания. Лежит документ от Bernd Luevelsmeyer версия 1.7 - одно из самых лучших описаний формата + великолепный пример по сборке PE-файла РУКАМИ. Также приложена официальная документация от MS по PE/COFF/CLR-форматам...
===
Так вот в этом архиве есть файл PECOFF.pdf, там описаны релоки объектных файлов.

Это потом я взялся читать Петрика и LUEVELSMEYER'a =). Кстати, всем рекомендую.

PE_Kill пишет:
Там релоки в чистом виде, пересчитываем размер и всё. Зачем новые создавать?

Ты о чём, что-то я совсем не пойму?

ppetroff
Прочитай инструкцию к ReloX'у.

tundra37 пишет:
Таблицу сделал - кто хочет, может проверить ...

Мой редактор (на днях первый рабочий exe получился =), говорить, что всё на 5+ =).

-----
Всем привет, я вернулся




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 28 июня 2006 18:29
· Личное сообщение · #16

Ага! Нашел в QUnpack сигнатуры 2006 года для PESniffer 2006 года. EXE Shield однако показывает.
Кстати сниффер в QUnpack-e нормально PECompact показывает, только ОЕР не находит.



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

Создано: 28 июня 2006 19:00
· Личное сообщение · #17

ppetroff пишет:
засада в том что исследуемая dll в OllyDBG все равно ТОЖЕ грузится по тому же адресу!


такого не может быть




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

Создано: 29 июня 2006 09:56
· Личное сообщение · #18

Bitfry пишет:
Ты о чём, что-то я совсем не пойму?

Я о том, что релоки там как были так и есть, просто их надо найти и посчитать размер.

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




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

Создано: 29 июня 2006 10:23
· Личное сообщение · #19

PE_Kill пишет:
Я о том, что релоки там как были так и есть

Подскажи смещение?

-----
Всем привет, я вернулся




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 29 июня 2006 11:14
· Личное сообщение · #20

ppetroff пишет:
засада в том что исследуемая dll в OllyDBG все равно ТОЖЕ грузится по тому же адресу! Как пофиксить?

Так надо грузить в рамках одного процесса. Напиши аналог loaddll.exe и запускай ее в олли.
Можно поменять размер последней секции(VSize) и длину образа ( SizeofImage). Только аккуратнее - lordpe правит длину без учета выравнивания и в 2000-м получается нерабочий экзе.
Да, если не знаешь, вызываешь loaddll.exe <имя dll>.
Кстати, у loadddl релоки пострипаны и плаг восстанавливает очень мало Это просто к слову - я хотел сначала исправить ImageBase в лоаддлл, но получил облом.

86fd_29.06.2006_CRACKLAB.rU.tgz - loaddll1.exe



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

Создано: 29 июня 2006 11:26 · Поправил: ppetroff
· Личное сообщение · #21

tundra37
Спасибо за наводку, именно этим плагином восстановил релоки на ура в моей dll !!! (Спасибо авторам)

В связи с чем чисто ради спортивного интереса буду пытаться восстановить их через Relox,
еще раз спасибо!




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

Создано: 29 июня 2006 11:43
· Личное сообщение · #22

Bitfry Релоки лежат по смещению 2C000. Вот алго как посчитать размер:

procedure TForm1.Button1Click(Sender: TObject);
var dwBase:DWORD;
pPointer:PDWORD;
i:Integer;
dwSize:Integer;
begin
dwBase:=LoadLibraryEx('c:\PE_Kill\Dumped_p.dll',0,DONT_RESOLVE_DLL_REF ERENCES);
// $002C000 - Оффсет на релоки
pPointer:=Pointer(dwBase+$002C000+4);
dwSize:=0;
repeat
dwSize:=dwSize+pPointer^;
pPointer:=Pointer(DWORD(pPointer)+pPointer^);
until pPointer^=0;
ShowMessage(IntToHex(dwSize,8));
FreeLibrary(dwBase);
end;

Всё, пишем их в Base reloc RVA, Size. У меня ДЛЛ грузилась по адресу 3B0000, поэтому я поменял Image Base на 3B0000 и всё работает.

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





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

Создано: 29 июня 2006 11:47
· Личное сообщение · #23

PS Хотя я поторопился, какието релоки странные, надо посмотреть...

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




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

Создано: 29 июня 2006 14:43
· Личное сообщение · #24

PE_Kill пишет:
надо посмотреть...

А чего там смотреть. Это не релоки.
У релоков в блоках массив word, каждый из которых начинается на 3 (если конечно тип HIGHLOW) в hex-редакторе сразу видно.
Я в редакторе сканер простенький сделал (то есть делаю =).

-----
Всем привет, я вернулся





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

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

Bitfry пишет:
А чего там смотреть. Это не релоки.

А вот тут ты сильно заблуждаешься. Это как раз релоки, только пакер их формат изменил. Сейчас пишу алго (выдрал из пакера) которое их восстановит.

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





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

Создано: 29 июня 2006 15:38
· Личное сообщение · #26

Всё, восстановил. Вот алго.

procedure TForm1.Button1Click(Sender: TObject);
var dwBase:DWORD;
pPointer:PDWORD;
i:Integer;
dwSize:Integer;
dwBlockSize:DWORD;
wLastRel:WORD;
wCurRel:WORD;
begin
dwBase:=LoadLibraryEx('c:\Dumped_p.dll',0,DONT_RESOLVE_DLL_REFERENCES) ;
// $002C000 - îôñåò íà ðåëîêè
pPointer:=Pointer(dwBase+$002C000+4);
dwSize:=0;
repeat
dwBlockSize:=(pPointer^-8) div 2;
dwSize:=dwSize+pPointer^;
pPointer:=Pointer(DWORD(pPointer)+2);
wLastRel:=0;
for i:=1 to dwBlockSize do
begin
pPointer:=Pointer(DWORD(pPointer)+2);
wCurRel:=WORD(pPointer^);
wCurRel:=wCurRel+wLastRel;
wLastRel:=wCurRel;
MoveMemory(pPointer,@wCurRel,2);
end;
pPointer:=Pointer(DWORD(pPointer)+2+4);
until pPointer^=0;
ShowMessage(IntToHex(dwSize,8));
FreeLibrary(dwBase);
end;
Правда сохранение не сделал, в ольке дебажил, от туда прямо из буфера результат и выдрал и WinHex-ом вставил. Теперь всё работает 100%.

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




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

Создано: 29 июня 2006 16:14
· Личное сообщение · #27

PE_Kill пишет:
А вот тут ты сильно заблуждаешься. Это как раз релоки, только пакер их формат изменил. Сейчас пишу алго (выдрал из пакера) которое их восстановит.

Ладно, ладно, не буду спорить - ты крут =).
Возникает один вопрос, зачем оно нужно? Если только для тренировки мозгов...
Но лучше тренироваться, на чём-нибудь полезном типа - сложный прот расковырять. ;)

ЗЫ А вообще для сканера полезная инфа. Есть смысл искать не сами куски релоков, а массив структур IMAGE_BASE_RELOCATION и уже потом в них разбираться.

-----
Всем привет, я вернулся




Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 29 июня 2006 17:43
· Личное сообщение · #28

Ну а мне стало интересно, как плагин с этой задачей справился. Откуда он инфу взял ?! Буду ковырять.




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

Создано: 30 июня 2006 06:42
· Личное сообщение · #29

Bitfry пишет:
Но лучше тренироваться, на чём-нибудь полезном типа - сложный прот расковырять. ;)

Ну дык ковыряю, но не могу пройти мимо, когда пытаются импреком импорт восстановить в pecompact или aspack, или когда в простеньком пакере релоки восстанавливают релоксами, сравнениями дампов и т.д.

> Возникает один вопрос, зачем оно нужно?
А это для тренировки как раз. Я ничем не пользовался, чисто на глаз определил что это релоки, хотя не особо и похожи, да и ты смутился. Просто я время от времени занимаюсь релоками разных пакеров/протекторов так сказать руку набиваю. Даже писал тулзу для этого, потом ее вшил в свой анпакер ASPack'а (который full reconstruct), а исходники похерил. А рипать код из анпакера (исходный) как то лень.

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





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

Создано: 28 августа 2007 23:04
· Личное сообщение · #30

tundra37
в каких случая применять hr esp-24, а в каких hr esp-4? и как понять что конкретно выбрать.
В статье битхака это не написано


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


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