Сейчас на форуме: bartolomeo, tyns777 (+6 невидимых) |
![]() |
eXeL@B —› Программирование —› Спуфинг пути к текущей директории |
<< . 1 . 2 . |
Посл.ответ | Сообщение |
|
Создано: 02 марта 2011 09:11 · Личное сообщение · #1 Требуется из ring3 подменить путь, который возвращает GetCommandLine в чужом приложении. Ну понятно, инжект, сплайс апи. Но потом приложение вычленяет оттуда путь к своей директории и начинает активно работать со своими библиотеками и файлами. Сталобыть нужно делать спуфинг. Собственно вопрос, что хукать для спуфинга? NtOpenFile, NtCreateFile, SetCurrentDirectory, LdrLoadDll Что еще? ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 03 марта 2011 09:40 · Личное сообщение · #2 |
|
Создано: 03 марта 2011 09:44 · Личное сообщение · #3 |
|
Создано: 03 марта 2011 10:00 · Личное сообщение · #4 |
|
Создано: 03 марта 2011 10:07 · Личное сообщение · #5 Количество функций для хука кажется бесконечным... Вот смотрите. Допустим, вы похукали GetCurrentDirectory, и в ответ на вызов подсовываете программе буфер с таким содержимым, чтоб пройти проверку контрольной суммы. Далее, программа вызывает SetCurrentDirectory с адресом директории system32, обращается к каким-то либам, но не по именам, а генерируя полный адрес через вызов GetCurrentDirectory + имя либы. Тупо, конечно, надумано, но возможно. А вы ей всё также подсовываете поддельный буфер при вызове GetCurrentDirectory. Далее происходит ахтунг. Думаю, таких примеров можно придумать много. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 03 марта 2011 10:39 · Поправил: DenCoder · Личное сообщение · #6 HiEndsoft пишет: можно из таблиц ФС путь до любого файла найти Поддерживаю Джолли Роджера! ![]() А так хукать различные апи - кто ее знает, какими изощренными функами этот коммерческий проект будет пользоваться в дальнейшем, кто их там знает, какого кодера уволят, какого возьмут и подключат к делу. Разработчики ПО готовы на все пойти ради защиты своего продукта. ![]() ----- IZ.RU ![]() |
|
Создано: 03 марта 2011 10:41 · Поправил: PE_Kill · Личное сообщение · #7 ARCHANGEL Это ты хардкор какой то предложил. Спуфинг - это подмена, т.е. эмулируется фнукция так: Code:
Т.е. если путь идет куда то кроме поддельного, то мы его не трогаем, если это поддельный путь, то мы его заменяем на настоящий. Отсюда следует, что: ARCHANGEL пишет: Допустим, вы похукали GetCurrentDirectory, и в ответ на вызов подсовываете программе буфер с таким содержимым, чтоб пройти проверку контрольной суммы Не правильно, тут мы проверим, если текущая директория ведет в программу, то мы подменим, если нет, то вернем результат апи функции. ARCHANGEL пишет: алее, программа вызывает SetCurrentDirectory с адресом директории system32, обращается к каким-то либам, но не по именам, а генерируя полный адрес через вызов GetCurrentDirectory + имя либы. Пусть делает так, тут опять проверка, если путь устанавливается на поддельный, то мы установим текущую директорию на ту, где лежит программа, иначе просто выполним апи. ARCHANGEL пишет: А вы ей всё также подсовываете поддельный буфер при вызове GetCurrentDirectory. Далее происходит ахтунг. Ну выше я уже объяснил, что навешиваемые фильры умные и следят что обрабатывать а что нет, поэтому ахтунга не будет. ЗЫ Уже написал фильтры для 26 апи (A/W/ExA/ExW) добавляю теперь всякие экзотические и можно будет тестить. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 03 марта 2011 10:46 · Поправил: PE_Kill · Личное сообщение · #8 DenCoder пишет: А почему бы фильтр на файловую систему не написать или воспользоваться уже готовым и прогонять на всех нужных осях? Может, решение трудоемким будет, но зато универсальным и в будущем не раз пригодится! Возможно, только времени 2 недели, а эта часть работы крупица от всего объема. Т.е. решения должны быть прямо пропорциональны задаче/времени/оплате/требованиям. DenCoder пишет: А так хукать различные апи - кто ее знает, какими изощренными функами этот коммерческий проект будет пользоваться в дальнейшем, кто их там знает, какого кодера уволят, какого возьмут и подключат к делу. Данный конкретный софт можно защитить 30 строчками кода, и не надо будет ни хешей, ни перехватов и никакие драйверы не помогут. Защита будет неломаемой, просто еще очень много времени пройдет, прежде чем софтверные конторы начнут привлекать спецов по защите своего ПО, а до этого времени можно извращаться ![]() ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 03 марта 2011 10:51 · Личное сообщение · #9 PE_Kill пишет: NewFileName := WideString(SpoofFilePath(String(lpFileName))); Может лучше при обработке приводить всё к юникоду, а не наоборот? ----- PGP key ![]() |
|
Создано: 03 марта 2011 10:58 · Поправил: DenCoder · Личное сообщение · #10 |
|
Создано: 03 марта 2011 11:18 · Поправил: PE_Kill · Личное сообщение · #11 ntldr пишет: Может лучше при обработке приводить всё к юникоду, а не наоборот? WideString в делфи это и есть юникод. SpoofFilePath внутренняя функции и написана на нативных String (в моем IDE нативные тоже юникод, просто для Cross IDE юзаются внутренние определения Delphi). Поэтому и Ansi и Wide стринги я привожу к нативной String, а какая она будет это решать компилятору конкретной версии Delphi. DenCoder пишет: А Вы посчитайте, сколько уйдет времени на поиск и сплайсы всех нужных фунок. Как и сказал ntldr 2 часа времени. Движок там писать вообще нефиг делать 100 строчек кода. Основное время уходит на фильтры. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 03 марта 2011 14:28 · Личное сообщение · #12 ntldr пишет: Решение неадекватно задаче. Задача - сделать лоадер для проги, а запускать эту прогу могут в любой ОС вплоть до вайна, сталобыть хукаем то, что гарантированно есть и 100% документировано. Тогда не адекватная задача, потому что, что нибудь да отвалится, особенно в том же вайне или прогу решат запускать под win32s, 100% гарантии быть не может. Я бы эту задачу под виндой, решил через фильтр IRP пакетов, тогда можно не заморачиваться с вызовами api и т.д. Исходный код можно взять из NTFilemon, там все есть. Для wine задача решается еще проще, все родные фс для linux, bsd и т.д. поддерживаю симлинки, и сам вайн умеет редиректить пути, нужно только в конфиге указать что и куда. ![]() |
|
Создано: 03 марта 2011 15:26 · Личное сообщение · #13 gloomdemon пишет: Тогда не адекватная задача, потому что, что нибудь да отвалится Хукать фаст кол всё равно не вариант, в Win2k int 2e юзается. Ну а отвалится, я же на сапорте буду, пофикшу. Мне главное, чтобы каждую обнову софта фиксить не пришлось. Насчет драйвера согласен, но нет опыта в написании дров, а значит на отладку я убью сейчас больше времени чем проверну хук апишек. ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 03 марта 2011 16:27 · Личное сообщение · #14 gloomdemon пишет: Я бы эту задачу под виндой, решил через фильтр IRP пакетов И получил бы в нагрузку борьбу с неожиданными бсодами, невозможность работы без прав админа и вдобавок отдал бы 500$ Verisign за сертификат, ибо иначе с win64 большой облом. Поверьте мне, разработчику драйверов с 8ми летним опытом, в кернелмод стоит лезть лишь по большой нужде. ----- PGP key ![]() |
|
Создано: 03 марта 2011 20:35 · Личное сообщение · #15 |
|
Создано: 03 марта 2011 23:32 · Личное сообщение · #16 |
|
Создано: 04 марта 2011 05:17 · Личное сообщение · #17 DenCoder пишет: Ну-ну... хотел бы я посмотреть как этот двиг в 100 строчек будет поддерживать многопоточность... Нужно отталкиваться от реальной задачи. После перехвата у меня больше апи не трогаются (в плане перезаписи), глобальные переменные только читаются, логи апи не ведутся. Ну если прижмет критические секции спасут ситуацию ![]() ----- Yann Tiersen best and do not fuck ![]() |
|
Создано: 04 марта 2011 10:27 · Личное сообщение · #18 PE_Kill Вчера сидел и напряжённо думал. Возникла такая идея. Т.к. в ядре всё представлено в виде объектов, то обязательно происходит их создание. За это отвечает функция ObCreateObject, экспортируемая, документирована в WRK. Можно реализовать всего один хук в ядре, и спуфинг готов. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 04 марта 2011 10:35 · Личное сообщение · #19 |
|
Создано: 04 марта 2011 15:15 · Личное сообщение · #20 |
|
Создано: 05 марта 2011 15:50 · Личное сообщение · #21 ntldr пишет: И получил бы в нагрузку борьбу с неожиданными бсодами, невозможность работы без прав админа и вдобавок отдал бы 500$ Verisign за сертификат, ибо иначе с win64 большой облом. Поверьте мне, разработчику драйверов с 8ми летним опытом, в кернелмод стоит лезть лишь по большой нужде. Не поверю, потому что тоже программирую драйвера и не только под win. При работе того же ntfilemon неожиданных бсодов почему то не выскакивает. А приложение собираемся запускать в kernelmode что ли? Один раз поставил и забыл, да определенное не удобство. С сертификатами тоже решаемо. Вообще утверждения наподобии "в кернелмод стоит лезть лишь по большой нужде" сравнимы по убеждениям с "goto в коде никогда не использовать, можно только 1 раз в 100 лет". ![]() |
|
Создано: 05 марта 2011 16:03 · Личное сообщение · #22 gloomdemon пишет: При работе того же ntfilemon неожиданных бсодов почему то не выскакивает. Потому что ntfilemon уже отлажен и доведен до кондиционного состояния. С самодельными аналогами бывает что у сотни пользователей все работает, а у стопервого время от времени бсод, повторить который никак не удается. И чеши репу, ищи косяк, да гадай есть ли он вообще, или это глюк говнософта коего мог понаставить тот юзер. У меня такое было не раз и не два, и спектр причин был весьма широк: это и чужой софт и глюки железа и мои косяки и несоответствие документации MSDN поведению винды. Правда в полной мере это касается лишь достаточно сложных драйверов, в простом минифильтре можно с этим не встретиться, но риск имеется. gloomdemon пишет: Один раз поставил и забыл Или не поставил, ибо все на предприятии работают под юзером и не знают админских паролей. Да и вообще я бы руки поотрывал за такой кряк и точно не стал бы его ставить. gloomdemon пишет: С сертификатами тоже решаемо. Решаемо. Или за деньги или обходными путями деактивировать систему безопасности ОС. И всё ради загрузчика к какой-то проге. ----- PGP key ![]() |
<< . 1 . 2 . |
![]() |
eXeL@B —› Программирование —› Спуфинг пути к текущей директории |