Injected DLL

Discussion in 'LANGS.C' started by HelloweenStranger, May 12, 2011.

Thread Status:
Not open for further replies.
  1. HelloweenStranger

    HelloweenStranger New Member

    Blog Posts:
    0
    Joined:
    May 12, 2011
    Messages:
    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)

    Blog Posts:
    0
    Joined:
    Oct 15, 2010
    Messages:
    345
    Location:
    Sliven, Bulgaria
    PE_start+80h
    Там адрес на таблицу импорта.
    Можно в хексе найти надпись PE и отсчитать от него. По-моему так.
     
  3. Deyton

    Deyton Member

    Blog Posts:
    0
    Joined:
    Mar 7, 2007
    Messages:
    94
    Если файл отображен как файл данных, надо использовать функцию, аналогичную RtlImageRvaToVa, которая учитывает разницу VirtualAddress и PointerToRawData секции, и/или
    Code (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

    Blog Posts:
    0
    Joined:
    May 12, 2011
    Messages:
    30
    Ага, в документации так написано, а на самом деле посмотри внимательно под хексами, что пишут разные линкеры... Я ОООЧЕНЬ удивился, когда увидел....
     
  5. HelloweenStranger

    HelloweenStranger New Member

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

    ASMatic New Member

    Blog Posts:
    0
    Joined:
    Oct 5, 2010
    Messages:
    233
    точнее будет: размещает директорию импорта в угодную ему секцию.
    по именам секций делать привязки изврат_извратский:
    Code (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..
    т.е. перебираем все секции и смотрим случайно не в той ли секции наш импорт лежит...

    еще один гвоздеприбиватель
    Code (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

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

    izl3sa New Member

    Blog Posts:
    0
    Joined:
    Apr 22, 2010
    Messages:
    164
    Location:
    Spb
    Почитайте про RVA и конкретнее про перевод из RVA в файловый оффсет.
    Если в двух словах

    offset = Section.VirtualAddress - rva + Section.PointerToRawData

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

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

    HelloweenStranger New Member

    Blog Posts:
    0
    Joined:
    May 12, 2011
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Feb 23, 2010
    Messages:
    95
    Ms-Detours там есть код который это делает.
     
  11. gaeprust

    gaeprust New Member

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

    HelloweenStranger New Member

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

    gaeprust New Member

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

    fsd New Member

    Blog Posts:
    0
    Joined:
    Jul 4, 2010
    Messages:
    353
    gaeprust
    а скриншоты где?
     
  15. TrashGen

    TrashGen ТрещГен

    Blog Posts:
    0
    Joined:
    Mar 15, 2011
    Messages:
    1,201
    Location:
    подполье
    Чтобы инде негодовал есчо больше, я вернусь домой в скором времени и выдам вам кодес одной функцеей, которая сделоет все за вас. Надеюсь кусок оссемблера вас устроит?
     
  16. ASMatic

    ASMatic New Member

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

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

    TrashGen ТрещГен

    Blog Posts:
    0
    Joined:
    Mar 15, 2011
    Messages:
    1,201
    Location:
    подполье
    >>я суть тс прояснить пытался, а не код дать который он скопипастит и нихрена не поймёт - за таким можно и в гугля поспрашивать.

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

    HelloweenStranger New Member

    Blog Posts:
    0
    Joined:
    May 12, 2011
    Messages:
    30
    Вам к доктору обратиться нужно... Чувство юмора серьёзно заболело, если оно у вас было. )))))))))))
     
  19. HelloweenStranger

    HelloweenStranger New Member

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

    TrashGen ТрещГен

    Blog Posts:
    0
    Joined:
    Mar 15, 2011
    Messages:
    1,201
    Location:
    подполье
    Да, зачем штудировать пе-формат, когда для понимания механизма загрузки импортируемых длл достаточно лишь разобрать программный загрузчик венды? Если вы забудете какая АПИ что делает не смотрите в мсдн- посмотрите исходный код длл экспортирующей эту функцию и вам сразу все станет ясно.
     
Thread Status:
Not open for further replies.