Вопрос по внедрению в PE

Тема в разделе "WASM.BEGINNERS", создана пользователем l3ha, 21 окт 2010.

  1. l3ha

    l3ha New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    3
    скажите плз, как правильно надо править в PE-exe, чтобы внедрить в последнюю секцию свой код
    пралю PE так:
    Код (Text):
    1. AddressOfEntryPoint=sections[LastSection].SizeOfRawData+sections[LastSection].VirtualAddress;
    2. sections[LastSection].SizeOfRawData = ALIGN(sections[LastSection].SizeOfRawData, FileAlignment)+ALIGN(SIZE_X_CODE, FileAlignment);
    3. sections[LastSection].VirtualSize = ALIGN(VirtualSize, SectionAlignment)+ALIGN(SIZE_X_CODE, SectionAlignment);
    4. sections[LastSection].Characteristics=0xA0000020;
    5. SizeOfCode+=ALIGN(SIZE_X_CODE, FileAlignment);
    6. SizeOfImage+=ALIGN(SIZE_X_CODE, SectionAlignment);
    В файл X-код пишу в самый конец (надо ли забивать 0x00, если не выравнен файл?)

    впринципе, у меня работает (большинство стандартных хрюшки, ну и bcb-шные тоже)
    но какие-то и нет

    и ещё.. мот кто знает, как спрятать консольное окно, когда прога без gui, а внедрённый x-код создаёт gui-окно
    (при запуске показывается оба, надо спрятать консольное и показать его, после отработки х-кода перед передачей управления на OEP)
     
  2. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    SUB_SYSTEM = 0x0002; ?

    Надо
     
  3. l3ha

    l3ha New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    3
    sysexit, да если SUB_SYSTEM = 0x0002, то при создании моего gui окна появляется ещё и консольное..
    скажите как тогда правильно выставить AddressOfEntryPoint и по какому адресу писать сам внедряемый код?
     
  4. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    При SUB_SYSTEM = 0x0002 наоборот консольного окна не должно создаватся.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    l3ha
    это же палево менять в хидере линк на стартап код. Лучше распарсить немного кода и записать туда ветвление на себя. Не пермутация(интеграция своего кода в чужой), но способ норм. и прост.
     
  6. l3ha

    l3ha New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    3
    скажите тогда как найти FileAddressOfEntryPoint (начало кода в файле)
     
  7. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint? Это RVA, перевести его в смещение в файле довольно тривиально: надо найти подходящую секцию (такую, что VirtualAddress<=AddressOfEntryPoint<VirtualAddress+VirtualSize) и использовать AddressOfEntryPoint-VirtualAddress+PointerToRawData.

    Это для канонического PE; теоретически (возможно Clerk подскажет исходя из знания загрузчика) точка входа может оказаться в памяти за пределами диапазона [VirtualAddress, VirtualAddress+VirtualSize), но в пределах диапазона [PointerToRawData, PointerToRawData+SizeOfRawData) в файле.
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    точка входа может быть где угодно в адресном пространстве файла - от 0 до размера образа
     
  9. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    по палевности ничем не отличается от
    и
    файл будет модифицирован и на это укажет измененная чексумма, не говоря уже про размер
     
  10. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    fsd
    чексумма в хидере? Так её пересчитать можно. Сертификат безопасности можно удалить, или не трогать этот файл.
    В хидере размера нет.
     
  11. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    смысл поста был в том что разницы между видами внедрения нет, потому что результат будет один: изменится размер зараженного файла в фс и как следствие чексумма
     
  12. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Друже, ты не понял: я имел в виду ситуацию, когда данные из файла вылезают за пределы секции. Не будут ли они занулены, как можно предположить? О том, что точку входа можно и на адрес ExitProcess() назначить, я в курсе.
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    если ты имеешь ввиду данные после секций, то они вообще не будут загружены в память
    если ты имеешь ввиду данные между секциями, которые не относятся ни к одной из секций, то такой файл будет невалидным и не будет загружен - все секции должны идти подряд, между ними не должно быть разрывов в памяти
     
  14. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Ядро смещение PE хидера даже не проверяет(RtlImageNtHeader() ;)), не говоря уже про остальное. Решение описано в #5.