Сейчас на форуме: zds, UniSoft, ManHunter (+5 невидимых)

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

Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 марта 2009 01:47 · Поправил: jopka
· Личное сообщение · #1

Возникла такая проблема. Внедрил в прогу ддл, которая использует аппаратные точки для контроля проги. Ставлю обработчик по примеру с васма. Но до моего обработчика дело не доходит. Где могут быть грабли?




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 05 марта 2009 01:50
· Личное сообщение · #2

Необходим бинарь или исходник
что за прога?

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 марта 2009 01:51
· Личное сообщение · #3

coderess сорри, я кажется ошибся насчет обработчика в проге. но все равно, точка остановки не срабатывает. что может быть не так?
дело даже не в конкретной проге. интересна теория.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 05 марта 2009 02:03
· Личное сообщение · #4

Сброшен Dr7. Код модуля в студию.



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 марта 2009 02:07
· Личное сообщение · #5

код с васма практически 1 в 1...
Code:
  1.                        CONTEXT ct;
  2.                               DWORD hThread = ThreadID;
  3.                               ct.ContextFlags = CONTEXT_DEBUG_REGISTERS;
  4.                               if( !GetThreadContext( (HANDLE)hThread, &ct ) )
  5.                                    return FALSE;
  6.                               ct.Dr0 = dwAddress;
  7.                               ct.Dr6 = 0;
  8.                               ct.Dr7 = ( ct.Dr7 & 0xFFF0FFFF ) | 0x101;
  9.                               SetThreadContext( (HANDLE)hThread, &ct );




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 05 марта 2009 02:09
· Личное сообщение · #6

Поток должен быть открыт по идентификатору посредством NtOpenThread, разумеется если он не текущий(тогда -2).



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 марта 2009 02:10
· Личное сообщение · #7

еще интересное замечание.
когда запускал прогу из своего ланчера, в котором ставил аппаратную точку, то при запуске проги вываливалось окно о необработанном исключении EXCEPTION_SINGLE_STEP.
как только внес код в длл и вклинил в процесс, перестало исключение вылетать.



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 марта 2009 02:11
· Личное сообщение · #8

Clerk о! спасибо! попробую



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 05 марта 2009 02:12
· Личное сообщение · #9

> когда запускал прогу из своего ланчера
Диспетчер исключений должен быть глобальным в процессе, иначе и будет необработанное исключение, если оно в сех не обрабатывается.



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 марта 2009 00:07 · Поправил: jopka
· Личное сообщение · #10

а не срабатывание точек останова (или даже не установка их) может быть связана с версией вендов или компилятора? кучу примеров перебрал, ничего не работает



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 06 марта 2009 00:10
· Личное сообщение · #11

jopka
Дай модуль потестить.



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 марта 2009 00:20 · Поправил: jopka
· Личное сообщение · #12

пример немного поправленный с васма.
его прицепляю к ноутпаду, можно к любой своей тестовой проге, не важно.
все messagebox'ы срабатывают, кроме тех, что должны срабатывать при вызове MyFunc2 (в самом MyFunc2 тоже срабатывает)
Code:
  1. #include "windows.h"
  2. void *breakpoint;
  3. BOOL SetBreakPoint( void *dwAddress ) 
  4. {
  5.          CONTEXT ct;
  6.     HANDLE hThread = GetCurrentThread();
  7.          ct.ContextFlags = CONTEXT_DEBUG_REGISTERS;
  8.          if( !GetThreadContext( hThread, &ct ) )
  9.                  return FALSE;
  10.          ct.Dr0 = (DWORD)dwAddress;
  11.     ct.Dr6 = 0;
  12.          ct.Dr7 = ( ct.Dr7 & 0xFFF0FFFF ) | 0x101;
  13.          MessageBox(NULL,L"qqqqqqq",L"qqqqqq",MB_OK);
  14.          return SetThreadContext( hThread, &ct );
  15.          //return true;
  16. }
  17. LONG WINAPI MyVectoredHandler( PEXCEPTION_POINTERS ExceptionInfo )
  18. {
  19.     MessageBox(NULL,L"trtrtr",L"trtrtrtrt",MB_OK);
  20.          if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP)
  21.            MessageBox(NULL,L"343434",L"676767",MB_OK);
  22.          /*if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT)
  23.            MessageBox(NULL,L"123123",L"676dsffsdf767",MB_OK); */
  24.          if( ExceptionInfo->ContextRecord->Dr6 & 1 )
  25.          {       
  26.              MessageBox(NULL,L"aaaa",L"bbbb",MB_OK);
  27.                  /*ExceptionInfo->ContextRecord->Eip -= 2;
  28.                  ExceptionInfo->ContextRecord->Eax = TRUE;
  29.                  ExceptionInfo->ContextRecord->Dr6 = 0;*/
  30.                  return EXCEPTION_CONTINUE_EXECUTION;
  31.          }
  32.          return EXCEPTION_CONTINUE_SEARCH;
  33. }
  34. __declspec(dllexport) int MyFunc() 
  35.                    { MessageBox(NULL,L"myfunc",L"myfunc",MB_OK); return 1;}
  36. int MyFunc2() {MessageBox(NULL,L"myfunc2",L"myfunc2",MB_OK); return 1;}
  37. BOOL APIENTRY DllMain( HANDLE hModule, 
  38.                        DWORD  ul_reason_for_call, 
  39.                        LPVOID lpReserved )
  40. {
  41.          static PVOID pv;
  42.          breakpoint=MyFunc2;
  43.          DisableThreadLibraryCalls( (HMODULE)hModule );
  44.          switch ( ul_reason_for_call )
  45.          {
  46.          case DLL_PROCESS_ATTACH:
  47.                  pv = AddVectoredExceptionHandler( 1, MyVectoredHandler );
  48.                  SetBreakPoint( MyFunc2 );
  49.                  //MessageBox(NULL,L"aaa453464576a",L"bb34234234324bb",MB_OK);
  50.                 MyFunc2();
  51.                  break;
  52.          case DLL_PROCESS_DETACH:
  53.                  RemoveVectoredExceptionHandler( pv );
  54.                  break;
  55.          }
  56.       return TRUE;
  57. }




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 06 марта 2009 00:42
· Личное сообщение · #13

jopka
Скомпиленый модуль в студию.



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 марта 2009 00:59
· Личное сообщение · #14

вот

5d43_05.03.2009_CRACKLAB.rU.tgz - TestDllka.dll



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 06 марта 2009 01:17
· Личное сообщение · #15

Code:
  1. MyFunc2()

У тебя там совсем не то, что в приведённом коде, та функция вобще не вызывается.



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 марта 2009 01:30
· Личное сообщение · #16

Clerk так.. вижу теперь в ида! он вставил её inline'ом в код вместо вызова. спасибо, сейчас переправлю. но подозреваю, что все равно не заработает.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 06 марта 2009 01:32
· Личное сообщение · #17

Вообще код говно, IsDebuggerPresent и остальная лабуда, зачем..



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 марта 2009 01:38
· Личное сообщение · #18

Clerk причуды компилятора



Ранг: 5.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 марта 2009 01:41
· Личное сообщение · #19

о! спасибо! заработало! надо было отключить оптимизацию компилятора ))



Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 09 января 2012 00:37 · Поправил: SReg
· Личное сообщение · #20

вообщем есть трабла.
вкратце, при исключении EXCEPTION_SINGLE_STEP если я не сброшу бит в др7, то оно будет снова и снова.
так и должно быть, или у меня руки кривые?




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

Создано: 09 января 2012 00:43
· Личное сообщение · #21

трейсишь или исключение ловишь или железный бряк?
если речь про Hardware Breakpoint, то всё верно.

-----
[nice coder and reverser]




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 09 января 2012 00:51 · Поправил: SReg
· Личное сообщение · #22

исключение ловлю. ставлю бряк на адрес - приплыл - сделал что хотел
дальше отпускаю прогу(с DBG_CONTINUE) и опять получаю этот же эксепшн.

Hellspawn пишет:
если речь про Hardware Breakpoint, то всё верно.

ясно, спасибо значит постоянно нужно сбрасывать...



Ранг: 281.8 (наставник), 272thx
Активность: 0.250.01
Статус: Участник
Destroyer of protectors

Создано: 09 января 2012 00:57
· Личное сообщение · #23

SReg
ну если про бряки, поймал исключение, обработал, если твоё - сделал чо надо и сбросил бит, не твоё - шлёшь нахер и пускаешь дальше и т.д. Ты ж сам модуль по хардварным брякам переписывал.




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

Создано: 09 января 2012 00:58
· Личное сообщение · #24

если нужно всегда брякаться, то нужно снять бряк, протрейсить 1 команду, и опять поставить.

-----
[nice coder and reverser]


| Сообщение посчитали полезным: SReg


Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 09 января 2012 03:25 · Поправил: daFix
· Личное сообщение · #25

SReg
Я как-то уже поднимал этот вопрос ТУТ.
Там полностью рассмотрена эта проблема, но если в двух словах, то Хелл всё правильно сказал

-----
Research For Food



 eXeL@B —› Программирование —› EXCEPTION_SINGLE_STEP
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати