Как из сурсов сделать dll

Обновлено: 06.07.2024

Добрый день.
В данном планируемом цикле статей я постараюсь объяснить основные моменты написания своих дополнений для клиентской части GoldSrc игр. В качестве «подопытного» будем использовать игру Counter Strike 1.6, хотя, этот модуль, по-идее, должен так же работать и в Half-Life и в других играх на этом же движке.

Что вам понадобится:

  • Сам клиент Counter Strike, желательно последних версий. Если у вас нет Steam, можно раздобыть здесь или купить здесь.
  • Желательно так же заполучить эту же версию клиента для Linux или MacOs (или попросить скинуть кого-нибудь hw.so или hw.dylib из неё. А лучше всю директорию Half-Life целиком)
  • Так же нам понадобится IDA PRO
  • Какая-нибудь среда разработки, например, Visual Studio.

Основные моменты

  • cl_dll
  • common
  • dlls
  • engine
  • game_shared
  • pm_shared
  • public

Приведите stdafx.h к следующему виду:

Загрузка модуля

Как наш модуль будет загружаться в игру? Всё просто, GoldSrc использует библиотеку mss32.dll, которая подгружает все .asi-файлы, находящиеся в корневой директории игры в качестве дополнительных модулей. Эти .asi-файлы, по факту, ни что иное как обычные .dll-ки.
Поэтому, в настройках проекта, в качестве конечного расширения поставьте не .dll, а .asi.

.asi-модуль под линуксом это нечто странное и не совсем понятное (они там тоже есть и тоже работают, но у них в заголовках не ELF а MZ. PE. Кто-нибудь, объясните пожалуйста, как такое возможно?), поэтому вариант "asi под Linux" я предпочитаю оставить в покое.
Зато загрузка игры нашем модулем, вроде как, должна под Linux заработать. Поэтому, по возможности, старайтесь делать код кроссплатформенным.

Если вы на данном этапе попробуете скомпилировать модуль и закинуть его в директорию Half-Life, поставив в DllMain MessageBox-ы на загрузку и на выгрузку, вы увидите, что модуль выгрузится сразу после загрузки. Причина заключается в том, что mss32.dll выгружает модуль, если в нём нет экспортируемой функции RIB_Main.
Если честно, то asi-модули для более старых версий GoldSrc, например, у версии 4554, спокойно себе грузились через DllMain, но в версии 6027 (эта та, с которой я начал эти «копания»), уже использовалась функция Rib_Main

Создайте в проекте 2 файла: AsiMain.cpp и AsiMain.h
В функцию RibMain передаются 5 параметров, из них 3- указатели на функции, использующиеся для регистрации провайдеров, которых у нас не будет, поэтому, по большому счёту, их можно заменить на void*. Однако я не оставляю надежды когда-нибудь разобраться с использованием этих модулей «по назначению», поэтому, давайте объявим функцию так, как она должна объявляться.
Для начала, заполните AsiMain.h

Теперь нужно заполнить AsiMain.cpp

Ура. Asi-модуль, который ничего не делает, готов.
Но хотелось бы, чтобы он что-то делал.
Давайте попробуем воспользоваться структурой cl_enginefuncs_t. Она описана в HLSDK\engine\APIProxy.h и в ней есть много чего полезного.
Для начала нужно её найти. По-хорошему, поиск нужных элементов нужно как-то автоматизировать. Однако, я пока не представляю, как искать структуру по сигнатуре или по каким-нибудь другим параметрам. Если мне кто-нибудь это объяснит, буду признателен. :)
Для поиска cl_enginefuncs_t воспользуемся IDA Pro, причём, желательно, сразу двумя.
Откройте hw.dll, который вы найдёте в своей директории Half-Life. По окончании декомпиляции перебазируйте модуль на 0x40000000. Это нужно для более удобного поиска адреса структуры. Для этого откройте Edit->Segments->Rebase Program, убедитесь что поставлены оба чекбокса и переключатель стоит на ImageBase и впишите в Value 0x40000000.
Теперь откройте hw.so, которую вы можете скачать отсюда.
И там и там найдите строку ScreenShake
То, что вы увидите будет выглядить примерно так:




Так как код hw.dll и hw.so большей частью одинаковый, то функциям в hw.dll можно задать нормальные имена, позаимствовав их из hw.so.



Посмотрите, по какому адресу находится cl_enginefuncs в hw.dll.
У меня это 0x40134260. Так как мы базировали модуль по адресу 0x40000000, значит смещение этой структуры будет 0x134260

Вот теперь можно что-нибудь сделать.
Объявите в AsiMain.cpp, в глобальной области


Там же, перед RibMain создайте функцию


В код RibMain, который выполняется при запуске допишите

Теперь при вводе в консоль команды SayHello будет выводиться Hello, Habrahabr.

И так, погнали значиться:

1) Надо скачать *Visual Studio 2019* или *2017* не важно если пк старый то *2017* только с дополнениями для языка программирования C++
1.1) Вам предложат скачать сразу несколько дополнений, но как уже написал вам нужен только яп (язык программирования) C++
1.2) После установки можете найти в инете ключи активации, благо их там хуево туча
1.3) Я сам юзаю "Microsoft Visual Studio 2019 Enterprise" (вот лт ключ на него: NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y)
1.4) Также, вам не обойтись без установки программы "Microsoft DirectX SDK (June 2010)" !Обязательно именно с таким названием !

2) Теперь вам предстоит скачать какой-нибудь исходник чита.
2.1) Если у вас уже есть исходник чита то это гуд
2.2) Если у вас нет исходника, то вот вам исходник чита ( CSGOSimple no ad )(там код ясный удобный как раз таки для новичка)
2.3) Хорошечно значится, у вас всё готово для редактирования, теперь заходим в папку с исходником и открываем файл .sln или иногда .vcxproj


3) Как только открыли, у вас посередине пусто, надо справа дважды нажать на какой-нибудь файл!
3.1) Теперь надо нажать ctrl+f и в окошке сверху поискать старое название чита, например тотже Osiris
3.2) Везде где увидите "Staroe nazvanie" (именно в ковычках) можете поменять на своё любое (обязательно писать внутри кавычек)
3.3) Сверху будет 2 окошки Посмотреть вложение 1137 там будет у вас 2 выбора на 2 окошках ! Всегда выбирайте Release и X86 !
3.4) Нажмите правой кнопкой мыши сюда: Посмотреть вложение 1138 у вас начнётся компилирование, а в конце снизу выдаст путь до собранной .dll

4) Чтобы не крашило нужно обновить оффсеты и паттерны (т.е. значения смещений и переменных)
4.1) Чтобы найти оффсеты, нужен поиск по таким значениям m_iHealth или m_ArmorValue(они выглядят так: 0x100 или 0x3918)
4.2) После того как нашли, идём в собранный список оффсетов из последних обновлений ксго: HazeDumper (no ad)
4.3) Д опустим, вы нашли в исходнике значение "m_iHealth - 0x101", а в списке: а в списке: "m_iHealth - 0x100" , то надо копировать значение из списка и ставить взамен старых значений в исходнике!

5) Как сделать чтоб не крашило, чтоб обновить индексы вам нужно понять как они выглядят. Выглядят они так: 157 или 452.

5.1) Теперь узнать новые индексы, благо раздобыл из UC (no ad) таблицу индексов:

5.2) Ищем (Ctrl+f) названия из таблицы: IsPlayer, IsWeapon и т.д., если они отличаются от последних указанных в таблице, меняем.

5.3) Индексы обновляются не очень часто, и если и случается такое, то 3-4 штуки за раз.

6) Почему крашит, для начала нужно скомпилировать софт в Debug | x86.

6.1) Запускаем CS:GO и в Visual Studio нажимаем: Посмотреть вложение 1140 , выбираем кс.

6.2) Инжектим собранную длл-ку в игру через любой инжектор (я рекомендую Proccess Hacker 2)-

6.3) Если произойдёт краш игры, то вас перебросит в Visual Studio (проще VS или визуалка) и укажет на причину краша.

Пункты:
1) Изначальная подготовка любого кодера! (Обязательная часть)
2) Знакомство с кодом! (Присмотритесь, если поработать с нескольким десятком исходников, будет ясно, что за что отвечает)
3) Для тех кто хочет сразу получить "Свой софт"! (Это называется ReName, не злоупотребляйте)
4) Как обновить оффсеты (Не обязательно, т.к. все софты имеют авто обновление оффсетов)
5) Как обновить индексы! (Необходимы своевременные обновления ибо зачастую краши из-за них)
6) Как дебажить! (Дебаг - функция определения неисправностей в коде, в софтах используется для выяснения: "почему крашит")

И так, погнали значится:

1) Надо скачать Visual Studio 2019 или 2017 не важно если пк старый то 2017 только с дополнениями для языка программирования C++
1.1) Вам предложат скачать сразу несколько дополнений, но как уже написал вам нужен только яп(язык программирования) C++
1.2) После установки можете найти в инете ключи активации, благо их там хуево туча
1.3) Я сам юзаю " Microsoft Visual Studio 2019 Enterprise " ( вот лт ключ на него: NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y )
1.4) Также, вам не обойтись без установки программы "Microsoft DirectX SDK (June 2010)" ! Обязательно именно с таким названием !
2) Теперь вам предстоит скачать какой-нибудь исходник чита.
2.1) Если у вас уже есть исходник чита то это гуд
2.2) Если у вас нет исходника, то вот вам исходник чита ( CSGOSimple no ad )(там код ясный удобный как раз таки для новичка)
2.3) Хорошечно значится, у вас всё готово для редактирования, теперь заходим в папку с исходником и открываем файл .sln или иногда .vcxproj
3) Как только открыли, у вас посередине пусто, надо справа дважды нажать на какой-нибудь файл!
3.1) Теперь надо нажать ctrl+f и в окошке сверху поискать старое название чита, например тотже Osiris
3.2) Везде где увидите "Staroe nazvanie" (именно в ковычках) можете поменять на своё любое (обязательно писать внутри ковычек)
3.3) Сверху будет 2 окошки там будет у вас 2 выбора на 2 окошках ! Всегда выбирайте Release и X86 !
3.4) Нажмите правой кнопкой мыши сюда: у вас начнётся компилирование, а в конце снизу выдаст путь до собранной .dll
4) Чтобы не крашило нужно обновить оффсеты и паттерны (т.е. значения смещений и переменных)
4.1) Чтобы найти оффсеты нужен поиск по таким значениям m_iHealth или m_ArmorValue(они выглядят так: 0x100 или 0x3918)
4.2) После того как нашли, идём в собранный список оффсетов из последних обновлений ксго: HazeDumper (no ad)
4.3) Д опустим, вы нашли в исходнике значение "m_iHealth - 0x101", а в списке: а в списке: "m_iHealth - 0x100" , то надо копировать значение из списка и ставить взамен старых значений в исходнике!

5) Как сделать чтоб не крашило, чтоб обновить индексы вам нужно понять как они выглядят. Выглядят они так: 157 или 452.

5.1) Теперь узнать новые индексы, благо раздобыл из UC (no ad) таблицу индексов:

5.2) Ищем (Ctrl+f) названия из таблицы: IsPlayer, IsWeapon и т.д., если они отличаются от последних указанных в таблице, меняем.

5.3) Индексы обновляются не очень часто, и если и случается такое, то 3-4 штуки за раз.

6) Почему крашит, для начала нужно скомпилировать софт в Debug | x86.

6.1) Запускаем CS:GO и в Visual Studio нажимаем: , выбираем кс.

6.2) Инжектим собранную длл-ку в игру через любой инжектор (я рекомендую Proccess Hacker 2)-

6.3) Если произойдёт краш игры, то вас перебросит в Visual Studio (проще VS или визуалка) и укажет на причину краша.

Ниже мы рассмотрим проблемы с работой DDL файлов в самых популярных версиях операционной системы Windows, разберем почему возникают проблемы с DLL, а также предоставим способы их устранения.

Содержание:

  • Почему возникают ошибки с DLL?
  • Решение проблем с DDL файлами.
  • Недостающие компоненты C++ Runtime Library и DirectX.
  • Удаление сбойного приложения.
  • Обновление драйверов устройства.
  • Другие проблемы с DLL библиотеками.
  • Что делать если важный файл или DLL библиотека были случайно удалены?

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

Почему возникают ошибки с DLL?

Ошибки DLL могут возникать по самым различным причинам. Чаще всего они проявляют себя при запуске каких-либо приложений и программ. Нередки случаи, когда ошибки с DLL происходят во время запуска недавно вышедших компьютерных игр или программ.

Из-за ошибок DLL приложение может не корректно работать или вовсе не загружаться, поэтому следует ознакомиться с возможными причинами появления ошибок.

Одними из основных причин возникновения ошибок DLL является простое отсутствие библиотек , которые требуются для работы приложений. Недостающие файлы могут быть удалены самим пользователем, уничтожены вирусами или перезаписанными более старыми версиями в процессе установки программных компонентов. Помимо этого, ошибки могут возникать из-за неправильной работы драйверов , недостающего программного обеспечения таких, как NET Framework, DirectX и т.д.

Стоит отметить, ошибки DLL могут быть вызваны и более серьезными проблемами, связанными с жестким диском .

Решение проблем с DDL файлами

DLL библиотеки тесно вплетены в различные системные процессы, поэтому при повреждении некоторых из них, операционная система может попросту перестать запускаться. Если это произошло, следует прибегнуть к встроенным средствам восстановления системы . Что бы попасть в среду восстановления достаточно вставить загрузочную флешку или диск с Windows, либо автоматически попасть в среду после трех неудачных попыток загрузки .

Пункты "Восстановление системы" "Восстановление образа системы" и "Восстановление при загрузке" подойдут для решения большинства логических проблем операционной системы. Пункты "Восстановление системы" "Восстановление образа системы" и "Восстановление при загрузке" подойдут для решения большинства логических проблем операционной системы.

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

Если проблема кроется в некорректной работе загрузчика, рекомендуем ознакомится со способами исправления в статье «Как восстановить загрузчик Windows 10» .

Недостающие компоненты C++ Runtime Library и DirectX

Чаще всего пользователи сталкиваются с проблемой ошибок DLL, которые связаны с отсутствием необходимых компонентов C++ Runtime Library либо DirectX .

Существует два способа решения проблем с недостающими компонентами DLL. Первый и более правильный – полная переустановка сбоящего ПО. Второй – скачивание непосредственного одного компонента, вызывающего ошибку.

Ошибка msvcr100.dll – сбойный компонент в системе безопасности.

Ошибки dxgi.* , d3dx9_25.*, d3d11.*, d3dx9.*, d3dx9_43.*, xinput1_3.*, d3dx9_31.*, xinput1_2.*, d3dx9_31.*, d3dx9_34.*, d3dx9_42.*, x3daudio1_7.*, x3daudio1_6.*, xrsound.* d3dx10_43.*, d3dx9_26.*, d3dx9_30.*, d3dx9_27.*, d3dx11_43.*, d3dcompiler_43.*, d3d10.*.

Ошибка steam_api.dll – распространённая ошибка среди геймеров и пользователей магазина цифровой дистрибуции Steam. Часто возникает при установке пиратских сборок игр и взломанных клиентов Steam.

Важно: мы настоятельно не рекомендуем скачивать отдельные недостающие файлы steam_api.dll, которые можно часто встретить на просторах интернета. Это обусловлено тем, что многие злоумышленники специально распространяют зараженные файлы или шпионские утилиты под видом dll-файлов. Если такой файл попадет на компьютер пользователя, существует большая вероятность утери доступа к аккаунту.

Ошибка uplay_r1_loader.* , Uplay.exe, uplay.*, ubiorbitapi_r2_loader.* — аналогичная ошибка, как и с со Steam.

Ошибка xlive – проблемы с файлами цифрового магазина Microsoft.

Ошибка msvcrt.* , msvcr71.*, msvcrt.*, msvcp120.*, msvcp110.* x64 msvcr90.*, msvcr110.*, msvcr100.*, msvcr80.*, msvcr120.*.

Ошибка physxcudart_20.* , physxloader.* и т.д.- проблемы с файлами NVIDIA PHYSX SYSTEM.

Удаление сбойного приложения

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

Чтобы определить сбойное приложение, необходимо:

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

Читайте также: