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

 eXeL@B —› Программирование —› Неполучается поставить HWBP на ACCESS.
Посл.ответ Сообщение

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

Создано: 22 марта 2012 21:22 · Поправил: Skino
· Личное сообщение · #1

На EXECUTE пожалуйста, всё работает должным образом.
В ином же случает, HWBP срабатывает только когда обращаются к памяти из того же потока, где были поставлены сами HWBP. Вот небольшой пример кода:
Code:
  1. bool SetBreakpoint(void* adr, int n)
  2. {
  3.          if ( (< 1) || (> 4) )
  4.                  goto RETN_ERROR;
  5.  
  6.          if ( ((DWORD)adr < 0) || ((DWORD)adr > 0xFFFFFFFF) )
  7.                  goto RETN_ERROR;
  8.  
  9.          DWORD dwThreadId = GetCurrentThreadId();
  10.          if ( !dwThreadId )
  11.         goto RETN_ERROR;
  12.  
  13.          HANDLE hThread = OpenThread(THREAD_SET_CONTEXT | THREAD_GET_CONTEXT | THREAD_SUSPEND_RESUME, false, dwThreadId);
  14.          if ( !hThread )
  15.         goto RETN_ERROR_CLEAR;
  16.  
  17.          //if ( !SuspendThread(hThread) )
  18.          //      goto RETN_ERROR_CLEAR;
  19.  
  20.          CONTEXT ct;
  21.          ZeroMemory(&ct, sizeof(CONTEXT));
  22.     ct.ContextFlags = CONTEXT_DEBUG_REGISTERS;
  23.     if ( !GetThreadContext(hThread, &ct) )
  24.                  goto RETN_ERROR_CLEAR;
  25.  
  26.          ct.Dr6 = 0;
  27.  
  28.          // Enable local BP
  29.          ct.Dr7 |= BPM_LOCAL_ENABLED;
  30.  
  31.          switch ( n )
  32.          {
  33.                  case 1:
  34.                  {
  35.                         ct.Dr0 = (DWORD)adr;
  36.                         ct.Dr7 |= BPM0_LOCAL_ENABLED;
  37.                         ct.Dr7 |= BPM0_TYPE_ACCESS;
  38.                         ct.Dr7 |= BPM0_SIZE_BYTE;
  39.                         break;
  40.                  }
  41.          }
  42.  
  43.          if ( !SetThreadContext(hThread, &ct) )
  44.                  goto RETN_ERROR_CLEAR;
  45.  
  46.          //if ( !ResumeThread(hThread) )
  47.          //      goto RETN_ERROR_CLEAR;
  48.  
  49.          CloseHandle(hThread);
  50.  
  51.          return true;
  52.  
  53.  
  54. RETN_ERROR_CLEAR:
  55.          CloseHandle(hThread);
  56. RETN_ERROR:
  57.          return false;
  58. }

Объясните дураку что не так.
Пробывал и с локальными и глобальными - без толку.



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

Создано: 22 марта 2012 21:36 · Поправил: SReg
· Личное сообщение · #2

Code:
  1.  type DrX=(Dr0=1,Dr1=2,Dr2=3,Dr3=4);
  2.       Lenght=(lByte=0,lWord=1,lUnknown=2,lDword=3);
  3.       Condition=(cExecute=0,cWrite=1,cRead=3);
  4.  
  5. //******************************
  6. Function HwBreakSetup(HwRegID:DrX; address:DWORD; len:Lenght;con:Condition; ThreadId:DWORD):Boolean; stdcall;
  7. //******************************
  8.  
  9. procedure SetBitState(nBitCount: byte; var dw: DWord; bState: Boolean);
  10. begin
  11.     if bState then
  12.     begin
  13.         dw := dw or (1 shl nBitCount);
  14.     end else begin
  15.         dw := dw and not (1 shl nBitCount);
  16.     end;
  17. end;
  18.  
  19. //********************************
  20.  
  21. {*********************************************************************}
  22. Function HwBreakSetup(HwRegID:DrX; address:DWORD; len:Lenght; con:Condition; ThreadId:DWORD):Boolean;
  23. var
  24.          hThread: THandle;
  25.          cxt: CONTEXT;
  26.   Lbit1,Lbit2,Cbit1,Cbit2:Boolean;
  27. begin
  28.  Result:=FALSE;
  29.  FillChar(cxt,0,SizeOf(cxt));
  30.  cxt.ContextFlags:= CONTEXT_DEBUG_REGISTERS;
  31.  Lbit1:=FALSE; Lbit2:=FALSE; Cbit1:=FALSE; Cbit2:=FALSE;
  32.  case len of
  33.       lByte:
  34.             begin
  35.             Lbit1:=FALSE;
  36.             Lbit2:=FALSE;
  37.             end;
  38.       lWord:
  39.              begin
  40.              Lbit1:=FALSE;
  41.              Lbit2:=TRUE;
  42.              end;
  43.       lUnknown:
  44.              begin
  45.               Lbit1:=TRUE;
  46.               Lbit2:=FALSE;
  47.              end;
  48.       lDword:
  49.              begin
  50.               Lbit1:=TRUE;
  51.               Lbit2:=TRUE;
  52.              end;
  53.       end;
  54.  case con of
  55.       cExecute:
  56.             begin
  57.             Cbit1:=FALSE;
  58.             Cbit2:=FALSE;
  59.             end;
  60.       cWrite:
  61.              begin
  62.              Cbit1:=FALSE;
  63.              Cbit2:=TRUE;
  64.              end;
  65.       cRead:
  66.              begin
  67.               Cbit1:=TRUE;
  68.               Cbit2:=TRUE;
  69.              end;
  70.  end;
  71. hThread:=OpenThread(THREAD_ALL_ACCESS,TRUE,ThreadId);
  72.          if hThread = 0 then Exit;
  73.            if not GetThreadContext(hThread, cxt) then
  74.         begin
  75.           CloseHandle(hThread);
  76.           Exit;
  77.         end;
  78. case HwRegID of
  79.   Dr0:
  80.     begin
  81.                         cxt.Dr0:=address;
  82.                         SetBitState(0, cxt.Dr7,TRUE);
  83.                         SetBitState(16,cxt.Dr7,Cbit1);
  84.                         SetBitState(17,cxt.Dr7,Cbit2);
  85.                         SetBitState(18,cxt.Dr7,Lbit1);
  86.                         SetBitState(19,cxt.Dr7,Lbit2);
  87.     end;
  88.   Dr1:
  89.     begin
  90.                         cxt.Dr1:=address;
  91.                         SetBitState(2,cxt.Dr7,TRUE);
  92.                         SetBitState(20,cxt.Dr7,Cbit1);
  93.                         SetBitState(21,cxt.Dr7,Cbit2);
  94.                         SetBitState(22,cxt.Dr7,Lbit1);
  95.                         SetBitState(23,cxt.Dr7,Lbit2);
  96.     end;
  97.   Dr2:
  98.     begin
  99.       cxt.Dr2:=address;
  100.                         SetBitState(4,cxt.Dr7,TRUE);
  101.                         SetBitState(24,cxt.Dr7,Cbit1);
  102.                         SetBitState(25,cxt.Dr7,Cbit2);
  103.                         SetBitState(26,cxt.Dr7,Lbit1);
  104.                         SetBitState(27,cxt.Dr7,Lbit2);
  105.     end;
  106.   Dr3:
  107.     begin
  108.       cxt.Dr3:=address;
  109.                         SetBitState(6,cxt.Dr7,TRUE);
  110.                         SetBitState(28,cxt.Dr7,Cbit1);
  111.                         SetBitState(29,cxt.Dr7,Cbit2);
  112.                         SetBitState(30,cxt.Dr7,Lbit1);
  113.                         SetBitState(31,cxt.Dr7,Lbit2);
  114.     end;
  115. end;
  116. if not SetThreadContext(hThread,cxt) then Exit;
  117.   if not CloseHandle(hThread) then Exit;
  118.     Result:=TRUE;
  119. end;
  120. {*********************************************************************}


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

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

Создано: 22 марта 2012 23:00
· Личное сообщение · #3

Обновил первый пост, переделал функцию по твоему подобию, но всё равно не фурычит...
Вот дэфайны на всякий...
Code:
  1. #define BPM0_LOCAL_ENABLED                         0x00000001
  2. #define BPM0_GLOBAL_ENABLED                              0x00000002
  3. //
  4. #define BPM_LOCAL_ENABLED                    0x00000100
  5. #define BPM_GLOBAL_ENABLED                         0x00000200
  6. //
  7. #define BPM0_TYPE_ACCESS               0x00030000
  8. #define BPM0_SIZE_BYTE               0x00000000




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

Создано: 22 марта 2012 23:19 · Поправил: SReg
· Личное сообщение · #4

Skino
да все там работает
Code:
  1. #define HwBreakError -1
  2.  
  3. enum DrX
  4. {
  5.          Dr0=       1,
  6.          Dr1=       2,
  7.          Dr2=       3,
  8.          Dr3=       4
  9. };
  10.  
  11. enum Lenght
  12. {
  13.          lByte=   0,
  14.          lWord=   1,
  15.          lUnknown=        2,
  16.          lDword=          3
  17. };
  18.  
  19. enum Condition
  20. {
  21.          cExecute=        0,
  22.          cWrite=          1,
  23.          cRead=   3
  24. };
  25.  
  26. int __stdcall HwBreakSetup(DrX HwRegID, DWORD address, Lenght len, Condition con, DWORD ThreadId);
Code:
  1. int __stdcall HwBreakSetup(DrX HwRegID, DWORD address, Lenght len, Condition con, DWORD ThreadId)
  2. {
  3.          HANDLE hThread;
  4.          CONTEXT cxt;
  5.          memset(&cxt,0,sizeof(cxt));
  6.  
  7.          unsigned short lbit1,lbit2;
  8.          unsigned short cbit1,cbit2;
  9.  
  10.          lbit1=lbit2=0;
  11.          cbit1=cbit2=0;
  12.  
  13.          cxt.ContextFlags = CONTEXT_DEBUG_REGISTERS;
  14.  
  15.          switch(len)
  16.          {
  17.                  case lByte:
  18.                         lbit1=lbit2=0;
  19.                         break;
  20.                  case lWord:
  21.                         lbit1=0;
  22.                         lbit2=1;
  23.                         break;
  24.                  case lUnknown:
  25.                         lbit1=1;
  26.                         lbit2=0;
  27.                         break;
  28.                  case lDword:
  29.                         lbit1=1;
  30.                         lbit2=1;
  31.                         break;
  32.                  default:
  33.                         return HwBreakError;
  34.          }
  35.  
  36.          switch(con)
  37.          {
  38.                  case cExecute:
  39.                         cbit1=cbit2=0;
  40.                         break;
  41.                  case cWrite:
  42.                         cbit1=0;
  43.                         cbit2=1;
  44.                         break;
  45.                  case cRead:
  46.                         cbit1=1;
  47.                         cbit2=1;
  48.                         break;
  49.                  default:
  50.                         return HwBreakError;
  51.          }
  52.  
  53.          hThread=OpenThread(THREAD_ALL_ACCESS,true,ThreadId);
  54.  
  55.          if(!hThread)
  56.                  return HwBreakError;
  57.  
  58.          if (!GetThreadContext(hThread, &cxt))
  59.          {
  60.                  CloseHandle(hThread);
  61.                  return HwBreakError;
  62.          }
  63.  
  64.          switch(HwRegID)
  65.          {
  66.                  case Dr0:
  67.                         cxt.Dr0=address;
  68.                         SetBitState(0,&cxt.Dr7,true);
  69.                         SetBitState(16,&cxt.Dr7,cbit1);
  70.                         SetBitState(17,&cxt.Dr7,cbit2);
  71.                         SetBitState(18,&cxt.Dr7,lbit1);
  72.                         SetBitState(19,&cxt.Dr7,lbit2);
  73.                         break;
  74.                  case Dr1:
  75.                         cxt.Dr1=address;
  76.                         SetBitState(2,&cxt.Dr7,true);
  77.                         SetBitState(20,&cxt.Dr7,cbit1);
  78.                         SetBitState(21,&cxt.Dr7,cbit2);
  79.                         SetBitState(22,&cxt.Dr7,lbit1);
  80.                         SetBitState(23,&cxt.Dr7,lbit2);
  81.                         break;
  82.                  case Dr2:
  83.                         cxt.Dr3=address;
  84.                         SetBitState(4,&cxt.Dr7,true);
  85.                         SetBitState(24,&cxt.Dr7,cbit1);
  86.                         SetBitState(25,&cxt.Dr7,cbit2);
  87.                         SetBitState(26,&cxt.Dr7,lbit1);
  88.                         SetBitState(27,&cxt.Dr7,lbit2);
  89.                         break;
  90.                  case Dr3:
  91.                         cxt.Dr3=address;
  92.                         SetBitState(6,&cxt.Dr7,true);
  93.                         SetBitState(28,&cxt.Dr7,cbit1);
  94.                         SetBitState(29,&cxt.Dr7,cbit2);
  95.                         SetBitState(30,&cxt.Dr7,lbit1);
  96.                         SetBitState(31,&cxt.Dr7,lbit2);
  97.                         break;
  98.                  default:
  99.                         CloseHandle(hThread);
  100.                         return HwBreakError;
  101.          }
  102.  
  103.          if (!SetThreadContext(hThread, &cxt))
  104.          {
  105.                  CloseHandle(hThread);
  106.                  return HwBreakError;
  107.          }
  108.  
  109.          if(!CloseHandle(hThread))
  110.                  return HwBreakError;
  111.  
  112.          return true;
  113. }




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

Создано: 23 марта 2012 01:31 · Поправил: Skino
· Личное сообщение · #5

Твой код тоже не работает, есть ли программа или способ узнать стоят ли HWBP?



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 23 марта 2012 08:17 · Поправил: Veliant
· Личное сообщение · #6

Если гора не идет к Магомеду... ))
1)Попробуй ставить бряк на главный тред
2)Пробуй ставить бряки на все потоки



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

Создано: 23 марта 2012 11:14
· Личное сообщение · #7

Skino пишет:
Твой код тоже не работает

код рабочий!!!
Skino пишет:
есть ли программа или способ узнать стоят ли HWBP?

олей посмотреть не?

попробуй включить привелегии отладчика
Code:
  1. procedure DebugPrivilege;
  2. var
  3.   hToken: THandle;
  4.   tp: TOKEN_PRIVILEGES;
  5.   x: DWORD;
  6. begin
  7.     OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken);
  8.     tp.PrivilegeCount := 1;
  9.     LookupPrivilegeValue(nil, 'SeDebugPrivilege', tp.Privileges[0].Luid);
  10.     tp.Privileges[0].Attributes := $00000002
  11.     AdjustTokenPrivileges(hToken, False, tp, SizeOf(TOKEN_PRIVILEGES), nil, x);
  12.     CloseHandle(hToken);
  13. end;




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

Создано: 23 марта 2012 15:29
· Личное сообщение · #8

SReg пишет:
олей посмотреть не?

Скажи как я гляну.
SReg пишет:
попробуй включить привелегии отладчика

Тоже непомогает.


Расскажу что и как у меня работает.
В инжектится DLL в ней создается новый поток, в нем уже:
1 - Включение привилегий отладчика.
2 - AddVectoredExceptionHandler(0x1337, HWBPPVectoredHandler).
3 - Ставится HWBP на RW байта.
4 - Циклится поток.

Байт читается с левого потока. Который создается в той же DLL(только для теста).
Можно и не создавать новый поток мне без разницы - лишь бы работало.



Ранг: 85.4 (постоянный), 51thx
Активность: 0.090
Статус: Участник

Создано: 26 марта 2012 09:10
· Личное сообщение · #9

думаю два возможных варианта решения проблемы:
- не ставить VEH в потоке (нафига?)
- не правильно обрабатываются события VEH



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

Создано: 26 марта 2012 15:04
· Личное сообщение · #10

drone пишет:
- не ставить VEH в потоке (нафига?)

Где я его только не ставлю.
drone пишет:
- не правильно обрабатываются события VEH

Code:
  1. LONG WINAPI HWBPPVectoredHandler(PEXCEPTION_POINTERS ExceptionInfo)
  2. {
  3.          if(ExceptionInfo->ExceptionRecord->ExceptionCode != EXCEPTION_SINGLE_STEP)
  4.                  return EXCEPTION_CONTINUE_SEARCH;
  5.  
  6.          MessageBox(0,"HWBPPVectoredHandler EXECUTE",0,0);
  7. }

Меседж даже не вылазиет...




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 марта 2012 22:05 · Поправил: ARCHANGEL
· Личное сообщение · #11

Skino
Я не понял, зачем юзать какую-то константу 0x1337 в строке
Code:
  1. AddVectoredExceptionHandler(0x1337, HWBPPVectoredHandler).
, когда в MSDN явно прописаны дефайны
Code:
  1. //CALL_FIRST means call this exception handler first;
  2. //CALL_LAST means call this exception handler last
  3. #define CALL_FIRST 1  
  4. #define CALL_LAST 0


Вас будет интересовать значение CALL_FIRST.

Как посмотреть в ольке...
Да очень просто - посмотрите drx регистры.

А вообще я не пойму, что вас так удивляет. Конечно, не работает. А как оно может работать? Каждый поток имеет свой контекст, что позволяет планировщику выполнять переключение контекстов поток, замораживая один и размораживая другой. Т.е., выражаясь просто, у каждого потока есть свои значения для dr-регистров. И выставив через SetThreadContext эти значения в одном из них (потоков), вы не оказываете никакого влияния на другие. Выход - при загрузке библиотеки перечисляем все потоки, правим в них контекст, и устанавливаем свой CALLBACK в либе, который будет выполняться в контексте нового потока при создании такого в приложении, к которому инжектитесь. Естественно, этот колбэк тоже должен править контекст. Да, конечно, --> Здесь <--, да и не только, пишут про возможность использования глобальных точек останова, которые не сбрасываются при переключении задачи. Однако пишут там это только про регистр dr7, как же сохранить линейные адреса в dr1-dr4, да и термин "задача" в понимании интела и термин поток в понимании Windows - не одно и тоже. В Винде всё выполняется в одной задаче, но аппаратники в калькуляторе не срабатывают в Ворде, отсюда можно сделать вывод, что все аппаратники локальны.

Байт читается с левого потока. Который создается в той же DLL(только для теста).

Т.е. как я понял - последовательно вызывается CreateThread(), и нет синхронизации, т.е. второй поток может обратить к ячейке памяти раньше, чем первый установит аппаратный брейкпоинт. Используйте WaitForSingleObject и дождитесь завершения работы потока, устанавливающего аппаратники.

-----
Stuck to the plan, always think that we would stand up, never ran.


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

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

Создано: 29 марта 2012 01:10
· Личное сообщение · #12

ARCHANGEL пишет:
Выход - при загрузке библиотеки перечисляем все потоки

Считывание байта происходит из новоиспеченного потока, т.е. на момент сканирования потока ещё не будет.ARCHANGEL пишет:
Однако пишут там это только про регистр dr7, как же сохранить линейные адреса в dr1-dr4

Вот это мне и нужно, поставить GLOBAL (на процесс) HWBP.

ARCHANGEL пишет:

Т.е. как я понял - последовательно вызывается CreateThread(), и нет синхронизации, т.е. второй поток может обратить к ячейке памяти раньше, чем первый установит аппаратный брейкпоинт. Используйте WaitForSingleObject и дождитесь завершения работы потока, устанавливающего аппаратники.

Для теста - это значит что байт читается постоянно, и до и после.



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

Создано: 30 марта 2012 09:36
· Личное сообщение · #13

Skino попробуй этот код,когдато разбирался с этим,сейчас проверить работоспособность нет возможности

Code:
  1. #include <iostream.h>
  2. long __stdcall Me(EXCEPTION_POINTERS*t)
  3. {
  4.  cout<<"Here we are!"<<"\n";
  5.  t->ContextRecord->ContextFlags=CONTEXT_DEBUG_REGISTERS;
  6.  cout<<t->ContextRecord->Dr0<<"\n";
  7.  cout<<t->ContextRecord->Dr1<<"\n";
  8.  cout<<t->ContextRecord->Dr2<<"\n";
  9.  cout<<t->ContextRecord->Dr3<<"\n";
  10.  cout<<t->ContextRecord->Dr6<<"\n";
  11.  cout<<t->ContextRecord->Dr7<<"\n";
  12.   if(t->ContextRecord->Dr0!=0 || t->ContextRecord->Dr1!=0 || t->ContextRecord->Dr2!=0 || t->ContextRecord->Dr3!=0 || t->ContextRecord->Dr6!=0 || t->ContextRecord->Dr7!=0)
  13.   {
  14.     cout<<"Debugger found!";
  15.   }
  16.  Sleep(4000);
  17.  return 0;
  18. }
  19. int main(int argc, char* argv[])
  20. {
  21. AddVectoredExceptionHandler(1,Me);
  22. asm
  23. {
  24.   mov eax,1
  25.   xor eax,[eax]
  26. }
  27. cout<<"Main";
  28. Sleep(6000);
  29.         return 0;
  30. }
  31.  





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 30 марта 2012 09:54
· Личное сообщение · #14

Skino пишет:
Считывание байта происходит из новоиспеченного потока, т.е. на момент сканирования потока ещё не будет

Не читаете вы до конца, там же написано:и устанавливаем свой CALLBACK в либе, который будет выполняться в контексте нового потока при создании такого в приложении, к которому инжектитесь

Вот это мне и нужно, поставить GLOBAL (на процесс) HWBP.
Ну, это, я думаю, уже все поняли.

Для теста - это значит что байт читается постоянно, и до и после.
Это как? Поток читает байт и до, и после своего создания???

-----
Stuck to the plan, always think that we would stand up, never ran.



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


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