Главная страница
    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.47 MB
Время: 0.035 c
1-1101918145
Unknown user
2004-12-01 19:22
2004.12.19
Если кто-то работал с ZLib, помогите!


4-1099339625
Djuice
2004-11-01 23:07
2004.12.19
Help help help!!! КАК ЗАВЕРШИТЬ ПРОЦЕСС В ВИНДЕ, НАПРИМЕР explore


1-1101996630
the_ram
2004-12-02 17:10
2004.12.19
Путь к файлу


1-1102081219
Игорь нтк
2004-12-03 16:40
2004.12.19
Combobox


1-1102410684
Лариса
2004-12-07 12:11
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский