Сейчас на форуме: bartolomeo, tyns777 (+6 невидимых)

 eXeL@B —› Программирование —› Спуфинг пути к текущей директории
<< . 1 . 2 .
Посл.ответ Сообщение


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 02 марта 2011 09:11
· Личное сообщение · #1

Требуется из ring3 подменить путь, который возвращает GetCommandLine в чужом приложении. Ну понятно, инжект, сплайс апи. Но потом приложение вычленяет оттуда путь к своей директории и начинает активно работать со своими библиотеками и файлами. Сталобыть нужно делать спуфинг. Собственно вопрос, что хукать для спуфинга?

NtOpenFile, NtCreateFile, SetCurrentDirectory, LdrLoadDll

Что еще?

-----
Yann Tiersen best and do not fuck




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 03 марта 2011 09:40
· Личное сообщение · #2

Если уж на то пошло - можно из таблиц ФС путь до любого файла найти.

-----
продавец резиновых утёнков





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 03 марта 2011 09:44
· Личное сообщение · #3

Зачем? Кто искать будет, программа? Она работает только на высокоуровневых АПИ, ибо коммерческий проект.

-----
Yann Tiersen best and do not fuck




Ранг: -0.9 (гость)
Активность: 0.010
Статус: Участник

Создано: 03 марта 2011 10:00
· Личное сообщение · #4

Про GetModuleFileName не забудте.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 03 марта 2011 10:07
· Личное сообщение · #5

Количество функций для хука кажется бесконечным...

Вот смотрите. Допустим, вы похукали GetCurrentDirectory, и в ответ на вызов подсовываете программе буфер с таким содержимым, чтоб пройти проверку контрольной суммы. Далее, программа вызывает SetCurrentDirectory с адресом директории system32, обращается к каким-то либам, но не по именам, а генерируя полный адрес через вызов GetCurrentDirectory + имя либы. Тупо, конечно, надумано, но возможно. А вы ей всё также подсовываете поддельный буфер при вызове GetCurrentDirectory. Далее происходит ахтунг.

Думаю, таких примеров можно придумать много.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 03 марта 2011 10:39 · Поправил: DenCoder
· Личное сообщение · #6

HiEndsoft пишет:
можно из таблиц ФС путь до любого файла найти


Поддерживаю Джолли Роджера! А почему бы фильтр на файловую систему не написать или воспользоваться уже готовым и прогонять на всех нужных осях? Может, решение трудоемким будет, но зато универсальным и в будущем не раз пригодится!

А так хукать различные апи - кто ее знает, какими изощренными функами этот коммерческий проект будет пользоваться в дальнейшем, кто их там знает, какого кодера уволят, какого возьмут и подключат к делу. Разработчики ПО готовы на все пойти ради защиты своего продукта.

-----
IZ.RU





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 03 марта 2011 10:41 · Поправил: PE_Kill
· Личное сообщение · #7

ARCHANGEL Это ты хардкор какой то предложил. Спуфинг - это подмена, т.е. эмулируется фнукция так:

Code:
  1. function MyDeleteFileW(lpFileName: PWideChar): BOOL; stdcall;
  2. var
  3.   NewFileName: WideString;
  4. begin
  5.   NewFileName := WideString(SpoofFilePath(String(lpFileName)));
  6.   Result := TrueDeleteFileW(PWideChar(NewFileName));
  7. end;


Т.е. если путь идет куда то кроме поддельного, то мы его не трогаем, если это поддельный путь, то мы его заменяем на настоящий. Отсюда следует, что:

ARCHANGEL пишет:
Допустим, вы похукали GetCurrentDirectory, и в ответ на вызов подсовываете программе буфер с таким содержимым, чтоб пройти проверку контрольной суммы

Не правильно, тут мы проверим, если текущая директория ведет в программу, то мы подменим, если нет, то вернем результат апи функции.

ARCHANGEL пишет:
алее, программа вызывает SetCurrentDirectory с адресом директории system32, обращается к каким-то либам, но не по именам, а генерируя полный адрес через вызов GetCurrentDirectory + имя либы.

Пусть делает так, тут опять проверка, если путь устанавливается на поддельный, то мы установим текущую директорию на ту, где лежит программа, иначе просто выполним апи.

ARCHANGEL пишет:
А вы ей всё также подсовываете поддельный буфер при вызове GetCurrentDirectory. Далее происходит ахтунг.

Ну выше я уже объяснил, что навешиваемые фильры умные и следят что обрабатывать а что нет, поэтому ахтунга не будет.

ЗЫ Уже написал фильтры для 26 апи (A/W/ExA/ExW) добавляю теперь всякие экзотические и можно будет тестить.

-----
Yann Tiersen best and do not fuck





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 03 марта 2011 10:46 · Поправил: PE_Kill
· Личное сообщение · #8

DenCoder пишет:
А почему бы фильтр на файловую систему не написать или воспользоваться уже готовым и прогонять на всех нужных осях? Может, решение трудоемким будет, но зато универсальным и в будущем не раз пригодится!

Возможно, только времени 2 недели, а эта часть работы крупица от всего объема. Т.е. решения должны быть прямо пропорциональны задаче/времени/оплате/требованиям.

DenCoder пишет:
А так хукать различные апи - кто ее знает, какими изощренными функами этот коммерческий проект будет пользоваться в дальнейшем, кто их там знает, какого кодера уволят, какого возьмут и подключат к делу.

Данный конкретный софт можно защитить 30 строчками кода, и не надо будет ни хешей, ни перехватов и никакие драйверы не помогут. Защита будет неломаемой, просто еще очень много времени пройдет, прежде чем софтверные конторы начнут привлекать спецов по защите своего ПО, а до этого времени можно извращаться

-----
Yann Tiersen best and do not fuck




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 03 марта 2011 10:51
· Личное сообщение · #9

PE_Kill пишет:
NewFileName := WideString(SpoofFilePath(String(lpFileName)));

Может лучше при обработке приводить всё к юникоду, а не наоборот?

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 03 марта 2011 10:58 · Поправил: DenCoder
· Личное сообщение · #10

PE_Kill пишет:
Возможно, только времени 2 недели, а эта часть работы крупица от всего объема

А Вы посчитайте, сколько уйдет времени на поиск и сплайсы всех нужных фунок. Не знаю, кто как пишет, но у меня уходило и больше... на сплайсы

P.S. Правда сам свой двиг писал.

-----
IZ.RU





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 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




Ранг: 18.2 (новичок), 8thx
Активность: 0.010
Статус: Участник

Создано: 03 марта 2011 14:28
· Личное сообщение · #12

ntldr пишет:
Решение неадекватно задаче. Задача - сделать лоадер для проги, а запускать эту прогу могут в любой ОС вплоть до вайна, сталобыть хукаем то, что гарантированно есть и 100% документировано.


Тогда не адекватная задача, потому что, что нибудь да отвалится, особенно в том же вайне или прогу решат запускать под win32s, 100% гарантии быть не может.

Я бы эту задачу под виндой, решил через фильтр IRP пакетов, тогда можно не заморачиваться с вызовами api и т.д. Исходный код можно взять из NTFilemon, там все есть. Для wine задача решается еще проще, все родные фс для linux, bsd и т.д. поддерживаю симлинки, и сам вайн умеет редиректить пути, нужно только в конфиге указать что и куда.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 03 марта 2011 15:26
· Личное сообщение · #13

gloomdemon пишет:
Тогда не адекватная задача, потому что, что нибудь да отвалится

Хукать фаст кол всё равно не вариант, в Win2k int 2e юзается. Ну а отвалится, я же на сапорте буду, пофикшу. Мне главное, чтобы каждую обнову софта фиксить не пришлось. Насчет драйвера согласен, но нет опыта в написании дров, а значит на отладку я убью сейчас больше времени чем проверну хук апишек.

-----
Yann Tiersen best and do not fuck




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 03 марта 2011 16:27
· Личное сообщение · #14

gloomdemon пишет:
Я бы эту задачу под виндой, решил через фильтр IRP пакетов

И получил бы в нагрузку борьбу с неожиданными бсодами, невозможность работы без прав админа и вдобавок отдал бы 500$ Verisign за сертификат, ибо иначе с win64 большой облом.
Поверьте мне, разработчику драйверов с 8ми летним опытом, в кернелмод стоит лезть лишь по большой нужде.

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 03 марта 2011 20:35
· Личное сообщение · #15

PE_Kill пишет:
Движок там писать вообще нефиг делать 100 строчек кода.

Ну-ну... хотел бы я посмотреть как этот двиг в 100 строчек будет поддерживать многопоточность...

-----
IZ.RU




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 03 марта 2011 23:32
· Личное сообщение · #16

DenCoder пишет:
Ну-ну... хотел бы я посмотреть как этот двиг в 100 строчек будет поддерживать многопоточность...

А в чём там сложности 100 строчек - даже много, если взять например Си, на асме - в самый раз.

-----
продавец резиновых утёнков





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 04 марта 2011 05:17
· Личное сообщение · #17

DenCoder пишет:
Ну-ну... хотел бы я посмотреть как этот двиг в 100 строчек будет поддерживать многопоточность...

Нужно отталкиваться от реальной задачи. После перехвата у меня больше апи не трогаются (в плане перезаписи), глобальные переменные только читаются, логи апи не ведутся. Ну если прижмет критические секции спасут ситуацию

-----
Yann Tiersen best and do not fuck





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 04 марта 2011 10:27
· Личное сообщение · #18

PE_Kill
Вчера сидел и напряжённо думал. Возникла такая идея. Т.к. в ядре всё представлено в виде объектов, то обязательно происходит их создание. За это отвечает функция ObCreateObject, экспортируемая, документирована в WRK. Можно реализовать всего один хук в ядре, и спуфинг готов.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 04 марта 2011 10:35
· Личное сообщение · #19

ARCHANGEL
Не о том вы думаете ей богу.
WRK это не документация. Ее по идее у вас вообще быть не должно

По вашему предложению:

1. Здравствуйте бсоды
2. До свиданья Win64
3. До свиданья wine-эмуляторы

Решение не то что бы неадекватное, оно просто нежизнеспособное.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 04 марта 2011 15:15
· Личное сообщение · #20

Собственно спуфинг путей уже готов, к сожалению пока не могу протестировать, т.к. нужно закончить спуфинг железа. Еще пару дней и поделюсь результатом.

-----
Yann Tiersen best and do not fuck




Ранг: 18.2 (новичок), 8thx
Активность: 0.010
Статус: Участник

Создано: 05 марта 2011 15:50
· Личное сообщение · #21

ntldr пишет:
И получил бы в нагрузку борьбу с неожиданными бсодами, невозможность работы без прав админа и вдобавок отдал бы 500$ Verisign за сертификат, ибо иначе с win64 большой облом.
Поверьте мне, разработчику драйверов с 8ми летним опытом, в кернелмод стоит лезть лишь по большой нужде.


Не поверю, потому что тоже программирую драйвера и не только под win. При работе того же ntfilemon неожиданных бсодов почему то не выскакивает. А приложение собираемся запускать в kernelmode что ли? Один раз поставил и забыл, да определенное не удобство. С сертификатами тоже решаемо.

Вообще утверждения наподобии "в кернелмод стоит лезть лишь по большой нужде" сравнимы по убеждениям с "goto в коде никогда не использовать, можно только 1 раз в 100 лет".



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 05 марта 2011 16:03
· Личное сообщение · #22

gloomdemon пишет:
При работе того же ntfilemon неожиданных бсодов почему то не выскакивает.

Потому что ntfilemon уже отлажен и доведен до кондиционного состояния. С самодельными аналогами бывает что у сотни пользователей все работает, а у стопервого время от времени бсод, повторить который никак не удается. И чеши репу, ищи косяк, да гадай есть ли он вообще, или это глюк говнософта коего мог понаставить тот юзер. У меня такое было не раз и не два, и спектр причин был весьма широк: это и чужой софт и глюки железа и мои косяки и несоответствие документации MSDN поведению винды.
Правда в полной мере это касается лишь достаточно сложных драйверов, в простом минифильтре можно с этим не встретиться, но риск имеется.

gloomdemon пишет:
Один раз поставил и забыл

Или не поставил, ибо все на предприятии работают под юзером и не знают админских паролей. Да и вообще я бы руки поотрывал за такой кряк и точно не стал бы его ставить.

gloomdemon пишет:
С сертификатами тоже решаемо.

Решаемо. Или за деньги или обходными путями деактивировать систему безопасности ОС. И всё ради загрузчика к какой-то проге.

-----
PGP key <0x1B6A24550F33E44A>



<< . 1 . 2 .
 eXeL@B —› Программирование —› Спуфинг пути к текущей директории
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати