| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > добавление длл в импорт бинарника |
| Автор: GoldFinch 16.1.2009, 19:22 |
| Задача такая: надо добавить дллку в таблицу импорта готового бинарника (aka PE-файла), не меняя размер последнего. Ее надо решить практически для всех возможных бинарников собранных различными компиляторами\линкерами. Разумеется в бинарнике должно быть достаточно неиспользованного места чтобы там можно было осуществить эту операцию. Также следует рассматривать бинарники только с обычным выравниваем (0x200 в файле, 0x1000 в памяти). Как такое сделать? |
| Автор: W4FhLF 17.1.2009, 08:42 |
| Тебе нужно найти достаточно свободного места для старой таблицы импорта + 1 новая запись. Т.е. необходимо переместить таблицу импорта на новой место и поменять RVA в IMAGE_DATA_DIRECTORY |
| Автор: GoldFinch 17.1.2009, 13:37 |
| W4FhLF, а как такое место найти? |
| Автор: alias_trinity 20.1.2009, 18:11 |
| Ну, не надо здесь спрашивать как писать вирусы!!! А то хороший модератор забанит! |
| Автор: GoldFinch 20.1.2009, 19:12 |
| alias_trinity, в нормальных вирусах такое заражение неиспользуют, ибо это слишком тривиально, и мгновенно лечится а при расширении функциональности готовой программы используют |
| Автор: W4FhLF 20.1.2009, 19:19 |
| Почему бы тогда не добавить новую секцию? Это упрощает задачу. |
| Автор: GoldFinch 20.1.2009, 19:42 |
| W4FhLF, не меняя размер файла если увеличивать размер файла - тогда уж просто расширять последнюю |
| Автор: W4FhLF 20.1.2009, 20:27 |
Я читал. НО я подумал, что пишется что-то плохое, но раз всё легально, почему бы не добавить/расширить секцию? |
| Автор: GoldFinch 20.1.2009, 20:33 |
| потомучто внешне файл должен выглядеть также как и был. так красивее, и конечному пользователю вовсе не надо знать как именно функциональность программы была расширена |
| Автор: GremlinProg 20.1.2009, 21:39 |
| GoldFinch, поясни, пожалуйста, цели своей задачи |
| Автор: GoldFinch 20.1.2009, 22:02 |
| задача - прицепить к какой-то программе какую-то свою дллку но сделать это надо красиво, желательно с минимальным изменением программы очевидно самое простой критерий "красоты" решения - размер модулей программы не должен меняться в основном это ограничение вводится из чисто эстетических соображений но также есть пара других причин: автор программы может не хотеть чтобы к ней чтото цепляли, например эта дллка будет креком, а автор программы не должен с 1го взгляда понять что же такое с его программой сделали или например эта дллка должна защищать чужую программу, а те кто ее будут ломать не должны сходу понять как это она к проге цепляется или например эта дллка будет распространятся среди большого числа пользователей, а юзверь по определению глуп и боится вирусов, поэтому чем незаметнее действия дллки, тем спокойнее юзверю да мало ли какие бывают цели %) |
| Автор: GremlinProg 21.1.2009, 00:28 |
| GoldFinch, неужели взлом ПО - более легальная тема для обсуждения, нежели вирус? |
| Автор: GoldFinch 21.1.2009, 01:02 |
| GremlinProg, почему взлом? изменение и расширение функциональности, улучшение интерфейса, а в ряде случаев обеспечение дополнительной защиты ПО Добавлено через 54 секунды алсо вы по вопросу чтонибудь сказать можете? |
| Автор: W4FhLF 21.1.2009, 08:14 |
| Никто не может гарантировать, что в файле найдётся достаточно свободного места для размещения новой записи таблицы импорта. Если задача решается для какой-то конкретной программы, то проблем не вижу, можно сделать анализ вручную, если же задача решается в общем, то нужно анализировать наиболее вероятные места с учётом выравнивания. |
| Автор: alias_trinity 21.1.2009, 11:29 |
| Вот умник... Если ты думаешь, что это лечится, то я тебе скажу, что задача вычисления обратного смещения неразрешаема, тоесть НЕ ИМЕЕТ ОБЩЕГО РЕШЕНИЯ!!! Если ты уверен в обратном - покажи пример |
| Автор: Earnest 21.1.2009, 11:31 |
| Кроме прочего, стандартноая лицензия на софт, которую, в основном все производители так или иначе клонируют, запрещает копаться в своих бинарных файлах с целью их изменения. Если чужая программа поддерживает какие-то плагины, то делай это штатно, если нет - значит, низя. Если программа твоя - то вообще никаких проблем нет, делай что хочешь на уровне кода. Насколько я понимаю, можно свою DLL внедрить в чужой процесс во время выполнения, это ничьих прав вроде не нарушает. |
| Автор: GoldFinch 21.1.2009, 12:37 |
| alias_trinity, какая еще задача вычисления обратного смещения? ты вообще о чем? |
| Автор: GremlinProg 21.1.2009, 12:58 |
по моему этого достаточно расширение функционала в том плане, в котором ты его сформулировал, не вяжется с легальной работой ПО, поскольку "любой бинарник" не пересекается с твоей DLL ни по каким вопросам обеспечения безопасности и улучшения интерфейса твоя DLL будет иметь доступ к структуре бинарника, что не подразумевает доступ к внутренним интерфейсам (а они могут сильно различаться на разном ПО), и уж тем более, защита - это двусторонний процесс, подразумевающий участие как приемной, так и передающей стороны, ты можешь защитить чего-то, в данном случае, только на уровне перехвата приемо-передающих функций, использование которых, опять же, не обязательно для всех бинарников, а ведь ты сформулировал задачу именно "для всех бинарников" так что, идея взлома ПО и несанкционированных манипуляций на стороне пользователя здесь явно присутствуют |
| Автор: GoldFinch 21.1.2009, 13:01 |
| GremlinProg, не выдирай слова из контекста, приводи полные цитаты |
| Автор: GremlinProg 21.1.2009, 13:07 |
не слова, а фразы, а в данном случае, "или" - смысла сказанного не меняет |
| Автор: GremlinProg 21.1.2009, 13:51 | ||||||
пожалуйста, публичный заголовок расширения:
GetExternal - точка соприкосновения программы и DLL, возвращающая инородный объект воздействия IExternal - интерфейс объекта воздействия DLL работает в режиме slave, т.е. программа сама вызывает методы IExternal, а DLL отвечает на них а в самой программе предусмотрено добавление плагинов, экспортирующих функцию типа GetExternal аналогично можно и без интерфейсов обойтись: через функцию, фильтрующую события и состояния приложения, т.е. типа такого
по такому принципу работает оконная процедура все легально, без премудростей а если приложение не поддерживает расширения, значит оно ему и не надо, обращайся в систему поддержки этого ПО и проси такой механизм добавить |
| Автор: GoldFinch 21.1.2009, 15:12 |
| есть такая штука как сетевые игры. для них пишутся читы, которые обычно тоже представляют собой дллки, которые както патчат клиент игры вариант обратиться к разработчику в 99% случаев не подходит, поэтому античиты пишутся примерно также как и читы, своими силами и античиты тоже вобщем-то представляют собой дллки которые тоже патчат клиент игры, и не дают другим модулям его патчить да и вообще, вариант "обратиться к разработчику" это абсурдный вариант, никто никогда по просьбе пользователя ничего в проге улучшать не будет, если это сложно и не несет выгоды разработчику GremlinProg, вы бы лучше по теме чтонибудь написали, а не то "почему тема плоха" |
| Автор: GremlinProg 21.1.2009, 15:59 | ||||||
ну конечно, как ты опишешь разработчику причину? "Я не могу поломать Вашу программу, помогите пожалуйста, дайте доступ к управлению" смешно )
бороться с колорадским жуком можно и лопатой, бегая за каждым по огороду ) нормальную защиту всегда пишет разработчик, а если не может - привлекает тех, кто может и ни в каком вменяемом проекте не внедряются такого рода заплатки-прилипалы, которые потенциально - уже клиенты антивируса
боже мой, GoldFinch, а что такое форум поддержки, чем занимаются службы поддержки? анкеты? опросы? Просто так, убивают время?
ради взлома ПО я ни чего советовать не буду, совесть не позволяет |
| Автор: GoldFinch 21.1.2009, 16:02 |
| GremlinProg, признайтесь честно, вы просто не знаете как решить эту задачу |
| Автор: alias_trinity 21.1.2009, 18:33 |
| GoldFinch, почитай http://bugtraq.ru/library/programming/harddll.html Посмотриш как вычислается адрес секции импорта, а потом попробуешь решить обратную задачку - узнать на сколько сместилась таблица импорта в секции импорта |
| Автор: GoldFinch 21.1.2009, 18:51 |
| alias_trinity, не тупи, что "вылечить" такую "зараженную" прогу достаточно просто удалить из таблицы импорта эту дллку. про сложность с преобразованием rva<->raw я так и не понял, в этом нет ничего сложного алсо понятие "секция импорта" исчезло уже с десяток лет назад |
| Автор: alias_trinity 21.1.2009, 18:56 |
| Говорю, покажи код, где лечится... ПОКАЖИ!!!! |
| Автор: GoldFinch 21.1.2009, 19:22 |
| что показать? как удалить из таблицы импорта один дескриптор? //char *pImpDir - VA таблицы импорта //int ImpDirSize - размер таблицы импорта //char *pImpDescr - указатель на "лишний" дескриптор импорта //0x14 - 5 dword'ов memcpy(pImpDescr,pImpDescr+0x14,(pImpDir+ImpDirSize)-(pImpDescr+0x14)); |