Проблема с кодом MSIL

Я пытаюсь изменить сборку (мою), просто ildassembly и изменив код MSIL. Я просто хочу открыть MessageBox.

Вот мой код:

.module extern Fusion.dll

.module extern kernel32.dll

.module extern advapi32.dll

.module extern aspnet_state.exe

.module extern webengine.dll

.module extern aspnet_wp.exe

.module extern mscorwks.dll

.module extern ole32.dll

.module extern mscoree.dll

.module extern Netapi32.dll

.assembly extern mscorlib

{

...

...

IL_0052: ldstr "ahahahahahah"

IL_0057: callvirt instance [mscorlib]System.Windows.Forms.MessageBox::Show(string)

IL_005c: ldloc.0

IL_005d: ret

} // end of method

...

У меня нет ошибки, но MessageBox не появляется :\

Спасибо за помощь !


person Thomas    schedule 26.05.2010    source источник


Ответы (3)


должно быть

  ldstr "ahahahahahah"
  call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult[System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
  pop
  ret

Кстати, MessageBox не должно работать в веб-приложении, потому что оно взаимодействует с пользователем рабочего стола.

что не так с вашим кодом:

callvirt instance [mscorlib]System.Windows.Forms.MessageBox::Show(string)
  1. Show является статическим методом. Так и должно называться а) с call б) без instance
  2. MessageBox находится в System.Windows.Forms, а не в mscorlib
  3. Вы должны указать тип результата, на самом деле это DialogResult
  4. Вы должны pop получить результат, потому что он вам не нужен
person Andrey    schedule 26.05.2010
comment
Нет :( Я точно знаю, что это веб-приложение .net (file.aspx) - person Thomas; 26.05.2010

Что ж, MessageBox - это функция формы Windows в System.Windows.Forms.dll, поэтому вам нужно добавить для этого extern и удалить бит call[mscorlib] ... но я не думаю, что это поможет.

Как страница ASPX будет генерировать окно сообщения Winforms? Единственное, что вы могли бы сделать, это выдать «предупреждение (сообщение)» Javascript, чтобы получить окно сообщения в стиле веб-страницы, но это не будет легко сделать, изменив MSIL.

Возможно, вам следует добавить что-то вроде:

call void [System]System.Diagnostics.Trace::Write(string)

При декомпиляции быстрого консольного приложения вызов окна сообщения будет работать следующим образом:

ldstr "blah"
stloc.0 
ldloc.0 
call valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
pop 
person Russ Clarke    schedule 26.05.2010

Хорошо, спасибо за помощь, теперь более понятно.

Ну, если нет возможности выкинуть MessageBox из aspx-файла, я пробовал писать что-то в файле.

IL_0034:  ldstr      "C:\\...\\WebSite1\\toto.txt"
IL_0039:  newobj     instance void [mscorlib]System.IO.StreamWriter::.ctor(string)
IL_003e:  stloc.1
IL_003f:  ldloc.1
IL_0040:  ldstr      "hello world"
IL_0045:  callvirt   instance void [mscorlib]System.IO.TextWriter::WriteLine(string)
IL_004a:  nop
IL_004b:  ldloc.1
IL_004c:  callvirt   instance void [mscorlib]System.IO.TextWriter::Close()
IL_0051:  nop

У меня нет ошибок или исключений при загрузке веб-страницы, но файл не создается и не изменяется :\

Я не понимаю, почему, потому что если я помещу тот же код на C # непосредственно в .aspx, это отлично работает!

person Thomas    schedule 27.05.2010