Compago

...free knowledge

 
  • Increase font size
  • Default font size
  • Decrease font size
Home Manuali Programmazione Structured Excepition Handling ovvero SEH - SEH in una applicazione multithread

Structured Excepition Handling ovvero SEH - SEH in una applicazione multithread

E-mail Stampa PDF
Indice
Structured Excepition Handling ovvero SEH
SEH frames
SEH in una applicazione multithread
Exploit tramite SEH
Eliminare la terminazione della applicazione
Tutte le pagine

Per verificare cosa accade in una applicazione multi-thread utilizzeremo sempre una piccola applicazione, che per ogni thread creato calcolerà la posizione ed il contenuto dei suoi SEH frames.

program SEH2;

{$APPTYPE CONSOLE}

uses
  SysUtils,windows;

var
  count:integer;

procedure test;
var
  xESP:integer;
  a,b: ^integer;
  id:cardinal;
begin
  try
    asm
      mov eax,fs:[0];
      mov a,eax
      mov xESP, esp
    end;
    Writeln;
    Writeln('Thread n',count);
    //indirizzo della cima dello stack
    Writeln(format('ESP :%x <-cima dello stack', [xESP] ));
    Writeln;
    Writeln('                      indirizzo  valore');
    while (a^ <> -1) do begin
      //puntatore al successivo SEH frame
      Writeln(format('Eccezione.successivo  :%p->%x', [a,a^] ));
      b:=a;
      inc(b);
      //indirizzo della funzione che gestisce l'eccezione
      Writeln(format('Eccezione.handler     :%p->%x', [b,b^]));
      //Aggiorna il puntatore
      a:=pointer(a^);
      Writeln;
    end;
    //Stampa i dati sull'ultimo
    Writeln(format('Eccezione.successivo  :%p->%x', [a,a^] ));
    b:=a;
    inc(b);
    Writeln(format('Eccezione.handler     :%p->%x', [b,b^]));

//limito la creazioen dei thread a 2
    if count<2 then begin
      inc(count);
      CreateThread(nil,0,@test,nil,0,id);
    end;
  except
    Writeln('Mia Eccezione test');
  end;
end;


begin
  count:=0;
  test;
  readln;
end.

Come output avremo:

Thread n0
ESP :12FF4C <-cima dello stack

                      indirizzo  valore
Eccezione.successivo  :0012FF4C->12FF58 (user)
Eccezione.handler     :0012FF50->408E61

Eccezione.successivo  :0012FF58->12FFB4 (user)
Eccezione.handler     :0012FF5C->408EAF

Eccezione.successivo  :0012FFB4->12FFE0 (start-up)
Eccezione.handler     :0012FFB8->4041B8

Eccezione.successivo  :0012FFE0->FFFFFFFF (primario)
Eccezione.handler     :0012FFE4->7C839A10

Thread n1
ESP :B3FF58 <-cima dello stack

                      indirizzo  valore
Eccezione.successivo  :00B3FF58->B3FF64 (user)
Eccezione.handler     :00B3FF5C->408E61

Eccezione.successivo  :00B3FF64->B3FFDC (user)
Eccezione.handler     :00B3FF68->408EAF

Eccezione.successivo  :00B3FFDC->FFFFFFFF (primario)
Eccezione.handler     :00B3FFE0->7C839A10

Thread n2
ESP :C3FF58 <-cima dello stack

                      indirizzo  valore
Eccezione.successivo  :00C3FF58->C3FF64 (user)
Eccezione.handler     :00C3FF5C->408E61

Eccezione.successivo  :00C3FF64->C3FFDC (user)
Eccezione.handler     :00C3FF68->408EAF

Eccezione.successivo  :00C3FFDC->FFFFFFFF (primario)
Eccezione.handler     :00C3FFE0->7C839A10

Possiamo notare alcune cose:

  • Viene creato uno stack diverso per ogni thread;
  • Il SEH frame di start-up appare solo nel thread di processo, cioè nel primo.
  • Tutti i SEH frames anche se stanno in stack diversi puntano sempre alle stesse funzioni che gestiscono le eccezioni (handler).
  • Le posizioni dei frames all'interno degli stack rimangono le stesse.


Ultimo aggiornamento ( Sabato 19 Giugno 2010 18:23 )  
Italian English French German Portuguese Russian Spanish

Articoli correlati