Сейчас на форуме: 2nd, morgot, Rio, CDK123, zds, tyns777, tihiy_grom (+5 невидимых)

 eXeL@B —› Программирование —› Delphi + SEH
Посл.ответ Сообщение

Ранг: 8.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2008 18:15 · Поправил: KeBugCheck
· Личное сообщение · #1

Приветствую.

Помнится где-то тут была тема про сех своими руками (без использования try/except) под дельфю. Поиск тут ничего не дал, слишком много ключевых слов. Я так понимаю это будет выглядеть вот так:

Code:
  1. label
  2.   _continue;
  3. begin
  4.   asm
  5.     push offset Exception_Handler
  6.     push dword ptr fs:[0]
  7.     mov fs:[0], esp
  8.     mov seh1.SafeEip, offset _continue
  9.     mov seh1.PrevEsp, esp
  10.     mov seh1.PrevEbp, ebp
  11.   end;
  12.   function_one();
  13.   function_two();
  14.   _continue:
  15.   asm
  16.     pop dword ptr fs:[0]
  17.     add esp, 4
  18.   end;


где обработчик except это Exception_Handler.

Или?
Премного благодарен.



Ранг: 24.4 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 13 сентября 2008 22:41
· Личное сообщение · #2

try / except|finally /end;




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 13 сентября 2008 23:07 · Поправил: Hellspawn
· Личное сообщение · #3

GoldFinch пишет:
try / except|finally /end;


KeBugCheck пишет:
(без использования try/except)


...

да вроде похоже на правду, но что есть Exception_Handler и как описан seh1?
пожно и попроще:
Code:
  1. procedure ExceptionFinal;
  2. asm                          
  3.   MOV EAX,DWORD PTR SS:[ESP+0Ch] // eax = CONTEXT
  4.   // делаем что хотим
  5.   // напимер сместим eip + 2
  6.   ADD DWORD PTR DS:[EAX+B8h],2
  7.   // или прыгнем в safe_place
  8.   XOR EAX,EAX
  9. end;
  10. procedure Seh();
  11. asm
  12.   PUSH Offset ExceptionFinal
  13.   PUSH DWORD PTR FS:[0]
  14.   MOV DWORD PTR FS:[0],ESP
  15.   // тут что то опасное
  16. @safe_place:
  17.   POP DWORD PTR FS:[0]
  18.   ADD ESP,4
  19. end;


-----
[nice coder and reverser]




Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 14 сентября 2008 00:04
· Личное сообщение · #4

как вариант, хотя уже постил где-то

Code:
  1. program SEH;
  2. uses
  3.   Windows;
  4. type
  5.   _SEH = record
  6.     SafeEip:DWORD; // The offset where it's safe to continue execution
  7.     PrevEsp:DWORD; // The previous value of esp
  8.     PrevEbp:DWORD; // The previous value of ebp
  9.   end;
  10. //
  11. // Exception disposition return values.
  12. //
  13. EXCEPTION_DISPOSITION         =  DWORD;
  14. const
  15.   ExceptionContinueExecution  =  0;
  16.   ExceptionContinueSearch     =  1;
  17.   ExceptionNestedException    =  2;
  18.   ExceptionCollidedUnwind     =  3;
  19.   szCaption     : PChar = 'SEH Test' + #0;
  20.   szNotOccured  : PChar = 'Exception NOT occured !' + #0;
  21.   szOccured     : PChar = 'Exception occured !' + #0;
  22. var
  23. __seh           : _SEH;
  24. lpText          : PAnsiChar;
  25. label   _SafePlace;
  26. {$O+}
  27. function _except_handler(
  28.     ExceptionRecord:PExceptionRecord;
  29.     EstablisherFrame:Pointer;
  30.     ContextRecord:PContext;
  31.     DispatcherContext:Pointer): EXCEPTION_DISPOSITION; cdecl;
  32. begin
  33.   ContextRecord.Eip := __seh.SafeEip;
  34.   ContextRecord.Esp := __seh.PrevEsp;
  35.   ContextRecord.Ebp := __seh.PrevEbp;
  36.   // Tell the OS to restart the faulting instruction
  37.   Result := ExceptionContinueExecution;
  38. end;
  39. {$O-}
  40. begin
  41.  lpText := szOccured;
  42.  asm
  43.    push  OFFSET _except_handler
  44.    push  DWORD PTR fs:[0]                 // address of next ERR structure
  45.    mov   fs:[0], esp                      // give FS:[0] the ERR address just made
  46.    mov   __seh.SafeEip, OFFSET _SafePlace
  47.    mov   __seh.PrevEsp, esp
  48.    mov   __seh.PrevEbp, ebp
  49.    db 0CCh
  50.  end;
  51.  lpText := szNotOccured;
  52. _SafePlace:
  53.  asm
  54.    pop   DWORD PTR fs:[0]                 // restore next ERR structure to FS:[0]
  55.    add   esp, 4                           // throw away rest of ERR structure
  56.  end;
  57.  MessageBox(0, lpText, szCaption, MB_OK or MB_ICONINFORMATION);
  58. end.




Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 14 сентября 2008 00:06 · Поправил: __
· Личное сообщение · #5

Code:
  1. {$O+}
читать как {$O+}
соответственно
Code:
  1. {$O-}
это {$O-}

форум глючит



Ранг: 8.3 (гость)
Активность: 0.010
Статус: Участник

Создано: 14 сентября 2008 07:49
· Личное сообщение · #6

Hellspawn

Структура и функция описаны как в посте ___. Спасибо за свой пример.

__
ОК, всем спасибо, тема закрыта.


 eXeL@B —› Программирование —› Delphi + SEH
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати