Как открыть assembly csharp dll
-сборка лежит в папке отличной от корневой и C:\Windows\assembly\
-на другой машине без этой сборки ничего не работает
-если сборка в корне или в папке C:\Windows\assembly\, то все окей
-никак не получается запустить сборку через домены
-никак не удается запустить ее через метод LoadFrom()
-пути все правильные
Подскажи, каким макаром ее запускать?
Спасибо.
Помощь в написании контрольных, курсовых и дипломных работ здесь
Assembly.Load - OutOfMemoryException
При загрузке сборки из массива байтов(дешифрованных CryptoStream'ом) я получаю.
Напишите сообшение об ошибке которое выдаёт программа
Именно, этот метод срабатывает. Спасибо за намек. Это такой "вай аут", выход из положения.
Но как же быть с загрузкой сборок в домен приложения или загрузкой из сборки?
Ошибка самая обычная: Не найдена сборка такая-то такой-то версии, такой-то паблик ключ по такому-то пути, зафиксировано вхождение в таком то классе. Далее показывает какие сборки загрузились.
Я, конечно, извиняюсь за такое описание ошибки, но пока нет под рукой машины с хп и виртуалбокса.
Но как же быть с загрузкой сборок в домен приложения или загрузкой из сборки? Не могу ничего сказать про абстрактного коня сами знаете гдеНе разу не сталкивался с неразрешимой проблемой по загрузке dll. Если есть конкретика а студию
А так рад что помогло. Ладно, приду домой, распишу каких я там коней использовал )
ПОДПИСЫВАЙТЕ СБОРКИ, ГОСПОДА!
прям слов уже нет.
В итоге "вэй аут" не сработал, лог ошибки с машины с хп:
See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.
************** Exception Text **************
System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.ReportViewer.WinForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. Не удается найти указанный файл.
File name: 'Microsoft.ReportViewer.WinForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
at NalogUser.Forms.FormAnalysisData.InitializeComponent()
at NalogUser.Forms.FormAnalysisData..ctor(Core Cr)
at NalogUser.FormApp.отчетToolStripMenuItem_Click(Object sender, EventArgs e)
at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventA rgs e)
at System.Windows.Forms.ToolStripItem.FireEventInteractive(Even tArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventA rgs mea)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ToolStrip.WndProc(Message& m)
at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(M essage& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Mes sage& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].
Использую следующий код для загрузки сборки:
Переменная в файле setting.config NalogUser.Properties.Settings.Default.MicrosoftReportViewerW inForms = \dll\Microsoft.ReportViewer.WinForms.dll
По "Output" листу вижу, что все сборки пытаются загрузиться с GAC
В чем кроется проблема?
1 Так что я вижу по колстеку так это то что падает отнють не в Assembly.LoadFile
а падение происходит уже гдето в работаюшей программе.
2 не понятно зачем грузить данную сборку таким образом если она и так в гаке валяется.
3 если та сбока которую вы грузите таким способом есть в гаке, то будет загружена сборка из гака.
учитывая пункт 1, что именно вы делаете когда происходит падение.
по колстеку у вас выполняется какоето действие, вы кудато кликнули.
а зачем таким образом что то грузить что и так есть в стандартном наборе фраемворка начиная с версии 3.5.
что то вы не договариваете
и ешё посмотрете загруженные модули когда у вас этот эксепшен вываливается. там есть эта сборка ? ну я думаю что есть
Я преследовал две цели:
- Убрать "поломку" предмета в результате применения модификаторов
- Не расходовать модификаторы при крафте
Вот так выглядит окно крафта в игре:
Для начала я опишу процесс модификации старой версии игры (0.7.8)
Ищем логику крафта
Итак, запускаем dnSpy и открываем Assembly-CSharp.dll
Мы сразу видим невероятно длинный список классов. В данном случае целью является модификация системы крафта, поэтому поступаю просто — ищу классы, в названии которых встречается Craft и просматриваю их логику по диагонали.
После непродолжительных поисков мы нашли искомое — класс CraftingSlotManager:
А именно метод Forge() в данном классе:
С моей точки зрения данный код выглядит не так уж и плохо. Даже и не скажешь сразу, что это декомпелированная версия (выдают только названия переменных в духе num1, num2. ). Есть даже логирование, которое позволяет легче понять назначение веток.
После изучения кода я выяснил примерный механизм работы — у нас есть несколько CraftingSlot 'ов, в которые мы помещаем предмет крафта и модификаторы. CraftingSlotManager соответсвенно управляет взаимодействием этих слотов и в целом отвечает за логику крафта.
Отключаем расходование ресурсов при крафте
Нас интересуют две переменные: this.modifier и this.support
Это слоты для модификаторов, которые используются во время крафта.
Как оказалось уничтожение модификаторов происходит в процессе следующих вызовов:
Хотя для меня не очевидно, почему очистка слота обязательно должна удалять его содержимое (а не, например, возвращать обратно в инвентарь) — это вопрос наименования методов и переменных и к нашему исследованию отношения не имеет.
Удаляем все вызовы this.modifier.Clear(); и this.support.Clear(); из кода функции и радуемся
Процесс редактирования в dnSpy просто фантастика — просто поправили код и сохранили в .dll — все изменения будут скомпилированы автоматически:
Убираем поломку предмета в процессе крафта
В игре поломка предмета в процессе крафта называется Fracture, поэтому мне сразу бросился в глаза данный кусок кода:
И действительно — модификация вида int num3 = -10; полностью отключает поломку — спасибо разработчикам за оставленный дебаг флаг.
Часть вторая, где мы испытываем боль и страдания
Начиная с версии 0.7.9 разработчики начали использовать IL2CPP для того, чтобы собирать проект напрямую в нативный бинарник под нужную платформу. В результате у нас больше нет IL-кода, а есть лишь хардкорный ассемблер… но кого это останавливало?
Автор статьи не является реверс-инженером, а имеет за спиной только остатки университетского курса Ассемблера и один No-CD, сделанный в OllyDbg 10 лет назад. Вполне возможно, что какие-то вещи были сделаны неправильно или их можно было сделать намного лучше и проще
Ищем иголку в стоге Гидры
Итак, из папки игры пропали все старые .dll-ки и мы взамен получили один огромный GameAssembly.dll весом в 55 мегабайт. Наши цели не изменились, но теперь все будет намного сложнее.
Первым делом загружаем dll-ку в Ghidra'у и соглашаемся на все виды анализа, которые она предлагает (анализ занимает довольно много времени и в дальнейшем я останавливал его на стадии Analyze Address Table )
На этом я, как начинающий реверсер, и закончил бы, ведь каким образом тут искать нужный нам код — совершенно мне непонятно.
К счастью погуглив на тему IL2CPP я нашел утилиту Il2CppDumper, которая позволяет частично восстановить информацию на основе метадата-файла (который обнаружился по пути <GameFolder>/il2cpp_data/Metadata/global-metadata.dat ). Не знаю является ли данный файл необходимостью или разработчики просто забыли убрать его, но он сильно облегчил нашу задачу.
Скармливаем утилите наши файлы dll и метадаты и получаем набор восстановленных данных:
В папке DummyDll находятся восстановленные dll-ки с частично восстановленным IL-кодом. Загружаем восстановленный Assembly-CSharp.dll в dnSpy и идем в наш любимый CraftingSlotManager :
Ну что же, кода у нас больше нет, зато у нас есть адрес! В аннотации
Нам нужно значение VA — это оффceт, по которому мы найдем нашу функцию в Гидре:
Теперь мы хотя бы нашли начало нашей функции, что уже неплохо.
Можно ли сделать лучше? Вспоминаем, что Il2CppDumper генерирует данные, котрые можно импортировать в Гидру — копируем скрипт в папку скриптов Гидры, запускаем ghidra.py и скармливаем ему script.json , сгенерированный из нашей метадаты. Теперь у всех функций, которые были объявлены в исходном коде, появились имена.
Отключаем расходование ресурсов при крафте
Мы уже знаем, что нам достаточно убрать вызовы this.modifier.Clear(); и this.support.Clear(); . Осталось найти их в коде. К счастью восстановленные имена функций помогают решить эту задачу довольно просто.
Ломать — не строить. Чтобы убрать вызов функции нам достаточно заменить все байты, участвующие в CALL на NOP
Разбиваем команду на отдельные байты (выделив ее и нажав C, или Clear Code Bytes), затем в бинарном представлении просто впечатываем 90 пять раз. Готово!
Такую операцию повторяем для всех вызвов OneSlotItemContainer$$Clear() из нашей функции Forge() (На самом деле это нужно делать не для всех вызовов, потому что в коде есть один вызов this.main.Clear(); Но мне было слишком лениво выискивать конкретное исключение в ассемблерной каше, поэтому я убрал все вызовы).
Убираем поломку предмета в процессе крафта
Изначально мы делали int num3 = -10; и благодарили разработчика за оставленный дебаг флаг в качестве подсказки. Теперь это не кажется такой простой задачей — сложно понять, какая из
60 локальных переменных, найденных Гидрой, является нужной. После 15 минут поиска мне наконец удалось понять, что зубодробительная строчка на скриншоте ниже является той самой проверкой дебаг флага и вычитанием из переменной.
К сожалению моих знаний Ассемблера не хватило, чтобы понять как именно это работает (судя по Гидре этот процесс занимает 4 команды начиная с MOVZX и заканчивая на AND), поэтому деликатно изменить эту часть я не смог. Другого способа изменить эту переменную я тоже не нашел в силу своих ограниченных знаний, поэтому я изменил подход.
Посмотрев еще раз в замечательный (после работы с Гидрой) код старой версии игры в dnSpy я увидел, что за накопление "нестабильности" отвечает метод AddInstability
Гидра радует нас относитлеьно простым кодом данной функции:
По коду мы видим, что сначала происходит вызов CALL ItemData$$RollFractureTier , затем мы проверяем результат TEST EAX и прыгаем в нужную ветку:
Нам нужно, чтобы мы всегда шли по ветке uVar3 < 1 . Тут можно сделать разные исправления — например (могу ошибаться) поменять JG(Jump short if greater) на JLE(Jump short if less or equal).
Я решил вопрос иначе — просто сделаем проверяемый регистр равным нулю и тогда остальной код будет работать как надо. Меняем CALL на XOR EAX, EAX (самый просто способ обнулить регистр в Ассемблере), который занимает два байта и оставшиеся три байта заполняем NOP'ами.
Готово! Сохраняем, заменяем существующий GameAssembly.dll (почему-то Гидра в процессе экспорта файла всегда добавляет расширение .bin и его нужно удалять) и чувствуем себя хакерами.
Выводы
Для многих компиляция является "путем в один конец", а бинарные файлы представляются неуязвимыми бастионами, которые способны пасть только перед лучшими хакерами.
В реальности многие популярные языки компилируются в примежуточный код, который замечательно трактуется и модифицируется профильными декомпиляторами. Для подобных модификаций зачастую хватит обычного умения программировать хоть на чем-нибудь.
И, хотя нативные бинарники и могут представлять опасность для ваших глаз и мозга, поверхностных знаний о том, как работают программы на уровне, близком к железу, зачастую бывает достаточно в связке с современными open-source инструментами для небольших модификаций.
В предыдущих версиях Unity скрипты собирались в единую сборку Assembly-CSharp.dll.
И при добавлении новых скриптов увеличивалось время компиляции. Теперь в новой версии появилась возможность определять собственные управляемые сборки, основанные на скриптах внутри папки, что существенно сокращает время компиляции, особенно в больших проектах. Теперь можно думать о каждой управляемой сборке как о единой библиотеке в проекте Unity.
На рисунке выше показано, как вы можете разделить сценарии проекта на несколько сборок. Если вы только изменяете скрипты в Main.dll, ни одну из других сборок не потребуется перекомпилировать. Поскольку Main.dll содержит меньше скриптов, он также компилируется быстрее, чем Assembly-CSharp.dll.
Аналогичным образом, изменения скриптов, которые вы делаете в Stuff.dll, будут приводить только к перекомпиляции файлов Main.dll и Stuff.dll.
Как использовать файлы определения сборки
Файлы определения сборки — это asset файлы, созданные вами, перейдя в Assets → Create → Assembly Definition. Это файл с расширением .asmdef.
Примечание. Имя папки, в которой находится файл определения сборки, и имя файла файла определения сборки не влияют на имя сборки.
Создадим папку Scripts. А ней папки Locomotion, Editor, Utils. В папке Locomotion еще две папки Normal и Anvanced. Теперь создаем скрипты
Utils → MoveExtension.cs
Locomotion → Anvanced → AdvJump.cs
Locomotion → Anvanced → AdvMoveForward.cs
Locomotion → Normal → Jump.cs MoveForward
Locomotion → Normal → MoveForward.cs
Locomotion → LookForward.cs
Editor → MoveForwardEditor.cs
И скрипте MoveForwardEditor определим немного кода, чтобы нужна была ссылка на MoveForward.
Теперь чтобы нам создать управляемы сборки нужно в папке со скриптами создать .asmdef файлы. Причем если этот файл лежит в папке допустим Locomotion, то в файл сборки подхватит и скрипты из папок Advanced и Normal, если в этих папках не определены свои файлы сборки.
В папке Utils создаем сборку UtilityAsm.asmdef
В папке Locomotion создаем файл сборки LocomotionAsm.asmdef
В папке Locomotion → Anvanced → LocomotionAdvancedAsm.asmdef
В папке Editor EditorAsm.asmdef
В папке Locomotion → Normal ничего не создаем, т.к. скрипты из этой папки попадут в сборку LocomotionAsm
И тут мы получаем ошибку…
Assets/Scripts/Editor/MoveForwardEditor.cs(3,22): error CS0246: The type or namespace name `MoveForward' could not be found. Are you missing an assembly reference?
1. Выбрать файл сборки EditorAsm
2. Нажать на +
3. Выбрать файл сборки LocomotionAsm, потому что MoveForward именно там.
4. Из платформ оставить только Editor
5. нажать Apply
Теперь ошибка ушла. И давайте посмотрим в папку Library и увидим наши сборки.
После сборки проекта мы также увидим эти сборки, кроме EditorAsm, т.к. это скрипт эдитора.
Есть еще одна Важное замечание. Файлы сборки не поддерживают директивы препроцессора, т.к. всегда статичны.
Статья была написана как попытка перевести официальный блог ) Всем спасибо за прочтение статьи. Жду ваших комментариев.
Проблема в том что не могу открыть файл dll пишет вот это (File is not a portable executable. DOS header does not contain 'MZ' signature.)
и не знаю что делать, уже гугл перерыл и не нашел как открыть файл
Assembly-CSharp.rar
подскажите пожалуйста кто знает как его открыть.
Помощь в написании контрольных, курсовых и дипломных работ здесь
Не могу открыть DLL
Не получается через Delphi открыть библиотеку bass,что бы посмотреть,чё там можно использовать. Не.
Можно ли открыть dll файл?
Подскажите пожалуйста, можно ли Visual Studio или чем то еще, открыть .dll файл? Нужен сам код.
Открыть DLL в visual studio
Интересует как открыть DLL в visual studio.
Assembly-CSharp.rar - ру версия - зашифрован
Assembly-CSharp 1.rar - англ версия - расшифрован
у меня есть такой же файл но уже расшифрован, я вот хочу понять как их расшифровывать.
мне анг версию расшифровали.
вот я хочу узнать как расшифровать что бы не просить постоянно,
и как потом мне их обратно зашифровать
я просто прошу что бы мне сказали как открыть 1 файл Чтобы его расшифровать, нужно изучать программу, которая его использует. Он же зашифрован, и алгоритм там наверняка не какой-то стандартный. В интернете видел несколько обсуждений данной темы, и судя по всему везде зашифровано по разному. а как я могу защитить свой dll от декомпиляции. dll для игры на андройд ?
Не могу dll файл открыть
Впрочем програмка маленькая и нада открыть типа длл файл пишит такую хрень. Скрин незнаю что токо.
Открыть или отредактировать Dll
Всем привет, мне нужно просто открыть DLL (если конечно такое возможно) и изменить там пару чисел и.
Не получается открыть dll файл
Хочу посмотреть как устроен файл IsAbusing.dll и по возможности кое-что там изменить. В интернете.
Как открыть файлы с раширением *.dll и *.a
Вазможно ктото знает как открыть эти фаллы библиотек? IDE и блокнот открыть та открывают но, текст.
Читайте также: