Не удается открыть файл включение detours h
Помнишь, как ты писал код, подменяющий API-вызовы в своем крутом трояне? Или хотя бы читал статью о том, как это делается? Дай угадаю — тебе не понравилось отсутствие хоть какого-нибудь инструментария от Microsoft? Так вот, хочу тебя обрадовать — теперь ситуация кардинально изменилась. Встречай Microsoft Detours!
Microsoft Detours — проект, разрабатываемый в лабораториях Microsoft Research (хотя, судя по дате последнего обновления — уже не разрабатываемый), позволяющий перехватывать Win32 API-вызовы. 64 бита он тоже умеет, но.. за 10 килобаксов :). Да, коммерческая (и 64-битная) версия стоит именно столько, а вот для образовательных (хе-хе, конечно, конечно) целей он абсолютно бесплатен. Несмотря на то, что проект давненько не обновлялся, он содержит весь необходимый для перехвата вызовов функционал, и работает безглючно (по крайней мере, я каких-либо багов не заметил).
От detours нам понадобится заголовочный файл detours.h, а также библиотеки detoured.lib, detours.lib и detoured.dll. А писать мы с тобой будем соксификатор на SOCKS4 — программка полезная, отлично показывающая возможности Microsoft Detours, а заодно вспомним спецификации этого несложного протокола.
Как оно работает?
Принцип работы прост, как дырка от жо[Артем, опять ты за свое! — прим.ред.] — мы пишем DLL, в которой реализуем нашу версию вызова cool_call(), пишем приложение, которое запускает нужный нам софт с нужной библиотекой, и подсовывающий этой софтине наш API-вызов, устанавливая jump с адресом левого вызова в начало оригинального вызова. Для примера, запустим в дебаггере любое приложение, использующее, к примеру, функцию connect(), поставим бряк на эту функцию, при остановке выполнения нажмем на Go To Disassembly, и увидим:
<………>
00411573 call dword ptr [__imp__connect@12 (4183B0h)]
<………>
Перейдем по F10 до этой строчки, нажмем F11 и окажемся в
листинге этой функции:
<………>
71A94A07 mov edi,edi
71A94A09 push ebp
Знаешь, что такое mov edi, edi? Это, по сути, NOP, пропуск такта процессора, неиспользуемая инструкция. Сюда-то и вставляется jump на нашу функцию. Теперь запустим эту программу с «левым» вызовом, подсунутым ей Detours’ом. И что же мы видим?
Да-да, вместо NOP’а появился jump на адрес нашей реализации функции connect() =).
От простого к сложному
Напишем простую программку, которая будет запускать приложение с нашей библиотекой. Для запуска понадобится всего одна функция — DetourCreateProcessWithDll(), и мы должны передать 7 что-то значащих параметров, остальное, в лучших традициях WinAPI — NULL.
- LPCTSTR lpApplicationName — полный путь к запускаемому приложению;
- BOOL bInheritHandles — будет ли приложение наследовать хэндлы от нашего launcher’a — нам это не надо, поэтому — false;
- DWORD dwCreationFlags — флаги запуска приложения.
Запускать его нужно в приостановленном режиме, поэтому CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED;
- LPSTARTUPINFOW lpStartupInfo — указатель на структуру, содержащую информацию о запуске приложения;
- LPPROCESS_INFORMATION lpProcessInformation — указатель на структуру, содержащую информацию о запущенном приложении;
- LPCSTR lpDetouredDllPath — путь до динамической библиотеки detoured.dll;
- LPCSTR lpDllName — путь до нашей DLL-ки;
В итоге код запуска приложения выглядит так:
bool res = DetourCreateProcessWithDll(L"F:\DetoursTest\Debug\DetoursTest.exe", NULL, NULL, NULL, false, dwFlags, NULL, NULL, &si, &pi, detouredName, dllName, NULL);
Не забудь обнулить структуры перед передачей в функцию, если собираешься их потом использовать! Если приложение запустилось нормально — нужно возобновить (в нашем случае — запустить) выполнение его главного потока функцией ResumeThread, передав ей в качестве параметра pi.hThread. Собственно, с «Запускатором», все.
Четверо носков
Теперь переходим к более сложному этапу — написанию самой DLL. Для соксификации приложения нам надо перехватить всегонавсего один вызов — всем известный connect(). Создавай в студии пустой проект — DLL.
Перед перехватом нужно сохранить адрес оригинальной функции, чтобы можно было ее вызвать:
int (WINAPI * real_connect) (SOCKET sock, const sockaddr *addr, int namelen) = connect;
После этого пишем свою функцию, полностью повторяющую оригинал. Обрати внимание — полностью повторяющую, то есть не только по параметрам, но и по соглашению о вызове! На эти грабли мне уже «посчастливилось» наступить, поэтому считаю своим долгом предупредить об этом тебя :).
Что мы должны сделать, чтобы соксифицировать приложение? Нам надо перехватить вызов функции connect(), и, вместо установления соединения с указанным сервером, соединиться с SOCKS-сервером, передать ему запрос на соединение, и вернуть получившийся дескриптор сокета приложению, которое запросило соединение. А приложение даже и не поймет, что работает через SOCKS-прокси, ибо протокол SOCKS прозрачен и для клиента, и для сервера.
Моя реализация этой функции проста до безобразия:
DLLEXPORT int WINAPI my_connect(SOCKET sock, const sockaddr *addr, int namelen)
return connectToSocks4(real_connect, real_send, real_recv, "68.102.100.62", 55465, (struct sockaddr_in *) addr);
>
connectToSocks4() — функция, устанавливающая соединение с SOCKS-сервером. На всякий случай, я установил хуки еще и на send() и recv(), хотя в конкретно данном случае это не требуется. Их реализацию приводить тут я не буду — она аналогична функции connect().
В точке входа нашей динамически подгружаемой библиотеки нужно, собственно, установить хуки (или снять, при завершении работы с ней). Делается это с помощью нескольких функций:
- DetourRestoreAfterWith() — восстанавливает таблицу импорта приложения после его запуска;
- DetourTransactionBegin() — вызывается перед установкой/снятием хука;
- DetourUpdateThread() — инициализирует установку/снятие хука для указанного потока;
- Подмену заданного вызова выполняет функция DetourAttach:DetourAttach(&(PVOID&)real_connect, my_connect);
После выполнения подмены нужно завершить транзакцию вызовом функции DetourTransactionCommit(). В случае, если нужно убрать хук, выполняются те же самые действия, только DetourAttach() заменяется на DetourDetach(). Теперь давай посмотрим спецификацию протокола SOCKS4.
- 1 байт — версия SOCKS, в случае четвертой версии протокола — 0x04;
- 1 байт — команда (соединиться с сервером — 0x01, привязать порт — 0x02);
- 2 байта — порт удаленного сервера (либо порт, который нужно открыть);
- 4 байта — IP-адрес, к которому нужно присоединиться;
- N+1 байт — C-строка длины N, содержащая идентификатор пользователя, завершенная нулевым байтом. N может быть равна нулю.
После этого сервер отправит нам пакет, в котором укажет, все ли его устраивает:
- 1 байт — нулевой, игнорируетсфя;
- 1 байт — результат:
- 0x5a — все ок,
- 0x5b — fail,
- 0x5c — недоступен клиентский identd,
- 0x5d — identd не смог опознать пользователя.
Пример «общения» клиента с сервером:
Клиент:
0x04 | 0x01 | 0x00 0x50 | 0x42 0x66 0x07 0x63 | 0x00
Сервер:
0x00 | 0x5a | 0xXX 0xXX | 0xXX 0xXX 0xXX 0xXX
Где 0xXX — случайное значение (эти байты должны игнорироваться)
После этого можно общаться с SOCKS-сервером, как с обыкновенным сервером, к которому мы и подключаемся. Вот как я реализовал подключение к SOCKS-у:
<… Вырезан код …>
char reply[8];
char packet[9];
packet[0] = 0x04;
packet[1] = 0x01;
packet[2] = r_host->sin_port / 0x100;
packet[3] = r_host->sin_port % 0x100;
packet[4] = r_host->sin_addr.S_un.S_un_b.s_b1;
packet[5] = r_host->sin_addr.S_un.S_un_b.s_b2;
packet[6] = r_host->sin_addr.S_un.S_un_b.s_b3;
packet[7] = r_host->sin_addr.S_un.S_un_b.s_b4;
packet[8] = 0x00;
r_send(sock, packet, 9, 0);
memset(reply, 0x00, 9);
int recvd = r_recv(sock, reply, 9, 0);
<… Вырезан код …>
return sock;Не забудь — при коннекте к сокс-серверу нужно использовать оригинальную функцию connect(), а то получится бесконечная рекурсия.
На эти грабли я уже наступил, поэтому считаю своим долгом предупредить о них тебя.Вердикт
Ну, вот и все — сегодня я научил тебя перехватывать API-вызовы абсолютно легальным, с точки зрения программирования, путем, используя костыль от самого Microsoft. Как всегда, не оставлю тебя без задания — слабо реализовать тут SOCKS5? (не бойся, пятый протокол ненамного сложнее, чем четвертый). Я надеюсь, ты понимаешь, что эту библиотеку можно использовать несколько в других, более «крупных», целях. Ну, ты меня понял :).
Только не забывай про законодательство, а то дяди в серой форме поставят вполне легальные хуки на все твои действия. Возможно, даже сроком в несколько лет.
Компилятор создает ошибку C1083, когда не удается найти требуемый файл. Эта ошибка имеет несколько возможных причин. Наиболее распространенными причинами являются неверный путь поиска include или отсутствующие или неправильно именованные файлы заголовков, но другие типы файлов и проблемы могут также вызвать C1083. Ниже приведены некоторые распространенные причины, по которым компилятор создает эту ошибку.
Указано неверное имя файла
При вводе имени файла допущена ошибка. Например, примененная к объекту директива
Файл не включен в путь поиска включаемых файлов
Это указывает компилятору искать файл в том же каталоге, который содержит исходный файл, а затем искать в других местах, заданных средой сборки. Если кавычки содержат абсолютный путь, компилятор выполняет поиск файла только в этом расположении. Если кавычки содержат относительный путь, компилятор выполняет поиск файла в каталоге относительно исходного каталога.
Если имя заключено в угловые скобки,
Если включаемые файлы находятся в другом каталоге относительно исходного каталога и в директивах Include используется относительный путь, то вместо угловых скобок следует использовать двойные кавычки. Например, если файл заголовка myheader.h находится в подкаталоге именованных заголовков проекта, в этом примере не удается найти файл и вызывается C1083:
но этот пример работает:
Проблемы с библиотекой сторонних производителей и vcpkg
если вы видите эту ошибку при попытке настроить библиотеку стороннего производителя в рамках сборки, рассмотрите возможность использования vcpkg, диспетчера пакетов C++ для установки и сборки библиотеки. vcpkg поддерживает большой и растущей список библиотек сторонних производителейи задает все свойства конфигурации и зависимости, необходимые для успешной сборки в рамках проекта.
Файл находится в проекте, но не в пути поиска включаемых файлов
Чтобы устранить эту проблему, исправьте путь, используемый компилятором для поиска включаемого или импортируемого файла. В новом проекте используются пути поиска include по умолчанию. Может потребоваться изменить путь поиска include, чтобы добавить каталог для проекта. При компиляции в командной строке добавьте путь к переменной среды include или /I параметр компилятора, чтобы указать путь к файлу.
чтобы задать путь к каталогу включения в Visual Studio, откройте диалоговое окно страницы свойств проекта. выберите VC++ каталоги в разделе свойства конфигурации в левой области, а затем измените свойство включаемые каталоги . дополнительные сведения о каталогах для отдельных пользователей и проектов, поиск которых выполняется компилятором в Visual Studio, см. в разделе страница свойств VC++ directories. Дополнительные сведения о /I параметре компилятора см. в разделе /I (дополнительные каталоги включаемых данных).
Не задана среда командной строки INCLUDE или LIB
Если компилятор вызывается из командной строки, для указания путей поиска часто используются переменные среды. Если путь поиска, описанный в переменной среды include или lib , задан неправильно, может быть сформирована ошибка C1083. Мы настоятельно рекомендуем использовать ярлык командной строки разработчика, чтобы задать базовую среду для сборок с командной строкой. Дополнительные сведения см. в разделе сборка C/C++ в командной строке. Дополнительные сведения об использовании переменных среды см. в разделе инструкции. Использование переменных среды в сборке.
Возможно, файл заблокирован или используется
Если для изменения или доступа к файлу используется другая программа, файл может быть заблокирован. Попробуйте закрыть файл в другой программе. иногда другая программа может быть Visual Studio сама по себе при использовании параметров параллельной компиляции. Если отключить параметр параллельной сборки, то эта ошибка исчезнет, а это проблема. Эта проблема также может быть вызвана другими системами параллельной сборки. Будьте внимательны при задании зависимостей файлов и проектов, чтобы порядок сборки был правильным. В некоторых случаях рекомендуется создать промежуточный проект для принудительного создания последовательности зависимостей для общего файла, который может быть создан несколькими проектами. Иногда антивирусные программы временно блокируют недавно измененные файлы для проверки. Если возможно, рассмотрите возможность исключения каталогов сборки проекта из антивирусного сканера.
Включена неправильная версия имени файла
Предкомпилированные заголовки еще не скомпилированы
Если проект настроен для использования предварительно скомпилированных заголовков, необходимо .pch создать соответствующие файлы, чтобы можно было скомпилировать файлы, использующие содержимое заголовка. например, pch.cpp файл ( stdafx.cpp в Visual Studio 2017 и более ранних версий) автоматически создается в каталоге проекта для новых проектов. Сначала необходимо скомпилировать этот файл, чтобы создать предкомпилированные файлы заголовков. В типичном проекте процесса сборки это выполняется автоматически. Дополнительные сведения см. в разделе Создание предкомпилированных файлов заголовков.
Дополнительные причины
Вы установили пакет SDK или библиотеку стороннего производителя, но после установки пакета SDK или библиотеки не открывали новое окно командной строки разработчика. Если пакет SDK или библиотека добавляет файлы в путь поиска включаемых файлов, может потребоваться открыть новое окно командной строки разработчика, чтобы получить эти изменения переменных среды.
Файл использует управляемый код, но параметр компилятора /clr не указан. Дополнительные сведения см. в разделе /clr (компиляция среды CLR).
Файл компилируется с использованием другого параметра /analyze компилятора, чем используется для предварительной компиляции заголовков. При предварительной компиляции заголовков для проекта все должны использовать одни и те же /analyze Параметры. дополнительные сведения см. в разделе /analyze (Code Analysis).
файл или каталог был создан подсистема Windows для Linux, учитывается регистр в каждом каталоге, и указанный регистр пути или файла не соответствует регистру пути или файла на диске.
Файл, каталог или диск доступен только для чтения.
Visual Studio или средства командной строки не имеют достаточных разрешений для чтения файла или каталога. это может произойти, например, когда файлы проекта имеют разные права владения, чем процесс, выполняемый Visual Studio или программ командной строки. иногда эту ошибку можно устранить, запустив Visual Studio или командную строку разработчика от имени администратора.
Недостаточно дескрипторов файлов. Закройте часть приложений и повторите компиляцию. Эта ситуация маловероятна в обычных условиях. Однако она может возникать при построении крупных проектов на компьютере с ограниченной физической памятью.
Пример
В следующем примере создается ошибка C1083, если файл заголовка "test.h" не существует в исходном каталоге или в пути поиска include.
Сведения о том, как создавать проекты C/C++ в интегрированной среде разработки или в командной строке, а также сведения о настройке переменных среды см. в разделе проекты и сборки систем.
Я пытаюсь заняться разработкой драйверов (очередь «не делай этого») Я просматривал эту страницу msdn и после установки WDK (Windows Driver Kit) 10 Я все еще не могу скомпилировать пример, который они используют на этой странице.
Как я могу это решить?
Вам нужно добавить путь заголовков WDK к вашим каталогам vcxproj include:
Свойства vcxproj - & gt; C / C ++ - & gt; Общие - & gt; Дополнительные каталоги включенияP.S .: Убедитесь, что вы устанавливаете SDK 10 вместе с WDK 10.
P.P.S: Без SDK вы получите ошибку Cannot open include file: 'ntdef.h'Я тоже столкнулся с подобной проблемой. Ниже сработало для меня:
Шаг 1 : известно о целевой платформе Windows, для которой вы собираетесь разработать драйвер. Вы можете проверить «Версия Windows» в своей системе, просмотрев Настройки-> Система-> О программе- & gt; Спецификация Windows.
Шаг 2 . Убедитесь, что вы установили совместимые «Windows SDK» и «WinSDK», соответствующие целевой версии платформы Windows.
Шаг 3 . Убедитесь, что "ntddk.h" существует в $ (DDK_INC_PATH). Этот макрос препроцессора обычно оценивается как «C: \ Program Files (x86) \ Windows Kits \ 10 \ Include \\ km». Если вы не видите папку km, внимательно следуйте ссылкам, указанным в шаге 2 выше.
Шаг 4 . Проверьте свойства проекта - & gt; Свойства конфигурации - & gt; Общие - & gt; Platform Toolset использует "WindowsKernelModeDriver".
Решил это, выбрав другую «версию Windows SDK» в Visual Studio в разделе «Свойства проекта» -> «Общие».
В каталоге C:\Program Files (x86)\Windows Kits\10\Include у меня 5 папок с Windows SDK. В самом новом (10.0.17763.0) не было подпапки km . После изменения версии Windows SDK с 10.0.17763.0 на 10.0.17134.0 в Visual Studio был обнаружен заголовок ntddk.h .
Практическое правило
Если вам нужно выполнить сборку с использованием последней (или конкретной) версии WDK, убедитесь, что установлена соответствующая версия Win SDK.
Предполагаемая причина
В процессе отладки проблемы выяснилось, что (из-за версии SDK) процесс сборки устанавливал для $ (LatestTargetPlatformVersion) значение 10.0.10586. В то время как установленный WDK предоставляет необходимые версии файлов сборки только для версии 10.0.14393. Похоже, это несколько преднамеренное поведение.
Мое дело
В моем случае это произошло из-за разных версий Win SDK и WDK . У меня были SDK 10.0.10586 и WDK 10.0.14393. Установка SDK 10.0.14393 решила проблему для меня.
Дополнительное примечание
Win SDK устанавливается с макетом по умолчанию VS2015, но по какой-то причине он не получает обновлений в процессе обновлений VS.
Существует макрос $ (DDK_INC_PATH), который можно добавить для включения каталогов вашего проекта (свойства vcxproj -> Каталоги VC ++ -> Включить каталоги)
Если вы пытаетесь создать новую систему, возможно, сначала попробуйте перенацелить решение на эту систему.
Если это не сработает, найдите подпапку KM, упомянутую в некоторых из приведенных выше объяснений, а затем попробуйте перенацелить на эту версию, изменив $ (LatestTargetPlatformVersion)
Надеюсь, тогда у вас появится возможность строить с файлом ntddk.h NB! Имейте в виду, что это приведет к тому, что ваше решение будет построено на этой конкретной платформе, и если вы попытаетесь построить на другой платформе, вам придется вручную изменить ее снова. Лучшим решением было бы сделать какой-то шаг перед сборкой, который позаботится об отсутствии SDK и установит его, однако у меня нет такого решения - любого?
Собственно Решение проблемы: необходимо войти в Power Shell,затем ввести вот этот скрипт https://habrahabr.ru/post/276059/ после заголовка Удаление в спойлере
появится список манифестов . нам необходимо удалить следующие манифесты microsoft.OpusPG и если будет в списке манифест со словами forzahorizon че то там. удаление производим с помощью ввода цифр соответствующих номеру строчки у меня например 47.затем нажимаем Enter,затем подтверждаем "Y" и добавляем манифесты заново.либо в случае с репаком от Seyter запускаем активатор и он автоматически добавит эти манифесты.надеюсь помог.Иван Константинович
Спасибо дядь,защитник что то удалил,и игра не запускалась,способ рабочий)Иван Константинович
Спасибо! Помогло! Отключайте защитник виндовз! Он портит файлыИван Константинович
у меня нет таких метро предложений а скрипты с того сайта который вы кинули запускаются пишет нажмите любую кнопку жму windows powershield запускается и моментально закрываетсяИван Константинович
Спасибо чувак, пол дня голову ломал, 3 раза игру переустановил. А файлы изначально попортил защитник виндосовский. Добавляйте папку с игрой в исключения.potap.199
Так вы зачем ссылку для браузера вводите в консоль? Перейдите по ней, а там все написано что да какЧитайте также: