Сейчас на форуме: (+6 невидимых) |
eXeL@B —› Протекторы —› Добавление новой секции затирает секцию кода |
Посл.ответ | Сообщение |
|
Создано: 02 октября 2016 22:25 · Личное сообщение · #1 Хочу написать упаковщик. К стабу добавляется секция с упакованным имиджем и после запуска стаба этот имидж должен распаковываться в памяти и запускаться. Я взял за основу такой код добавления секции: Code:
Проблема в том, что код рассчитан на PE-файлы, в которых между таблицей секций и первой секцией есть пустое пространство для нового заголовка. У меня линкеры создают файлы, в которых таблица секций лежит вплотную к секции кода, поэтому при добавлении нового заголовка секция кода затирается. Почему кто-то рассчитывал на то, что будет куда вставлять новый заголовок? Почему пустого места нет? Я решил перекраивать дисковый имидж и пишу такой код: Code:
Алгоритм такой: 1. Читаю дсковый имидж в буфер 2. На стеке создаю и заполняю хедер новой секции 3. В optional header'е увеличиваю размер имиджа, в file header'е увеличиваю количество секций 4. Записываю обратно в файл часть буфера до таблицы секций включительно 5. Записываю созданный заголовок секции 5. Записываю все, что лежало после таблицы секций: то есть секцию кода и остальное Примеры программ с добавленной секцией: Оригинальный способ, затирающий секцию кода: http://rgho.st/6R8Hycl6s Видно, что после записи строки "NEW SECTION" секция выравнивается нулями Мой вариант: http://rgho.st/7wgBqhJSf почему-то секция нулями не выравнивается В обеих случаях файл не запускается. Что я делаю не так? Какие поля надо пересчитать после добавления заголовка секции и сдвигания секции кода вниз? |
|
Создано: 02 октября 2016 23:44 · Поправил: UniSoft · Личное сообщение · #2 ZeroMemory пишет: Хочу написать упаковщик. ...этот имидж должен распаковываться в памяти и запускаться. А вы в курсе, что кроме распаковки нужно еще обработать таблицу релоков, таблицу импорта, TLS Callbacks (если имеется), ...? ZeroMemory пишет: файл не запускается. Что я делаю не так? нельзя просто так сдвинуть данные на размер секции! а как же выравнивание? А PointerToRawData всех остальных секций? Изучайте формат PE... https://habrahabr.ru/company/xakep/blog/139138/ https://vxheaven.org/0x48k/etc/peload_dll.cpp -=AkaBOSS=--=AkaBOSS=- пишет: RVA? Ну да, не правильно выразился... бывает конечно же имелось в виду PointerToRawData |
|
Создано: 03 октября 2016 01:45 · Поправил: -=AkaBOSS=- · Личное сообщение · #3 чтоб было проще понять - рассматривайте PEхидер как еще одну секцию. нужно сделать примерно так: 1. РазмерА = общий размер пехидера и заголовков секций 2. РазмерБ = РазмерА, округлённый вверх до FileAlignment - это фактическое количество данных, которые будут считаны из файла в память 3. РазмерВ = (РазмерА+sizeof (IMAGE_SECTION_HEADER)), округляем вверх до FileAlignment - это размер хидера который будет после добавления секции 4. если РазмерБ и РазмерВ не равны, значит места не хватит и надо двигать секции. 5. соответственно, нужно пройтись по заголовкам всех секций и прибавить к ним разницу между РазмеромВ и РазмеромБ 6. разумеется, надо и сами секции физически сдвинуть в файле ZeroMemory пишет: Code:
если уж говорить о возможных багах, то это - их потенциальный источник. порядок секций в пехидере гарантированно отвечает за порядок, в котором они будут располагаться в памяти. Но! Секция, расположенная в хидере последней, не обязательно будет последней в файле) В файле они могут располагаться в любом порядке. К тому же, секция может иметь виртуальное представление, но не иметь физического (проще говоря - PointerToRawData и SizeOfRawData могут быть нулевыми) семпл в аттаче 2209_03.10.2016_EXELAB.rU.tgz - test.exe UniSoft пишет: А RVA всех остальных секций? RVA? |
|
Создано: 03 октября 2016 02:12 · Поправил: dosprog · Личное сообщение · #4 VA секции кода чаще всего .401000 при базовом адресе .400000. 1000h байтов это 4кб - можно туда слона запихнуть, а не то, что ещё один дескриптор секции. Но перекомпоновать файл понадобится серьёзно. --Добавлено-- ZeroMemory пишет: Хочу написать упаковщик. Может, лучше ну его на? - UPX вполне справляется. Если уж сильное, стойкое и непреодолимое желание рулить, то можно помучить сорсы UPX'а |
|
Создано: 03 октября 2016 10:45 · Поправил: difexacaw · Личное сообщение · #5 |
|
Создано: 03 октября 2016 10:57 · Личное сообщение · #6 |
|
Создано: 03 октября 2016 10:59 · Поправил: difexacaw · Личное сообщение · #7 Rainbow Потому, что такой формат сразу выпилят аверы. Модуль будет запускаться, но станет не рабочим в ав окружении(система уже давно не только загрузчик). Мыслим шире ----- vx | Сообщение посчитали полезным: dosprog |
|
Создано: 03 октября 2016 11:03 · Личное сообщение · #8 |
|
Создано: 03 октября 2016 12:12 · Поправил: difexacaw · Личное сообщение · #9 Rainbow Вероятно так. На данный момент проблема формата не разрешима, так как критерий детекта основан на выборке. Ав интегрирован в ось и в лучшем случае он один, наверно вы далеки от этой темы. Такой изврат с форматом не приемлем. Были времена, очень давно когда в ядерном лодере(который мапит образ) было куча багов, это работало, но тогда не было столько ав. Сейчас же проблема не пропатчить модуль, а выполнить это так, чтобы не было реакции ав. ----- vx |
|
Создано: 03 октября 2016 20:18 · Личное сообщение · #10 UniSoft пишет: А вы в курсе, что кроме распаковки нужно еще обработать таблицу релоков, таблицу импорта, TLS Callbacks (если имеется), ...? Да, я знаю, что придется частично реализовать PE-загрузчик, но мне это интересно, хочется разобраться. Я делал инфект в code cave'ы и думал, что уж добавление секции будет проще, но оказалось, что все плохо, и старые способы добавления секции почему-то перестали работать. Вот такой у меня исходный файл, над которым я издеваюсь http://rgho.st/8VcqfWmrR |
|
Создано: 03 октября 2016 21:02 · Поправил: UniSoft · Личное сообщение · #11 |
|
Создано: 03 октября 2016 21:11 · Личное сообщение · #12 |
|
Создано: 03 октября 2016 23:01 · Поправил: UniSoft · Личное сообщение · #13 Rainbow пишет: PE-хидер где-нибудь в хвосте ? difexacaw пишет: Потому, что такой формат сразу выпилят аверы. так, не спорьте... помыслил шире, и попробовал такой финт, ради "научного" экскремента... Все же работает такой финт... PE хидер в конце файла... (пример в аттаче) ну а аверы: https://www.virustotal.com/en/file/d7561462254197ea01664582d453f948883c3c61af664c14cb2c5d1e8abfe712/analysis/1475524456/ хотя многим из них и в исходном exe видится угроза (ну и https://www.virustotal.com/en/file/8b13ab5929596517a9078127e5ea5e3c3c037acdaeee31f7f95e270c905e143d/analysis/1475524927/ 96e0_04.10.2016_EXELAB.rU.tgz - testPE.rar |
|
Создано: 05 октября 2016 22:03 · Личное сообщение · #14 |
eXeL@B —› Протекторы —› Добавление новой секции затирает секцию кода |