![]() |
eXeL@B —› Вопросы новичков —› Как правильно снять дамп с DLL |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 27 июня 2006 13:08 · Личное сообщение · #1 Пытаюсь распаковать DLL запакованную PECompact v1.x (какая точно не знаю). Вобoм нашел я в OllyDbg оригинальную DllEntryPoint и вот как ни пытался снять нормальны дамп - ничего не выходит, все время получается не валидный PE файл ![]() На всяк случай эта самая Dll ![]() ![]() |
|
Создано: 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-ми версиями ![]() ![]() |
|
Создано: 27 июня 2006 18:38 · Личное сообщение · #3 Dll дампится точно также как exe, только дампу нужно прописать потом ImageBase при котором dll была загружена в память во время дампа, а также обратить внимание на тот факт что у DLL должны быть релоки, иначе ее можно будет загрузить только по той же базе по которой она была загружена в момент дампа ![]() |
|
Создано: 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-файлов, они устроены по-другому. ЗЫ Пишу редактор релоков, поэтому тема для меня насущная. =) ----- Всем привет, я вернулся ![]() |
|
Создано: 27 июня 2006 20:03 · Личное сообщение · #5 |
|
Создано: 28 июня 2006 09:28 · Личное сообщение · #6 |
|
Создано: 28 июня 2006 14:04 · Личное сообщение · #7 |
|
Создано: 28 июня 2006 14:34 · Личное сообщение · #8 |
|
Создано: 28 июня 2006 15:21 · Личное сообщение · #9 |
|
Создано: 28 июня 2006 15:45 · Личное сообщение · #10 |
|
Создано: 28 июня 2006 16:35 · Личное сообщение · #11 |
|
Создано: 28 июня 2006 16:48 · Личное сообщение · #12 |
|
Создано: 28 июня 2006 17:28 · Поправил: ppetroff · Личное сообщение · #13 Накропал по-быстрому в Delphi мини-dll указав нужный imagebase {$IMAGEBASE $00780000}, загружаю ее - она нормально грузится по указанному адресу (смотрю Lord PE), засада в том что исследуемая dll в OllyDBG все равно ТОЖЕ грузится по тому же адресу! Как пофиксить? Почитав хелп по опциям компилятора Delphi ничего про "пострипать релоки" не нашел ![]() ![]() |
|
Создано: 28 июня 2006 17:46 · Личное сообщение · #14 ppetroff пишет: Неужели нет стандартных средств? Плаг в PETools однако. Таблицу сделал - кто хочет, может проверить ... Прямо из уже распакованной. ![]() ![]() |
|
Создано: 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+ =). ----- Всем привет, я вернулся ![]() |
|
Создано: 28 июня 2006 18:29 · Личное сообщение · #16 |
|
Создано: 28 июня 2006 19:00 · Личное сообщение · #17 |
|
Создано: 29 июня 2006 09:56 · Личное сообщение · #18 |
|
Создано: 29 июня 2006 10:23 · Личное сообщение · #19 |
|
Создано: 29 июня 2006 11:14 · Личное сообщение · #20 ppetroff пишет: засада в том что исследуемая dll в OllyDBG все равно ТОЖЕ грузится по тому же адресу! Как пофиксить? Так надо грузить в рамках одного процесса. Напиши аналог loaddll.exe и запускай ее в олли. Можно поменять размер последней секции(VSize) и длину образа ( SizeofImage). Только аккуратнее - lordpe правит длину без учета выравнивания и в 2000-м получается нерабочий экзе. Да, если не знаешь, вызываешь loaddll.exe <имя dll>. Кстати, у loadddl релоки пострипаны и плаг восстанавливает очень мало ![]() ![]() ![]() |
|
Создано: 29 июня 2006 11:26 · Поправил: ppetroff · Личное сообщение · #21 |
|
Создано: 29 июня 2006 11:43 · Личное сообщение · #22 Bitfry Релоки лежат по смещению 2C000. Вот алго как посчитать размер:
Всё, пишем их в Base reloc RVA, Size. У меня ДЛЛ грузилась по адресу 3B0000, поэтому я поменял Image Base на 3B0000 и всё работает. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 29 июня 2006 11:47 · Личное сообщение · #23 |
|
Создано: 29 июня 2006 14:43 · Личное сообщение · #24 |
|
Создано: 29 июня 2006 15:10 · Личное сообщение · #25 |
|
Создано: 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 ![]() |
|
Создано: 29 июня 2006 16:14 · Личное сообщение · #27 PE_Kill пишет: А вот тут ты сильно заблуждаешься. Это как раз релоки, только пакер их формат изменил. Сейчас пишу алго (выдрал из пакера) которое их восстановит. Ладно, ладно, не буду спорить - ты крут =). Возникает один вопрос, зачем оно нужно? Если только для тренировки мозгов... Но лучше тренироваться, на чём-нибудь полезном типа - сложный прот расковырять. ;) ЗЫ А вообще для сканера полезная инфа. Есть смысл искать не сами куски релоков, а массив структур IMAGE_BASE_RELOCATION и уже потом в них разбираться. ----- Всем привет, я вернулся ![]() |
|
Создано: 29 июня 2006 17:43 · Личное сообщение · #28 |
|
Создано: 30 июня 2006 06:42 · Личное сообщение · #29 Bitfry пишет: Но лучше тренироваться, на чём-нибудь полезном типа - сложный прот расковырять. ;) Ну дык ковыряю, но не могу пройти мимо, когда пытаются импреком импорт восстановить в pecompact или aspack, или когда в простеньком пакере релоки восстанавливают релоксами, сравнениями дампов и т.д. > Возникает один вопрос, зачем оно нужно? А это для тренировки как раз. Я ничем не пользовался, чисто на глаз определил что это релоки, хотя не особо и похожи, да и ты смутился. Просто я время от времени занимаюсь релоками разных пакеров/протекторов так сказать руку набиваю. Даже писал тулзу для этого, потом ее вшил в свой анпакер ASPack'а (который full reconstruct), а исходники похерил. А рипать код из анпакера (исходный) как то лень. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 28 августа 2007 23:04 · Личное сообщение · #30 |
. 1 . 2 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Как правильно снять дамп с DLL |