Как изменить значения байтов в двоичном файле для соответствующих инструкций IL?

Итак, я хотел бы изменить содержимое определенных методов в сборке .NET, и лучшее, что я смог найти, это Mono.Cecil. Однако мне также нужно иметь возможность напрямую изменять соответствующие байты для каждой инструкции IL. Возможно ли это с Mono.Cecil? Или можно каким-то образом получить адрес соответствующих байт для каждой инструкции, в .exe файле? Если нет, есть ли альтернатива, которую я могу использовать для этого?


person KopJoe    schedule 05.11.2017    source источник
comment
Почему нельзя модифицировать сборку моно сесилом и потом записать на диск?   -  person thehennyy    schedule 06.11.2017
comment
Потому что я хотел бы сделать что-то вроде операции XOR над байтами в теле метода, чтобы он стал недействительным. Потом позже я восстановил бы его снова.   -  person KopJoe    schedule 06.11.2017
comment
Я не уверен, действительно ли mono Cecil или dnlib обеспечивают смещение метода. Но загрузка сборки в виде массива байтов и поиск в ней MethodBody.GetILAsByteArray() должны дать вам возможность найти правильное смещение.   -  person thehennyy    schedule 06.11.2017
comment
Хорошая идея. Однако я только что узнал, что у Cecil есть свойство MethodDefinition.RVA, которое я могу использовать для поиска смещения файла, а затем напрямую изменять байты. Хотя спасибо за помощь :)   -  person KopJoe    schedule 07.11.2017
comment
Имейте в виду, что вам нужно будет сопоставить RVA с смещение файла с использованием таблицы разделов PE. Кроме того, результирующее местоположение будет содержать заголовок метода, который может быть за 1 или 12 байтов до фактического IL (см. ECMA-335, раздел II, раздел 25.4).   -  person Brian Reichle    schedule 08.11.2017