eXeL@B —› Вопросы новичков —› Простые способы замены кода в dotNet |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 02 марта 2019 13:09 · Личное сообщение · #1 Здравствуйте, ув. Профессионалы! Хочу научиться производить замену кода в приложениях dotNet. Для этого создал на C# очень простое тестовое приложение. При нажатии на кнопку Calculate приложение просто складывает два числа, которые были введены в текстовые поля и результат выводит в третье текстовое поле. Задача заменить исходную функцию сложения на следующую: Code:
Код функции читает первую строку из файла Result.txt и возвращает ее в качестве результата. Также хочу обратить внимание, что код фунции использует библиотеку 'using System.IO;', которая не подключена в исходном приложении Файлы с тестовым приложением выложил здесь в архиве 'Calc.exe' - исходное приложение, 'FileRead.dll' - функция для замены, 'Result.txt' - текстовый файл, откуда будет читаться первая строка По возможности, просьба подробно указывать ЧТО, КАК И С ПОМОЩЬЮ КАКИХ ИНСТРУМЕНТОВ следует делать для замены кода. По Вашим рекомендациям я буду учиться |
|
Создано: 02 марта 2019 14:42 · Личное сообщение · #2 |
|
Создано: 02 марта 2019 18:47 · Личное сообщение · #3 dnSpy правой кнопкой по методу, редактировани и пишешь новый код на шарпе. Потом компиляция и Сохранить. ----- старый пень | Сообщение посчитали полезным: rukop84 |
|
Создано: 02 марта 2019 22:58 · Личное сообщение · #4 r_e пишет: dnSpy правой кнопкой по методу, редактировани и пишешь новый код на шарпе. Потом компиляция и Сохранить. dnSpy при попытке скомпилировать измененный код выдает много ошибок, сделал скрин: |
|
Создано: 02 марта 2019 23:09 · Личное сообщение · #5 |
|
Создано: 03 марта 2019 10:36 · Личное сообщение · #6 |
|
Создано: 04 марта 2019 08:48 · Личное сообщение · #7 DenCoder пишет: Ждём medsft по данному вопросу ) улыбнуло rukop84 пишет: Задача заменить исходную функцию Решение: 1) Можно целиком переписать приложение 2) При отсутствии обфускации, dictionary, структур - dnspy в руки 3) При невозможности обратной декомпиляции - инжект статик класса (только моим движком))) ногами не пинать с Инди не сравнивать) 4) При невозможности декомпиляции - если размер тела исходного метода позволяет байт патчинг его но тут проблемы стринг придется подать нетрадиционным способом, иначе без перекомпиляции #US стрима никак... (хотя попробовать мне надо может там в конце место есть) | Сообщение посчитали полезным: mak |
|
Создано: 04 марта 2019 09:42 · Личное сообщение · #8 Medsft заинтересовал третий способ - инъекция кода с помощью dll. Если сумею разобраться в нем, то цель создания Тему буду считать достигнутой. Сразу уточнения по этому методу: 1. с Инди не сравнивать А что такое инди? 2. инжект статик класса Класс для инъекции должен быть паблик или без разницы? 3. только моим движком Кроме самого метода для инъекции нужно ли добавлять еще какой-либо код в класс или эту работу сделает уже сам ILSpector? 4. Библиотеки dll для инъекции, которые следует отдавать ILSpector'у могут быть написаны на любом языке программирования (например, на Visual Basic 6)? 5. Правильно ли я понял структуру своих действий для реализации этого метода: 5.1 создать dll для инъекции; 5.2 в IlSpector привязать dll (сделать инъекцию) 5.3 с помощью битпатчинга приложения вызвать функцию из привязанной dll |
|
Создано: 04 марта 2019 10:05 · Поправил: Medsft · Личное сообщение · #9 rukop84 пишет: А что такое инди? - это главная загадка форума rukop84 пишет: Класс для инъекции должен быть паблик или без разницы? public static rukop84 пишет: Правильно ли я понял неправильно, речь идет только о manadged только (пока так) Делаешь простую dll c одним единстенным public static классом и ilspeсtorom инжектишь его (класс в сборку) -> сохраняешь что получилось -> а далее простым байт патчингом в нужный метод вставляешь его вызов остальное затираешь |
|
Создано: 04 марта 2019 14:00 · Поправил: rukop84 · Личное сообщение · #10 |
|
Создано: 05 марта 2019 05:25 · Личное сообщение · #11 rukop84 > Хочу научиться производить замену кода в приложениях dotNet. Это весьма сложный вопрос, пока ты его масштаб не понимаешь. Что значит замена кода - всякий код вызывается по ссылке, это либо указатель, либо относительное ветвление, зашитое в код(граф). Поэтому что значит изменить код - перехватить какое то событие через указатель или изменить непосредственно сам код ? А если это виртуальная машина, то кода как такового нет, один и тот же транслятор выполняет эмуляцию. |
|
Создано: 05 марта 2019 08:34 · Личное сообщение · #12 |
|
Создано: 05 марта 2019 10:57 · Поправил: rukop84 · Личное сообщение · #13 Medsft пишет: класс целиком инжекти, только не в другой класс, а рядом не, все равно ILSpector наотрез инжектить отказывается. Вот скрин Экспериментировал разными способами (не только как в скрине), результат один и тот же: либо "Not support method to inject", либо "Operation error" А в самой dll модификаторы доступа у меня правильно объявлены для того, чтобы корректно произошла инъекция этого класса? Code:
А в природе, кроме ILSpector'а, существуют ли еще инструменты, позволяющие произвести инъекцию dll в сборку? В интернете довольно много инструментов это умеют делать в запущенный процесс, но не встретил ни одного, чтобы сделать это в сам exe-файл Добавлено спустя 8 минут Если надо, файлы для экспериментов с инъекцией выложил здесь Добавлено спустя 16 минут Какими еще способами можно решить поставленную задачу по инъекции dll в сборку? |
|
Создано: 05 марта 2019 12:23 · Поправил: Medsft · Личное сообщение · #14 |
|
Создано: 05 марта 2019 12:53 · Поправил: rukop84 · Личное сообщение · #15 Medsft, прежде, чем обыгрывать string хочу уяснить для себя следующее: dll класс с методом типа string вообще нельзя инжектить в сборку что ли? Или нельзя только в данном случае, так как в сборке отсутствуют методы с типом string? А если бы у меня функция Calc складывала бы цифры и возвращала бы тип string, тогда можно было бы инжектить данную dll? Кстати, обыграть тип string в моем случае никак не удастся, так как в текстовом файле содержатся слова, а не цифры. И слова никак не смогут стать типом integer. Другое дело - это переписать функцию калькулятора, чтобы производилось сложение и результат конвертировался в тип string |
|
Создано: 05 марта 2019 13:01 · Поправил: Medsft · Личное сообщение · #16 rukop84 пишет: прежде, чем обыгрывать string еще раз задашь вопрос из школьного курса, туда и пойдешь учиться. int[] цифроваяжопа = new int[]{126,234,345, 256}; string жопа = string.empty; for (int i = 0; i< цифроваяжопа.Lenght; i++) { жопа +=new char(цифроваяжопа[i]); } | Сообщение посчитали полезным: ajax |
|
Создано: 05 марта 2019 23:03 · Поправил: rukop84 · Личное сообщение · #17 Мастер, в общем я запутался... Привел Ваш код к более читабельному виду: Code:
последнюю строку кода text += new char(NumArray[i]) Visual Studio подчеркивает, говорит, что так нельзя делать следующее, что не сходится - это то, что вышеприведенный алгоритм решает задачу перевода типа integer в тип string, а перед нами стоит прямо противоположная задача. Надо превратить как-то текстовую строку "Hello-World!" в набор цифр целого типа ну, допустим я как-то решу такую задачу с помощью дополнительного кода в dll: 1) создам массив переменных 2) каждой такой переменной присвою по символу от строки "Hello-World!" 3) затем каждый символ переведу в число целого типа 4) и на выходе получу набор цифр целого типа !!!Но тогда вопрос: как этот набор цифр обратно я буду превращать в буквы уже в целевом приложении, если по плану у нас следует только пропатчить целевое приложение, а лишний код затереть?! |
|
Создано: 06 марта 2019 09:11 · Личное сообщение · #18 rukop84 пишет: Visual Studio подчеркивает это концепция была, А вот решение https://stackoverflow.com/questions/4648781/how-to-get-character-for-a-given-ascii-value rukop84 пишет: каждой такой переменной присвою по символу от строки "Hello-World! майкрософт за тебя уже давно таблицы сделал rukop84 пишет: Но тогда вопрос да сделай все в своем классе а в исходном методе вызов его |
|
Создано: 06 марта 2019 10:29 · Личное сообщение · #19 |
|
Создано: 06 марта 2019 10:44 · Личное сообщение · #20 |
|
Создано: 06 марта 2019 12:26 · Поправил: rukop84 · Личное сообщение · #21 Medsft пишет: ты вообще вьезжаешь не, не въезжаю, но пытаюсь осмыслить глубокую мысль Мастера: то есть, получается, что задача сводится к тому, чтобы ни один метод в классе dll не имел тип string. И в то же время нужно сделать так, чтобы он этот тип возвращал во время выполнения программы Получается, что в своем классе я должен объявить функцию с типом int и при этом функция должна вернуть тип string. Но как такое реализовать!!! Функцию с типом int и возвращаемым типом string даже скомпилировать не удастся |
|
Создано: 06 марта 2019 22:23 · Личное сообщение · #22 rukop84 Пойми - ты можешь в своей функе сделать все, вне зависимости что она получает.. Т.Е. передав функе int - ты на return можешь забрать string.. Добавлено спустя 2 минуты rukop84 пишет: Функцию с типом int и возвращаемым типом string даже скомпилировать не удастся Учи МатЧасть.. | Сообщение посчитали полезным: Medsft |
|
Создано: 07 марта 2019 09:25 · Поправил: rukop84 · Личное сообщение · #23 |
|
Создано: 07 марта 2019 10:16 · Личное сообщение · #24 |
|
Создано: 07 марта 2019 11:30 · Личное сообщение · #25 Да он просто не догоняет что строки как константы нельзя пихать в метод, но при этом можно чтобы функция оперировала строками. Можно сделать Code:
----- старый пень | Сообщение посчитали полезным: rukop84 |
|
Создано: 07 марта 2019 11:53 · Личное сообщение · #26 |
|
Создано: 07 марта 2019 11:55 · Поправил: rukop84 · Личное сообщение · #27 r_e пишет: Да он просто не догоняет что строки как константы нельзя пихать в метод, но при этом можно чтобы функция оперировала строками дак, вот она где истина Добавлено спустя 5 минут sefkrd пишет: Он не скомпелируется.. private int GetSum() заменить на private string GetSum() Тогда соберешь.. это все понятно, просто Medsft дал задание избавиться от стрингов и я понял это так, что нельзя инжектить функции с типом string, но при этом каким-то загадочным образом этот тип должен был вернуться Добавлено спустя 10 часов 1 минуту Ну, теперь я точно знаю, что такое "стринги" на сленге мастеров крэкинга. Это не какие-то там пляжные трусики и даже не функция с типом string, а всего лишь несколько строковых значений в моем коде, которые надо было обыграть с помощью Ascii кода Подправил немного код своей dll: Code:
Уже завтра буду продолжать эксперименты |
|
Создано: 08 марта 2019 11:02 · Поправил: rukop84 · Личное сообщение · #28 В общем обыграл строковые значения (стринги), но dll все равно инжектиться не хочет (выдает ошибку). Прикрепил скрин Обновленную dll и сопутствующие файлы для экспериментов залил сюда: Жду Ваших советов и рекомендаций |
|
Создано: 11 марта 2019 14:05 · Личное сообщение · #29 |
|
Создано: 11 марта 2019 14:52 · Личное сообщение · #30 Мастер, все залито (смотрите в предыдущем сообщении) Добавлено спустя 2 минуты на всякий случай продублирую еще раз ссылку: |
. 1 . 2 . >> |
eXeL@B —› Вопросы новичков —› Простые способы замены кода в dotNet |
Эта тема закрыта. Ответы больше не принимаются. |