Есть ли способ изменить адрес OpCodes.Ret перескакивает? Может ли метод в IL изменить стек вызовов, используемый C#?Где находится адрес OpCodes.Ret использует сохраненный? Можно ли это изменить?
Насколько я знаю на C++, вы можете просто получить доступ к значениям в стеке и изменить адреса возврата и так далее. В IL все, что я пытался получить доступ к стеку за пределами текущего метода, не удалось исключить «InvalidProgramException».
мой пример кода:
public static void Test2()
{
var ma = typeof(Program).GetMethod("Test2");
DynamicMethod meth = new DynamicMethod("", null, null, ma.Module, true);
ILGenerator il = meth.GetILGenerator();
il.EmitWriteLine("Start to run the IL method");
var t = il.DeclareLocal(typeof(int));
//take the top of the stack (from the caller method) and put it into the variable t
//this seems to be not possible?
il.Emit(OpCodes.Stloc, t);
//print the value from the stack
il.EmitWriteLine(t);
//load the value back from the field onto the stack to allow everything to preceed normally
il.Emit(OpCodes.Ldloc, t);
//return
il.Emit(OpCodes.Ret);
Action a = (Action)meth.CreateDelegate(typeof(Action));
a();
}
Кто скажет, что 'ret' перескакивает на адрес? Спецификация опционного кода ничего не говорит о «переходе на адрес». Ни то, ни другое не имеет спецификации C++. Если вы можете сделать это на C++, это поведение, определяемое реализацией. –
Да, возможно, это зависит от компилятора. Возможно, такой вид доступа на C# невозможен. Я не уверен. Но внутри CLI должен хранить, куда идти после завершения метода в команде RET. Я ищу взломать не то, что нужно использовать в реальной среде. – Luz
Стек - это структура данных, принадлежащая CLR; способ, которым он использует стек, является деталью реализации, и вы не можете смело делать какие-либо предположения о том, как он использует эту структуру данных. Например, предположим, что вы меняете адрес возврата, а затем происходит переход стека безопасности или происходит исключение? Для корректной работы CLR может потребоваться структура данных в стеке.Не меняйте его; это не твое изменение. –