Pregunta

Introducción

Después de ver este video de LIDNUG, sobre Protección NET http://secureteam.net/lidnug_recording /Untitled.swf (especialmente de 46:30 a 57:30), lo haría para localizar la llamada a un MessageBox.Show en un archivo EXE que he creado.

La única lógica en mi "TrialApp.exe" es:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        MessageBox.Show("This is trial app");
    }
}

Compilado de la configuración de salida: http://rapidshare.com/files/392503054 /TrialApp.exe.html

¿Qué hago para localizar la llamada

Ejecutar la aplicación en WinDBG y descanso después aparece el cuadro de mensaje.

Obtener la pila CLR con !clrstack:

0040e840 5e21350b [InlinedCallFrame: 0040e840] System.Windows.Forms.SafeNativeMethods.MessageBox(System.Runtime.InteropServices.HandleRef, System.String, System.String, Int32)
0040e894 5e21350b System.Windows.Forms.MessageBox.ShowCore(System.Windows.Forms.IWin32Window, System.String, System.String, System.Windows.Forms.MessageBoxButtons, System.Windows.Forms.MessageBoxIcon, System.Windows.Forms.MessageBoxDefaultButton, System.Windows.Forms.MessageBoxOptions, Boolean)
0040e898 002701f0 [InlinedCallFrame: 0040e898] 
0040e934 002701f0 TrialApp.Form1.Form1_Load(System.Object, System.EventArgs)

Obtener la estructura MethodDesc (utilizando la dirección de Form1_Load) !ip2md 002701f0

MethodDesc:   001762f8
Method Name:  TrialApp.Form1.Form1_Load(System.Object, System.EventArgs)
Class:        00171678
MethodTable:  00176354
mdToken:      06000005
Module:       00172e9c
IsJitted:     yes
CodeAddr:     002701d0
Transparency: Critical
Source file:  D:\temp\TrialApp\TrialApp\Form1.cs @ 22

Volcado de la IL de este método (por MethodDesc) !dumpil 001762f8

IL_0000: ldstr "This is trial app"
IL_0005: call System.Windows.Forms.MessageBox::Show 
IL_000a: pop 
IL_000b: ret 

Así que, como el video mencionado, la llamada a la que Show es de 5 bytes desde el comienzo de la implementación del método.

Ahora abro CFFExplorer (al igual que en el video) y obtener el RVA del método Form1_Load:. 00002083

Después de esto, voy a la dirección del convertidor (de nuevo en CFF Explorer) y vaya a compensar 00002083. No tenemos:

32 72 01 00 00 70 28 16 00 00 0A 26 2A 7A 03 2C
13 02 7B 02 00 00 04 2C 0B 02 7B 02 00 00 04 6F
17 00 00 0A 02 03 28 18 00 00 0A 2A 00 03 30 04 
00 67 00 00 00 00 00 00 00 02 28 19 00 00 0A 02

En el video se menciona que los primeros 12 bytes son para la cabecera del método así que omitirlos

                                    2A 7A 03 2C
13 02 7B 02 00 00 04 2C 0B 02 7B 02 00 00 04 6F
17 00 00 0A 02 03 28 18 00 00 0A 2A 00 03 30 04 
00 67 00 00 00 00 00 00 00 02 28 19 00 00 0A 02

5 bytes desde el comienzo de la aplicación debe ser el código de operación de llamada al método (28). Por desgracia, no está allí.

   02 7B 02 00 00 04 2C 0B 02 7B 02 00 00 04 6F
17 00 00 0A 02 03 28 18 00 00 0A 2A 00 03 30 04 
00 67 00 00 00 00 00 00 00 02 28 19 00 00 0A 02

Preguntas:

  1. ¿Qué estoy haciendo mal?
  2. ¿Por qué no hay una llamada a un método en esa posición en el archivo? O tal vez el vídeo les falta alguna información ...
  3. ¿Por qué el hombre en ese video sustituye a la llamada con 9 ceros?
¿Fue útil?

Solución

Cuando uso Ildasm.exe y vistazo a la IL con Mostrar Bytes encendido veo esto:

.method private hidebysig instance void  Form1_Load(object sender,
                                                    class [mscorlib]System.EventArgs e) cil managed
// SIG: 20 02 01 1C 12 15
{
  // Method begins at RVA 0x20f1
  // Code size       12 (0xc)
  .maxstack  8
  IL_0000:  /* 72   | (70)00000D       */ ldstr      "This is trial app"
  IL_0005:  /* 28   | (0A)00001E       */ call       valuetype [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.MessageBox::Show(string)
  IL_000a:  /* 26   |                  */ pop
  IL_000b:  /* 2A   |                  */ ret
} // end of method Form1::Form1_Load

Los valores de los símbolos en el vertedero no son los mismos, que parecen tener un programa mucho más amplio. Sin embargo, la IL en sus inicios volcado en el offset 1, no 12. No sé por qué se va.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top