Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

Debug API   Найти похожие ветки 

 
Beginer ©   (2004-10-31 10:20) [0]

Тут для меня загадка, почему
if (cont.Eip<$600000) then
   Begin
 ShowMessage("EIP="+inttohex(cont.eip,8));
Eip всегда показывает адресса выше 00600000, а адреса 00401000 по допустим 401050, моего приложения никогда не показываются? Хотя запускается моя тестовая программа.
Таже беда когда пишу и на asm.

var
 Form1: TForm1;
 sti:tstartupinfo;
 lpPi:tprocessinformation;
 DE:_Debug_event;
 Cont:_Context;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Createprocess(nil,"c:\experement.exe",nil,nil,false,DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS,nil,nil,Sti,lpPi);
While true do
   begin
     WaitForDebugEvent(de,INFINITE);
     application.ProcessMessages;
     if de.dwDebugEventCode=EXCEPTION_DEBUG_EVENT then
        if DE.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_BREAKPOINT then
           begin
              cont.ContextFlags:=CONTEXT_CONTROL;
              GetThreadContext(lppi.hThread,cont);
              cont.EFlags:=cont.EFlags or $100;
              setThreadContext(lppi.hThread,cont);
              ContinueDebugEvent(lppi.dwProcessId, lppi.dwThreadId,DBG_CONTINUE);
           end
         else
         if DE.Exception.ExceptionRecord.ExceptionCode=EXCEPTION_SINGLE_STEP then
            begin
              GetThreadContext(lppi.hThread,cont);
              cont.EFlags:=cont.EFlags or $100;
              setThreadContext (lppi.hThread ,cont);
              if (cont.Eip<$600000) then
                 Begin
                    ShowMessage("EIP="+inttohex(cont.eip,8));
                    //halt;
                    end;
            ContinueDebugEvent(lppi.dwProcessId,lppi.dwThreadId,DBG_CONTINUE);
            end;
            ContinueDebugEvent(lppi.dwProcessId,lppi.dwThreadId,DBG_CONTINUE);
            if de.dwDebugEventCode=EXIT_PROCESS_DEBUG_EVENT then
               begin
                 CloseHandle (lppi.hProcess);
                 CloseHandle (lppi.hThread);
                 halt;
               end;
       end;

end;

end.


 
Ученик   (2004-10-31 10:55) [1]

Очень похоже, но там такого кода нет :-)

http://spiff.tripnet.se/~iczelion/tut30.html


 
Beginer ©   (2004-10-31 11:36) [2]

Верно. Читал я эти туторы, читал. Третий тутор, где подсщитывавется число выплненых инструкций в отлаживаемой программе. Ухх, как я торопился набирать этот код, чтоб посмоттерь, действительно ли сие возможно! :)) и что? Этот пример с 3-го тотора iczelionа насщитал в моей проге из 4 команд аж 50000 инструкций. Я начал смотеть что и как, начал его модифицировать..и увидел что context.RegEip ссылается на кучу какихто левых адресов и инструкций, к моему процесу не имеющих отношения. Да верно в этом случае будет 50000 инструкций. Может это загрузщик Win ? или еще какие системные библиотеки??
привожу код на asm

invoke GetOpenFileName, ADDR ofn

invoke GetStartupInfo, addr startinfo
invoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE, DEBUG_PROCESS+ \
      DEBUG_ONLY_THIS_PROCESS, NULL,NULL, addr startinfo, addr pi
.while TRUE
 invoke WaitForDebugEvent,addr DBEvent, INFINITE
 .if DBEvent.dwDebugEventCode==EXIT_PROCESS_DEBUG_EVENT
     invoke MessageBox,0,addr ProcessExit,0,MB_OK
  ;invoke wsprintf, addr buffer, addr ExitProc,TotalInstruction
  ;invoke MessageBox,0,addr buffer, addr AppName, MB_OK+MB_ICONINFORMATION
  .break
 .elseif DBEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT
     .if DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_BREAKPOINT
      mov context.ContextFlags, CONTEXT_CONTROL
   invoke GetThreadContext,pi.hThread,addr context
   
    or context.regFlag,100h
    invoke SetThreadContext,pi.hThread,addr context
    invoke ContinueDebugEvent,DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_CONTINUE
    .continue
    .elseif DBEvent.u.Exception.pExceptionRecord.ExceptionCode==EXCEPTION_SINGLE_STEP
          invoke GetThreadContext,pi.hThread, addr context
          .if context.regEip<00700000h
           invoke wsprintf, addr buffer, addr ProcessInfo, context.regEip
           invoke MessageBox,0, addr buffer, addr AppName,MB_OK+MB_ICONINFORMATION
          .endif
          or context.regFlag,100h
          invoke SetThreadContext,pi.hThread, addr context
         
       .endif
       
 .endif
     invoke ContinueDebugEvent,DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_CONTINUE  
.endw

invoke CloseHandle,pi.hProcess
invoke CloseHandle,pi.hThread
invoke ExitProcess,0

т.е. if context.regEip<00700000h никогда не выполнится, хотя моя прога ничинается с 00401000 по 00401000. И запускается она.

Что делать что делать.


 
Vladimir Vorfolomeev ©   (2004-11-01 00:05) [3]

Так устроен Delphi, при сборки приложения все в разных местах. Посмотри в дизассемблере(например в IDA), и все поимеш.


 
Beginer ©   (2004-11-01 10:05) [4]

Я и в отладчике могу посмотреть. Нефига я не помнимаю. На ассембреле, листинг который я тут привел, тот же результат. Eip выше 00700000. Он указывает на загружзчик моей программы. А как обойти,так чтоб он реально показывал на мою программу, не зню. И взять тот же тутариал от http://spiff.tripnet.se/~iczelion/tut30.html он фактически неверен, так как тоже поддсщитывает количество команд вместе с загрузчиком.


 
Ученик   (2004-11-02 00:29) [5]

Нескромный вопрос :-), под этим отладчиком приложение вообще работает ?

Возможно, для необработанных Exception-ов необходимо использовать DBG_EXCEPTION_NOT_HANDLED вместо DBG_CONTINUE


 
VMcL ©   (2004-11-02 07:47) [6]

>>Ученик  (02.11.04 00:29) [5]

>Возможно, для необработанных Exception-ов необходимо использовать DBG_EXCEPTION_NOT_HANDLED вместо DBG_CONTINUE

Для EXCEPTION_BREAKPOINT, EXCEPTION_SINGLE_STEP? Зачем?


 
Beginer ©   (2004-11-02 09:02) [7]

Работает под отладчиком. Под OlyDBG пробывал. DBG_EXCEPTION_NOT_HANDLED пробывал. Вообще в оригенале так и есть. Но что и с DBG_EXCEPTION_NOT_HANDLED что и DBG_CONTINUE результат одинаков. Удалось выяснить Reg.Eip показыввает у меня адреса загрузки  ntdll.dll, kernel32.dll, user32.dll. Третий урок http://spiff.tripnet.se/~iczelion/tut30.html который должен вести подсщет инструкций твоей программы скороей всего и этих модулей подсщитывает, пэтому оказывается что в моей 4-х строчной программе 75536 строк.

>Для EXCEPTION_BREAKPOINT, EXCEPTION_SINGLE_STEP? Зачем? Без EXCEPTION_SINGLE_STEP приложение отработает один раз и допустим выдаст мне только один раз конечный результат Reg.Eip,я уже пробывал, была моя модификация 2 - го урока от  http://spiff.tripnet.se/~iczelion/tut30.html, а EXCEPTION_SINGLE_STEP заставляет крутиться в цикле и выдавать от первого Reg.Eip до последнего.

Кто нибудь пробывал http://xtin.km.ru/view.shtml?id=7 Примитивный трейсер. Получилось?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.039 c
3-1100770993
Dmitriy O.
2004-11-18 12:43
2004.12.19
Как избежать зависания при SQL из таблицы.


1-1102328759
grigory
2004-12-06 13:25
2004.12.19
Как запустить ехе скрыто?


1-1102418056
Destroyer2
2004-12-07 14:14
2004.12.19
Отключение ловушки


14-1101395700
kdv
2004-11-25 18:15
2004.12.19
о Delphi 2005, если интересно


1-1101969351
Frozzen
2004-12-02 09:35
2004.12.19
Алгоритмы защиты от свободного копированя





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский