Injected DLL

Тема в разделе "LANGS.C", создана пользователем HelloweenStranger, 12 май 2011.

Статус темы:
Закрыта.
  1. HelloweenStranger

    HelloweenStranger New Member

    Публикаций:
    0
    Регистрация:
    12 май 2011
    Сообщения:
    30
    Доброго времени суток всем!
    Есть проблема, нужно программно внедрить в раздел импорта существующего exe-шника свою dll. Прочитал статеечку http://www.xakep.ru/magazine/xa/101/024/1.asp. Возникло много вопросов. Банально первый из них... Как найти таблицу импорта в файле, если я его отображаю как файл данных, чтобы можно было редактировать?.. IMAGE_DATA_DIRECTORY[IMAGE_DIRECTORY_ENTRY_IMPORT] содержит виртуальный адрес таблицы уже в отображённом образе. Банальное прибавление к нему ImageBase не даёт нужного результата. Таблица импорта грузится по IMAGE_DATA_DIRECTORY[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress только, если грузить именно как образ exe... Хотя в доках утверждается другое... Плюс, прокатит ли банальный перенос новой таблицы импорта в новое место и замена её адреса в заголовках PE на новый? Или проблем намного больше?..
     
  2. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    PE_start+80h
    Там адрес на таблицу импорта.
    Можно в хексе найти надпись PE и отсчитать от него. По-моему так.
     
  3. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Если файл отображен как файл данных, надо использовать функцию, аналогичную RtlImageRvaToVa, которая учитывает разницу VirtualAddress и PointerToRawData секции, и/или
    Код (Text):
    1. PVOID
    2. RtlImageDirectoryEntryToData(
    3.   __in PVOID Base,
    4.   __in BOOLEAN MappedAsImage,
    5.   __in USHORT DirectoryEntry,
    6.   __out PULONG Size
    7.   );
    с MappedAsImage = FALSE, для получения адреса нужной Directory Entry
     
  4. HelloweenStranger

    HelloweenStranger New Member

    Публикаций:
    0
    Регистрация:
    12 май 2011
    Сообщения:
    30
    Ага, в документации так написано, а на самом деле посмотри внимательно под хексами, что пишут разные линкеры... Я ОООЧЕНЬ удивился, когда увидел....
     
  5. HelloweenStranger

    HelloweenStranger New Member

    Публикаций:
    0
    Регистрация:
    12 май 2011
    Сообщения:
    30
    Спасибо, добрый человек! Помогло! Но проблем только прибавилось... Я хочу перенести таблицу на новое место, разумеется, свободное... С переносом проблем нет, а вот с изменением адресов... Я в полных непонятках, где указывать адрес новой таблицы?.. По IMAGE_DATA_DIRECTORY[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress не прокатывает, саму секцию импорта найти не могу, потому как О ЧУДО, она в подавляющем большинстве экзешников не называется .idata. Каждый линкер обзывает как хочет...
     
  6. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    точнее будет: размещает директорию импорта в угодную ему секцию.
    по именам секций делать привязки изврат_извратский:
    Код (Text):
    1. SectionHeader = IMAGE_FIRST_SECTION(NtHeaders);
    2. va = IMAGE_DATA_DIRECTORY[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
    3. for (i < FileHeader.SectionCnt) {
    4.    if ( (SectionHeader[i].Va > va) && (va< SectionHeader[i].Va + SectoonHeader[i].VirtSize) )
    5.       break;
    6. }
    7. SectionHeader = ImportSection..
    т.е. перебираем все секции и смотрим случайно не в той ли секции наш импорт лежит...

    еще один гвоздеприбиватель
    Код (Text):
    1.     PIMAGE_NT_HEADERS32         ImageNtHeader;
    2.  
    3.    ImageNtHeader = (PIMAGE_NT_HEADERS32)( (ULONG_PTR)((PIMAGE_DOS_HEADER)Module)->e_lfanew + (ULONG_PTR)Module );
    4.    Import =   ImageNtHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_IMPORT ];
     
  7. HelloweenStranger

    HelloweenStranger New Member

    Публикаций:
    0
    Регистрация:
    12 май 2011
    Сообщения:
    30
    Не один вариант не катит, перебирать все секции бессмысленно, так как экзешник может состоять вообще из одной секции, и где в ней секция импорта?.. Второй вариант, как говорится, иди с этим в Microsoft. ))))) Доки я читать умею, но только:
    Код (Text):
    1.  
    2. Import =   ImageNtHeader->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_IMPORT ];
    приведёт к тому, что мы получим адрес, по которому таблица лежит в загруженном образе exe, а не внутри самого файла. Проверено на десятках экзешников... Да и проблема не в том, что я не могу найти таблицу, я не понимаю, какие адреса писать, когда я уже перенёс и поменял таблицу?.. Определённо нужно учитывать какие-то смещения, но какие? Опять же, когда я запишу имя моей внедряемой dll в свободное место в экзешнике, то в качестве адреса её имени что мне писать в IMAGE_IMPORT_DESCRIPTOR.Name?
     
  8. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    Почитайте про RVA и конкретнее про перевод из RVA в файловый оффсет.
    Если в двух словах

    offset = Section.VirtualAddress - rva + Section.PointerToRawData

    где Section - IMAGE_SECTION_HEADER той секции, где расположен rva
    Обратно аналогично.
    Читайте хотя бы спецификацию от ms, там все это документировано

    2ASMatic
    Так тоже не совсем корректно. Нужно ещё проверять NtHeaders->OptionalHeader.NumberOfRvaAndSizes, чтобы не оказалось, что Дата директори пострипанно. Хотя очень редко бывает, что импорт пострипан, но это намного корректнее
     
  9. HelloweenStranger

    HelloweenStranger New Member

    Публикаций:
    0
    Регистрация:
    12 май 2011
    Сообщения:
    30
    Уже прочитал и нашёл исходный код RtlImageRvaToVa, которая собственно весь перевод и выполняет. У меня перед глазами "Microsoft Portable Executable and Common Object File Format Specification" Microsoft Corporation Revision 6.0 - February 1999. И там о переводе RVA <-> file ooset ни слова не было сказано, поэтому пришлось сначала поковыряться самому, а потом искать соответствующие функции! Если где-то документировано, плиз ссылку, а так... одна баба сказала, что где-то что-то как-то документировано...
     
  10. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    Ms-Detours там есть код который это делает.
     
  11. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    HelloweenStranger
    Вы это сами должны осознать, поняв PE-формат. Описание формата не содержит описание алгоритмов. Например в определении факториала вы не найдёте алгоритмов его вычисления, так как это само собой понятно. Следовательно иметь спецификацию не достаточно, следует её изучить.
     
  12. HelloweenStranger

    HelloweenStranger New Member

    Публикаций:
    0
    Регистрация:
    12 май 2011
    Сообщения:
    30
    Неужели?.. А я думал, мне в спецификации готовый код выложат... )))))))))) Читайте внимательно все посты, а потом делайте выводы. izl3sa написал, что в спецификации MS оговаривается, что нужно выполнять преобразование RVA <-> file offset. Хотя там, как всегда, в доках просто сказано, что RVa обычно отличается от file offset, и всё.
     
  13. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    HelloweenStranger
    За готовый код тут платят и ищут его в разделе скомерс. Мне не нужно читать все посты, я эту матчасть знаю досконально, нечего меня в чёмто упрекать, вопрос тут вы задали. Нормальный ответ может быть только человеку заинтересованному, который пытается чтото понять. За готовым решением сюда не ходят, вы ошиблись.
     
  14. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    gaeprust
    а скриншоты где?
     
  15. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    Чтобы инде негодовал есчо больше, я вернусь домой в скором времени и выдам вам кодес одной функцеей, которая сделоет все за вас. Надеюсь кусок оссемблера вас устроит?
     
  16. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    в той секции и будет. Правда есчо бывает что имена расположены вне секции(импорт тейбл там не видал но по логике и он там может быть), т.е. после хедеров_до первой секции = это опять таки надо проверять и т.п.
    izl3sa
    я суть тс прояснить пытался, а не код дать который он скопипастит и нихрена не поймёт - за таким можно и в гугля поспрашивать.

    ТС
    я б на вашем месте перед тем как мс доки читать
    http://wasm.ru/series.php?sid=4 разобрал - скудно, но доступно и весь смысл изложен
     
  17. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    >>я суть тс прояснить пытался, а не код дать который он скопипастит и нихрена не поймёт - за таким можно и в гугля поспрашивать.

    а он так и так нихрена не поймет это по постановкам вопросов видно, что ему это очень интересно
     
  18. HelloweenStranger

    HelloweenStranger New Member

    Публикаций:
    0
    Регистрация:
    12 май 2011
    Сообщения:
    30
    Вам к доктору обратиться нужно... Чувство юмора серьёзно заболело, если оно у вас было. )))))))))))
     
  19. HelloweenStranger

    HelloweenStranger New Member

    Публикаций:
    0
    Регистрация:
    12 май 2011
    Сообщения:
    30
    По себе не судите, уважаемый! Если до вас как до жирафа доходит, не значит, что до все так! К вашему удивлению, по исходникам ntdll.dll всё разобрал и внедрил-таки свою dll-ку с функцией в чужой экзешник. Отдельное спасибо доброму человеку с ником Deyton за короткий и понятный ответ. Из этого ответа и исходников ntdll всё стало понятно. Удивительно, но те люди, которые реально осведомлены в теме, коротко и ясно отвечают и не изголяются в словесном поносе. А те, кто что-то где-то когда-то отдалённо слышали, хрен чего толком посоветуют, но воды нальют, что захлебнуться можно! Товарищи, от неуверенности в себе нужно избавляться, не поливая новичка дерьмом (которого сами достойны), а другими методами...
     
  20. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    Да, зачем штудировать пе-формат, когда для понимания механизма загрузки импортируемых длл достаточно лишь разобрать программный загрузчик венды? Если вы забудете какая АПИ что делает не смотрите в мсдн- посмотрите исходный код длл экспортирующей эту функцию и вам сразу все станет ясно.
     
Статус темы:
Закрыта.