Сейчас на форуме: asfa, bartolomeo (+6 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Подскажите по теории распака. |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 24 апреля 2012 01:50 · Поправил: Kuzya69 · Личное сообщение · #1 Проблема в следующем. Нашел ОЕП, сдампил, вроде разобрался с ресурсами (был один инвалидный адрес, оказался ExitProcess), но не запускается. Нашел первый "косяк" Внутри распака и оригинала есть такое. Code:
В оригинале, соответственно эта пп-мма выполняется. А в распаке этой секции просто нет, вот и вылетает при запуске. Как мне поступить? Вернее как-бы Вы поступили? ![]() |
|
Создано: 24 апреля 2012 02:05 · Поправил: tihiy_grom · Личное сообщение · #2 Так как адрес $003864C6 меньше чем стандартная ImageBase у модуля ($00400000), то обычно пакеры выделяют этот участок памяти через VirtualAlloc. Поэтому можно сначала посмотреть размер этого региона памяти, добавить секцию такого же размера к экзешнику, дождаться пока пакер соберётся выделить память, и после VirtualAlloc подменить получившийся адрес на адрес этой нашей новой секции. Как-то так. Не мешало бы уточнить что за пакер, ну и саму программу выложить. А то гадать можно долго. ![]() |
|
Создано: 24 апреля 2012 02:47 · Личное сообщение · #3 |
|
Создано: 24 апреля 2012 10:28 · Личное сообщение · #4 Code:
Это крипта PCGuard'а. Расшифровывает код идущий после этого вызова и выполняет его: Code:
У этих продуктов под PCGuard вроде ещё VMProtect и/или Virtualizer ))) ![]() |
|
Создано: 24 апреля 2012 13:06 · Личное сообщение · #5 |
|
Создано: 25 апреля 2012 15:45 · Поправил: Kuzya69 · Личное сообщение · #6 NikolayD Спасибо, но...... Чуть поподробнее можно объяснить. Вижу что в вашем коде переадресована подпрограмма Code:
Наверно имеется ввиду перенос кода из участка 00376668..., в участок 00E26668..., с созданием там секции? Но где вот это лежит, или лежать должно, и что с этим делать? Code:
Или имелось ввиду именно то-что я выделил в предыдущем коде, просто ошиблись? Я еще новичек, и с двух слов не всегда понимаю. AKAB Спасибо, интересный тутор. Но возникла проблема. Там перед вызовом функции VirtualAlloc, автор изменяет свойства окна, (WinXP=5.1 ---> Win7=6.1) в GetVersionExA. А на моей программе этот "финт ушами" не проходит. У меня VirtualAlloc вызывается раньше чем GetVersionExA. Но все равно спасибо. Пока пробую "адаптировать" способ под свой случай. ![]() |
|
Создано: 25 апреля 2012 16:21 · Личное сообщение · #7 Крипта работает так, что сначала расшифрованный участок выполняется и затем снова шифруется. Ну как-то так: Code:
Таким образом получается тебе нужно выполнить расшифровку (просто установить железный/мемори бряк на байт идущий после вызова), перенести код в свой дамп и занопить обе процедуры. ![]() |
|
Создано: 25 апреля 2012 16:41 · Поправил: Kuzya69 · Личное сообщение · #8 |
|
Создано: 25 апреля 2012 16:53 · Личное сообщение · #9 |
![]() Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 25 апреля 2012 18:21 · Личное сообщение · #10 |
|
Создано: 26 апреля 2012 01:10 · Поправил: Kuzya69 · Личное сообщение · #11 tihiy_grom Вы писали добавить секцию такого же размера к экзешнику, дождаться пока пакер соберётся выделить память, и после VirtualAlloc подменить получившийся адрес на адрес этой нашей новой секции. А нельзя через VirtualAlloc добавить секцию? Зачем там параметр "Базовый адрес"? Пробовал в Олли изменить это значение перед вызовом VirtualAlloc, возвращается ошибка (00000000). Пробовал задать базовый адрес такой-же, который автоматом создается. То-есть перед вызовом базовый адрес задается NUL, а возвращается 00360000. Я пробовал перед вызовом подменить базовый адрес сразу на 00360000, но АПИ вернула ошибку (00000000). Если все мои действия неверны, то как нужно создавать секцию при помощи Олли? И еще один вопрос, где подсмотреть числовые значения параметров функции? Например хочу изменить параметр с PAGE_EXECUTE_READ на PAGE_EXECUTE, и не знаю какое значение ввести. Олли-то это знает, но как это мне увидеть? Не перебирать-же все возможные значения. ![]() |
|
Создано: 26 апреля 2012 01:30 · Личное сообщение · #12 |
|
Создано: 26 апреля 2012 01:51 · Личное сообщение · #13 |
|
Создано: 26 апреля 2012 02:34 · Личное сообщение · #14 Kuzya69, прикрутить секцию надо любым PE редактором. Потом VirtualAlloc(<наш желаемый адрес>...) и копируем всё что в нашей новой секции в выделенную память. ![]() |
|
Создано: 26 апреля 2012 14:18 · Личное сообщение · #15 А секцию создавать с размерами RawSize=нулевой, а VirtualSize=такой как VirtualAlloc создает, только округлить до ближайшей большей 1000h? Правильно я понимаю? Просто никак не получается создать секцию в диапазоне (виртуальном) 00А20000 размером 18000. Если с помощью LordPE создавать автоматом (не меняя VOffset и ROffset), то создается. Понятно, что можно оставить и так, но нужно и по другому научиться? И все равно остался вопрос. При запуске секции 360000 еще нет. После вызова VirtualAlloc с параметрам для адреса секции "по усмотрению Винды" эта секция появляется. Как программа создает эту секцию при выполнении? Даже так, какой код вписать мне в Олли, чтоб программа сама создала нужную мне секцию? ![]() |
|
Создано: 26 апреля 2012 14:34 · Личное сообщение · #16 |
|
Создано: 26 апреля 2012 15:33 · Поправил: Kuzya69 · Личное сообщение · #17 Так в чем вопрос-то? Я вроде все написАл. Просто надо понять, как секции создаются, самой программой? И почему вручную не получается, с моими установками ? Code:
После выполнения этого куска кода появляется секция Code:
Мне надо чтоб эта секция появилась в другом месте Code:
Как исправить код? А по первой части предыдущего сообщения. Создаю в LordPE секцию. Так мне надо. Code:
Остальное оставляю на усмотрение LordPE. Файл не запускается. Если создаю секцию. Code:
Остальное оставляю на усмотрение LordPE. Секция создается, но в другом месте и файл запускается. Почему не могу создать, как я хочу? ![]() |
|
Создано: 26 апреля 2012 15:45 · Поправил: ClockMan · Личное сообщение · #18 |
|
Создано: 26 апреля 2012 16:07 · Личное сообщение · #19 |
|
Создано: 26 апреля 2012 16:14 · Личное сообщение · #20 |
|
Создано: 26 апреля 2012 16:26 · Поправил: Kuzya69 · Личное сообщение · #21 |
|
Создано: 26 апреля 2012 16:37 · Поправил: ARCHANGEL · Личное сообщение · #22 Kuzya69 Непрерывность должна быть по Virtual Offset. Дырок в виртуальной памяти проекции образа быть не должно, т.е. если хотите выделить память в адресах типа 00Е00000 - пожалуйста, а если хотите обязать загрузчик это делать, значит надо сделать предыдущую секцию больше по виртуальным адресам так, что пространство перед вашим заветным адресом принадлежало предыдущей секции. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 26 апреля 2012 17:01 · Поправил: Kuzya69 · Личное сообщение · #23 Виртуальную память когда смотреть? На ЕР, OEP, после прохода всех VirtualAlloc, или уже когда программа запустилась? Чтоб узнать куда секцию можно вписать, и какую соответственно увеличивать? Пардон, кажется понял. Можно не обязательно увеличивать предыдущую, а создать пустую секцию в этом разрыве. Посчитал Voffset-ы Vsize-ы всех секций в таблице LordPE. И вроде дошло. Спасибо!!! А как с заданием адреса секции для VirtualAlloc? Что я чуть выше писАл. ![]() |
|
Создано: 26 апреля 2012 18:05 · Личное сообщение · #24 |
![]() Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 26 апреля 2012 18:12 · Поправил: ELF_7719116 · Личное сообщение · #25 Kuzya69 Секции создаются загрузчиком. Для этого существуют низкоуровневые API типа ZwCreateSection и макросы для них другие. VirtualAlloc(Ex) - выделяет виртуальную память, которая может быть освобождена. По существу все же это не одно и тоже. например типичный код: Code:
В первом аргументе задается желаемый адрес выделяемой памяти(в данном случае 0x1000000), который не NULL. ![]() |
|
Создано: 26 апреля 2012 18:36 · Личное сообщение · #26 tihiy_grom Да что вам так упёрлись эти адреса. Парни, ну я заодно и учусь. Я хочу понять как это происходит. Просто повторять действия тутора не интересно. Параллельно хочу понять, как создаются эти секции. ELF_7719116 В первом аргументе задается желаемый адрес выделяемой памяти(в данном случае 0x1000000), который не NULL. Вот именно так я и делал, только аргумент адреса засовывал прямо в стек, перед вызовом VirtualAlloc. Я так понял, чтоб VirtualAlloc "выделил секцию", нужно чтоб эта секция уже была создана загрузчиком? Но почему тогда VirtualAlloc создает ее в свободном пространстве 00360000, и не создает в созданной мной, через LordPE секции. Может нужно, при создании в LordPE, задать моей секции, какие-то атрибуты "что она свободна"? ![]() |
|
Создано: 26 апреля 2012 19:04 · Личное сообщение · #27 Уффф. Так, начнём сначала. Есть три разных понятия: объект "секция", секция Portable Executable и участок виртуальной памяти, именуемый во всяких утилитах как регион (region). 1.Итак, объект "секция" не стоит путать с термином "секция" из PE-файла, это вовсе не одно и тоже. Section object создается в ЕДИНСТВЕННОМ экземпляре на файл. Доказательство: функция NtCreateSection, вызывается ОДИН раз - в коде лоадера (ntdll.dll) из LdrpCreateDllSection (эта, в свою очередь, из LdrpMapDll), и в коде CreateProcess также единожды, в последовательности... Продолжение 2. Секция Portable Executable имеет больше схожих черт с регионом, но разница в том, что секция проецируется на адресное пространство загрузчиком операционной системы, и от нас с вами не требуется никаких дополнительных программерских телодвижений. Подробнее 3. Регион - самое простое из этих понятий. Регионом называют множество последовательно расположенных виртуальных страниц с одинаковыми атрибутами доступа. VirtualAlloc выделяет именно регион. Если вы хотите сдампить некоторую ВМ, то тут есть два различных способа её хранения - либо в секции (термин 2), которую вы сразу настраиваете на загрузку по требуемому виртуальному адресу, либо просто где-то в файле, неважно где, но т.к. это дамп, то по иронии судьбы, простейшим способом будет всё то же создание новой секции. В чём же разница? Разница в том, что в первом случае вы добиваетесь загрузки ВМ по требуемому адресу благодаря элементам IMAGE_SECTION_TABLE заголовка, а во втором случае выделяете регион программно и копируете туда код из вашей новой секции. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 26 апреля 2012 20:31 · Личное сообщение · #28 ARCHANGEL Отлично, я действительно путал термины. Трудновато для понимания с первого взгляда, но попробую вкурить. Еще раз двадцать перечитаю. Докладываю, распаковал, все запускается. Сделал так 1)создал новую секцию 2) До прихода в ОЕП дважды вызывался VirtualAlloc. И создавал секции до ImageBase. После ОЕП секции создавались после ImageBase.(поэтому я их не трогал). Так вот, я по выходу из процедуры просто подменял адреса создаваемых секций на созданную мной секцию, с учетом, что области не должны пересечься. 3) Пришел в ОЕП и сдампил. Работает. С П А С И Б О В С Е М ! ! ! Будем дальше учиться. ![]() |
|
Создано: 26 апреля 2012 21:02 · Личное сообщение · #29 |
|
Создано: 26 апреля 2012 21:23 · Личное сообщение · #30 |
. 1 . 2 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Подскажите по теории распака. |