Domanda

Introduzione

Dopo aver visto questo video da LIDNUG, sulla Protezione NET http://secureteam.net/lidnug_recording /Untitled.swf (in particolare da 46:30 a 57:30), lo farei per individuare la chiamata a un MessageBox.Show in un file EXE che ho creato.

L'unica logica nel mio "TrialApp.exe" è il seguente:

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

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

Compilato sulla configurazione di rilascio: http://rapidshare.com/files/392503054 /TrialApp.exe.html

Quello che faccio per individuare la chiamata

Eseguire l'applicazione in WinDBG e pausa dopo il compare finestra di messaggio.

Prendi 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)

Prendi la struttura methoddesc (utilizzando l'indirizzo di 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

Dump IL di questo metodo (da methoddesc) !dumpil 001762f8

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

Quindi, come il video citato, la chiamata a per Show è di 5 byte dall'inizio della implementazione del metodo.

Ora apro CFFExplorer (proprio come nel video) e ottenere il RVA del metodo Form1_Load:. 00002083

Dopo questo, vado a Indirizzo Converter (sempre in CFF Explorer) e passare alla compensazione 00002083. Ci abbiamo:

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

Nel video viene menzionato che i primi 12 byte sono per l'intestazione metodo così li saltare

                                    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 byte dall'inizio della attuazione dovrebbe essere il codice operativo per il metodo di chiamata (28). Purtroppo, non c'è.

   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

Domande:

  1. Che cosa sto facendo di sbagliato?
  2. Perché non esiste un metodo di chiamata in quella posizione nel file? O forse il video manca un po 'di informazioni ...
  3. Perché il ragazzo in quel video sostituisce la chiamata con 9 zeri?
È stato utile?

Soluzione

Quando uso Ildasm.exe e sguardo alla IL con Mostra Bytes acceso vedo questo:

.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

I valori simbolici nella vostra discarica non sono la stessa cosa, ti sembra di avere un programma molto più grande. Ma l'IL nelle partenze discarica all'offset 1, non 12. Non certo perché si è spento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top