Сейчас на форуме: Kybyx (+2 невидимых)

 eXeL@B —› Оффтоп —› syser - а он еще нужен?
<< . 1 . 2 . 3 . 4 . 5 . 6 . >>
Посл.ответ Сообщение


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 26 декабря 2016 00:08
· Личное сообщение · #1

есть мысль себе в портфолио добавить хоть что то, что можно показать на паблик
из всего что сделано или делается или будет делаться, почти ничего на паблик показывать нельзя
вспомнил про Syser,его можно, могу восстановить соурсы ядра дебагера, которое общее для Ring3 и Ring0
(кто помнит у Syser два дебагера, ring3 и ring0, знают все только ring0, про ring3 мало наверное кто помнит, он был бесплатен)
ну и сам Ring3 часть как рабочий дебагер, можно и всю Ring0, но мне это не интересно
ну и все конечно на гитхаб

собственно вопрос, а дальше это кому то интересно? подхватить,развивать итд, гуи дебагер для ядра еще живы ?



Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 16 мая 2017 08:45 · Поправил: shellstorm
· Личное сообщение · #2

reversecode пишет: да там код простой до безобразия

При O2 нормальный код будет и скорее всего заинлайнится.
Тестил на 2008 все сводится к cmp byte [esi],bl setn al.
Вот так лучше не делать bool CALLME(void *Buffer, int i ). void* это хз какой тип, поэтому компилятор втыкает регистр под размер адреса, BYTE* существенно меняет картину, CALLME(Buffer|i|) \ CALLME(BYTE Buffer) еще лучше, компилятор все развернет до 16 битных регистров.

reversecode пишет: я еще помню был жесткий баг в ГЦЦ как миниум

Тоже писал багрепорт, версия GCC если не изменяет память была 4.3 не всегда корректно разворачивал свитч с if-ми внутри в которых были довольно сложные битовые сравнения, выкидывал часть условия даже с выключенной оптимизацией, что естественно приводило к неработающей программе.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 мая 2017 09:58
· Личное сообщение · #3

shellstorm пишет:
Вот так лучше не делать bool CALLME(void *Buffer, int i ).

что значит не делать, это аля memcpy который то char* то long* может использовать

Добавлено спустя 8 минут
что там лежит в стеке сразу после фолта ?
+8 CS
+4 EIP
+0 ERROR

так ?

push 0Eh
call _HandleInterrupt_sub_19FFC
lea esp, [esp+4]

ничего не меняет, стек остался на месте

pushf +4
pusha +20
затолкали флаги и регистры +24

дальше забираем указатель на наш стек
mov ebp, esp

и увеличиваем стаек на два дворда
lea esp, [esp-8]

в первый записываем указатель на стек
mov [ebp-4], ebp
во второй адрес фолта
mov eax, cr2
mov [ebp-8], eax

и переползаем по указателю на стек в верх
add dword ptr [ebp-4], 28h


и ... вот здесь я не понял. где мы в итоге на dword ptr [ebp-4] оказываемся ?
+24h мы пропускаем все флаги+регистры
+4 еще выше поднимаемся по фловому фрему, получается на сам EIP ? если так то дальше не складывается...

а если так то дальше в логике все ок,
должны быть на указателе на стеке с ошибкой
тогда
mov eax, [ebp-4] это указатель на стек с ошибкой
push dword ptr [eax] сама ошибка


а уже в функции
call _from_int_14_sub_62076
выгребается с [eax+4] уже EIP



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

Создано: 16 мая 2017 10:29
· Личное сообщение · #4

reversecode пишет:
+4 еще выше поднимаемся по фловому фрему, получается на сам EIP ? если так то дальше не складывается...


Так вот выходит, что не складывается.

Если, конечно, _HandleInterrupt_sub_19FFC не манипулирует с esp




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 мая 2017 13:16
· Личное сообщение · #5

не меняет
это обычная функа для сохранения контекста цпу под свои нужды
https://pastebin.com/90fbx2K5

либо что то с трап фреймом недопонимаю...
над будет загнать в компилером этот код и пройтись отладчиком по этим стековым манипуляциям



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

Создано: 16 мая 2017 15:06
· Личное сообщение · #6

выложи листинг функи _from_int_14_sub_62076 целиком




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 мая 2017 15:39
· Личное сообщение · #7

https://pastebin.com/hhc2XSx8
собственно зачем это все затеяно
хотелось понять что за данные приходят в функу call dword ptr [eax+44h], которая является обработчиком с цикле дебаг ядра в сисере

Code:
  1. .text:00062147 028                 mov     edx, [ebp+Pa3]     <-- ???? 
  2. .text:0006214A 028                 mov     ecx, ?gpSyser@@3PAVCSyser@@A ; CSyser * gpSyser
  3. .text:00062150 028                 push    dword ptr [edx+4]  <-- -????
  4. .text:00062153 02C                 add     ecx, 25CBCh
  5. .text:00062159 02C                 push    [ebp+Address]     <--- CR2???
  6. .text:0006215C 030                 mov     eax, [ecx]
  7. .text:0006215E 030                 call    dword ptr [eax+44h]


один аргумент это адрес фолта cr2
а вот второй это тот eax который является аргументом Pa3 и который берется [edx+4]

и судя по логике это должен быть EIP

почему EIP
потому что есть еще функа
https://pastebin.com/1CaMY17N
в которую тоже передается
Code:
  1. .text:0006219F 038                 push    dword ptr [ebp-4]
  2. .text:000621A2 03C                 call    _find_hook_sub_61FE8

и в которой [eax+4] уже черпается EIP адреса функций из самого сисера
Code:
  1. .text:00061FE8 000                 mov     ecx, [esp+arg_0]
  2. .text:00061FEC 000                 mov     eax, [ecx+4]
  3. .text:00061FEF 000                 cmp     eax, offset _READ_B_sub_445F0
  4. .text:00061FF4 000                 jbe     short loc_61FFF
  5. .text:00061FF6 000                 mov     edx, offset _READ_B_END_sub_44626
  6. .text:00061FFB 000                 cmp     eax, edx
  7. .text:00061FFD 000                 jb      short loc_6206A

вот по логике вроде так
а по математике не сходятся подсчеты со стеком

либо в стеке после фолта данные как то не так ложатся.. я хз, вроде гуглил но не нашел описания фолтового фрейма

Добавлено спустя 14 часов 16 минут
все таки наверное я ошибся
это не чистые функи с IDT
это патченные, потому что в этих нет вызова оригинальных виндовых....



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

Создано: 17 мая 2017 07:58
· Личное сообщение · #8

Вроде разобрался.
Еще до первой команды хэндлера - push 0Eh - где-то происходит уменьшение указателя стека на 4.
Это становится очевидно, если взглянуть на конец функции:
popa
popf
lea esp, [esp+8]
or dword ptr [esp+8], 100h
iret
Т.е. после popf указатель стека указывает не на код ошибки, а на 4 байта ниже.
Поэтому всё правильно - после add dword ptr [ebp-4], 28h в [ebp-4] указатель на код ошибки, а не на EIP.
Получается, что после фолта до выполнения этого кода выполняется что-то еще.

P.S.
Очень интересно зачем сисер при возврате из обработчика PF# устанавливает TF в образе EFLAGS в стеке
(or dword ptr [esp+8], 100h)



Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 17 мая 2017 12:47
· Личное сообщение · #9

reversecode пишет:что значит не делать, это аля memcpy который то char* то long* может использовать

Так кода же не видел и сужу лишь по описанию.
reversecode пишет:нужно пробежаться по void * буферу как байтовому, и найти байты СС
reversecode пишет:char BUFFER[10];




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 17 мая 2017 17:40 · Поправил: reversecode
· Личное сообщение · #10

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



Добавлено спустя 7 минут
spinz пишет:
Очень интересно зачем сисер при возврате из обработчика PF# устанавливает TF в образе EFLAGS в стеке

может поймать трапом обработку

пока копал ring0, нашел что там есть branch tf который ставят в MSR
интересная штука... только в ring3 там заглушка...
нашел что можно вроде и в ring3 такое запустить
http://www.openrce.org/blog/view/535/Branch_Tracing_with_Intel_MSR_Registers
надо будет попробовать заимплементить

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

Добавлено спустя 2 часа 3 минуты
печаль
гугл пишет что NtSystemDebugControl на win7 x64 уже не пашет..
http://rsdn.org/forum/winapi/4421811.hot

Добавлено спустя 2 часа 9 минут
и в тоже время народ пишет что

and here a link to an article about the easy ring3 method:
http://fdbg.x86asm.net/article_DebugCtlMSR_backdoor_in_win64.txt
a bit long reading, so in shortcut: for enabling branches in win x64, just set some bits in debug 7 register (DR7.LE, DR7.GE). That's all ! Simple, huh? Unbelievable and funny? No, that way really works under current versions of x64 windows.


т.е. через DR7 у них работает
интересно а на 32битах ....

dr7 под ring3 же доступен насколько я помню ?...

Добавлено спустя 2 часа 21 минуту
https://github.com/x64dbg/x64dbg/issues/227
https://www.codeproject.com/Articles/517466/Last-branch-records-and-branch-tracing
http://www.rcollins.org/secrets/DR7.html
сохраню для себя



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

Создано: 19 мая 2017 06:37
· Личное сообщение · #11

reversecode пишет:
может поймать трапом обработку

Т.е. сисер зачем-то трапит инструкцию, вызвавшую PF#
Непонятно зачем.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 19 мая 2017 07:25 · Поправил: reversecode
· Личное сообщение · #12

механизм TF на выходе как я понимаю должен использоваться к обработке BP через PF# где я раньше спрашивал
если посмотреть то TF ставится если функа _from_int_14_sub_62076 возвращает 1
Code:
  1. .text:000621C3 038                 mov     eax, [ebp-4]
  2. .text:000621C6 038                 push    eax
  3. .text:000621C7 03C                 push    dword ptr [eax]
  4. .text:000621C9 040                 push    dword ptr [ebp-8]
  5. .text:000621CC 044                 call    _from_int_14_sub_62076
  6. .text:000621D1 038                 test    al, al
  7. .text:000621D3 038                 jz      short loc_621EC
  8. .text:000621D5 038                 pop     fs
  9. .text:000621D7 034                 pop     es
  10. .text:000621D8 030                 pop     ds
  11. .text:000621D9 02C                 lea     esp, [esp+8]
  12. .text:000621DD 024                 popa
  13. .text:000621DE 004                 popf
  14. .text:000621DF 000                 lea     esp, [esp+8]
  15. .text:000621E3 -08                 or      dword ptr [esp+8], 100h
  16. .text:000621EB -08                 iret

а 1 она возвращает только когда находит что то там в каком то своем списке (возможно расширенные BP)
https://pastebin.com/kSXqF199
и по TF она уже попадет в свой int1 или int3 трап
где видимо как то продолжит обработку BP

Добавлено спустя 18 часов 56 минут
в чем магический смысл
0xCC
и
0xCD 0x03

только в размерности ? проц одинаково их обрабатывает ?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 02 июня 2017 20:48 · Поправил: reversecode
· Личное сообщение · #13

кручу верчу ring0 сисер
обдумываю сколько усилий нужно что бы добить до ring0

что бы нарисовать сисер в ring0
0) переписать std::map
1) графика
вроде все просто, банальные хуки функций ддрав
2) клава, мышь для емуляции и работа с портам
кода много разного, но вроде без асма
3) хуки ИДТ (той же клавы и мыши)
вот тут наверное сложнее
есть асм, и без него никуда, для x86 студия инлан асм поддерживает, а вот что делать для x64, непонятно
писать на голом асм лениво
смотрел диагонально интрисики, что то есть, но хз есть ли все
как минимум iret там нет
4) APIC и мульти ядерность
вообще забыл эту тему, даже не понимаю еще что там сисер чудил
но видно по коду есть в IDT инструкций lock cmp,lock add
и не ясно можно ли обойтись без мультиядерности пока просто рисованием и обработкой миши и клавы


для полноценного дебагера
1) куча версий ядер нт, для детекта MiCopyOnWrite
вроде даже обычными плюсами обойтись можно, асма нет
2) хуки ИДТ для всех остальных int, 1,3,14 и кучу еще всяких по моему даже пустых в реализации
без асма вообще никак
3) несколько разных заумных функций копирования итд которые разбавленны разным асм кодом, popfd pushfd и прочим
врядли без асма обойти
4) несколько заумных функций трансляции адреса (наверное)
даже если их реверснуть, пока не понятно можно ли будет портировать на x64
адресация памяти, место резервации ядер итд, наверняка перебито по новой
а по коду много всяких
v10 = (4 * (Address >> 22) - 0x3FD00000);
v13 = (4 * (Address >> 12) - 0x40000000);
v4 = (((Address >> 18) & 0x3FF8) - 0x3FA00000);
v4 = (((Address >> 9) & 0x7FFFF8) - 0x40000000);
итд и хрен на глаз поймешь зачем это надо
5) заумные функции read(b,w,d) write(b,w,d) memcmp итд
разбавлены коды возврата через stc clc, без асма вообще хз как такое в С С++ реализовывать

и самое интересное, я почти уверен что сисер писали только асм инлайнами, как же они повыкручивались там в этих ситуациях..

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


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

Создано: 03 июня 2017 02:23
· Личное сообщение · #14

reversecode, ты постарался от души и спасаешь меня как-то!
Когда мне будет нечего читать - ты меня уже выручил! ))
Когда мне будет нечего реверсить - вспомни, я сюда пришёл из-за этого бажного инструмента.
Когда мне будет нечего писать - я помогу тебе

-----
IZ.RU





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 03 июня 2017 12:25 · Поправил: reversecode
· Личное сообщение · #15

замысловато ты написал, я даже не понял хорошо это или плохо
помню что ты боролся с сисером и его #PF
но бажность сисера не в этих асм закрутках
а в невнимательности логики использования своих же указателей
например у меня сисер часто валился на калькуляторе, видимо какие то деления на ноль, не разбирался
потом есть всякие использование не проинициализированых указателей,
поклацать на отображения айпи в дизасме, и он валится
итд
в своей версии фикшу, если такое нахожу в оригинальной


вообщем хочется степ бранчей
полез в гугл
нашел что dbgeng.dll умеет
dbgeng.h
#define DEBUG_STATUS_STEP_BRANCH 8

потом залез в саму длл
покопал чуток
Code:
  1. int __thiscall LocalLiveKernelTargetInfo::WriteMsr(LocalLiveKernelTargetInfo *this, int a2, __int64 a3)
  2. {
  3.   int v3; // edi@1
  4.   int v5; // [esp+4h] [ebp-10h]@1
  5.   __int64 v6; // [esp+Ch] [ebp-8h]@1
  6.  
  7.   v5 = a2;
  8.   v6 = a3;
  9.   v3 = LocalLiveKernelTargetInfo::DebugControl((int)this, 17, (int)&v5, 16, 0, 0, 0);
  10.   if ( !v3 )
  11.     NotifyChangeDebuggeeState(2u, 4ui64);
  12.   return v3;
  13. }

Code:
  1. int __thiscall LocalLiveKernelTargetInfo::DebugControl(int this, int a2, int a3, int a4, void *a5, DWORD a6, DWORD *a7)
  2. {
  3.   void *v7; // eax@1
  4.   int result; // eax@4
  5.   int v9; // eax@11
  6.   int v10; // [esp+0h] [ebp-Ch]@2
  7.   int v11; // [esp+4h] [ebp-8h]@2
  8.   int v12; // [esp+8h] [ebp-4h]@2
  9.  
  10.   v7 = *(void **)(this + 0xFF8);
  11.   if ( !v7 )
  12.   {
  13.     v9 = g_NtDllCalls.NtSystemDebugControl(a2, a3, a4, a5, a6, a7);
  14.     if ( v9 < 0 )
  15.       return v9 | 0x10000000;
  16.     return 0;
  17.   }
  18.   v10 = a2;
  19.   v11 = a3;
  20.   v12 = a4;
  21.   if ( DeviceIoControl(v7, 0x22C007u, &v10, 0xCu, a5, a6, &a6, 0) )
  22.   {
  23.     if ( a7 )
  24.       *a7 = a6;
  25.     return 0;
  26.   }
  27.   if ( !GetLastError() )
  28.     return 0x80004005;
  29.   result = GetLastError();
  30.   if ( result > 0 )
  31.     result = (unsigned __int16)result | 0x80070000;
  32.   return result;
  33. }


угу, либо через nt.dll
а мы знаем что оно обрезано с некоторых версий винды
либо через какой то драйвер
гугл рассказал и это
https://www.yumpu.com/en/document/view/54775013/draw-me-a-local-kernel-debugger/17
http://www.ivanlef0u.tuxfamily.org/?p=382
https://github.com/sogeti-esec-lab/LKD

но то чего хочется раскопать, а именно кто и как легально юзает msr через SetContext в спец битах DR7
и как это заюзать самому, по быстрому не нашлось...
по трейсил бы кто SetContext до самого ядра ?)) и если биты устанавливаются в msr, то почему дебаг евенты не приходят в юзермод
импортируемых вызовов SetContext даже не просматривается в dbgeng.dll, а жаль....

за то увидел что протокол общения с интерфейсом com порта(если мечтать о виртулке ring0)
и общения с драйвером kldbgdrv сидит в этой длл, хотя олеком какие то цепляются по ходу пьесы...

Добавлено спустя 16 минут
https://twitter.com/painter701
не знаю что за чел, но приятно что кто то проявил инициативу)))

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


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

Создано: 04 июня 2017 16:30
· Личное сообщение · #16

reversecode

> кто и как легально юзает msr через SetContext в спец битах DR7

Code:
  1. ;++
  2. ;
  3. ; KiSaveProcessorControlState (
  4. ; PKPROCESSOR_STATE ProcessorState
  5. ; );
  6. ;
  7. ; Routine Description:
  8. ;
  9. ; This routine saves the control state of the current processor.
  10. ;
  11. ; Arguments:
  12. ;
  13. ; ProcessorState (rcx) - Supplies a pointer to a processor state structure.
  14. ;
  15. ; Return Value:
  16. ;
  17. ; None.
  18. ;
  19. ;--
  20.  
  21.         LEAF_ENTRY KiSaveProcessorControlState, _TEXT$00
  22.  
  23.         mov     rax, cr0                ; save processor control state
  24.         mov     PsCr0[rcx], rax         ;
  25.         mov     rax, cr2                ;
  26.         mov     PsCr2[rcx], rax         ;
  27.         mov     rax, cr3                ;
  28.         mov     PsCr3[rcx], rax         ;
  29.         mov     rax, cr4                ;
  30.         mov     PsCr4[rcx], rax         ;
  31.         mov     rax, cr8                ;
  32.         mov     PsCr8[rcx], rax         ;
  33.  
  34.         sgdt    fword ptr PsGdtr[rcx]   ; save GDTR
  35.         sidt    fword ptr PsIdtr[rcx]   ; save IDTR
  36.  
  37.         str     word ptr PsTr[rcx]      ; save TR
  38.         sldt    word ptr PsLdtr[rcx]    ; save LDTR
  39.  
  40.         stmxcsr dword ptr PsMxCsr[rcx]  ; save XMM control/status
  41.  
  42. ;
  43. ; Save debug control state.
  44. ;
  45.  
  46.         mov     rax, dr0                ; save debug registers
  47.         mov     rdx, dr1                ;
  48.         mov     PsKernelDr0[rcx], rax   ;
  49.         mov     PsKernelDr1[rcx], rdx   ;
  50.         mov     rax, dr2                ;
  51.         mov     rdx, dr3                ;
  52.         mov     PsKernelDr2[rcx], rax   ;
  53.         mov     PsKernelDr3[rcx], rdx   ;
  54.         mov     rax, dr6                ;
  55.         mov     rdx, dr7                ;
  56.         mov     PsKernelDr6[rcx], rax   ;
  57.         mov     PsKernelDr7[rcx], rdx   ;
  58.         xor     eax, eax                ;
  59.         mov     dr7, rax                ;
  60.         cmp     byte ptr gs:[PcCpuVendor], CPU_AMD ; check if AMD processor
  61.         jne     short KiSC10            ; if ne, not authentic AMD processor
  62.  
  63. ;
  64. ; The host processor is an authentic AMD processor.
  65. ;
  66. ; Check if branch tracing or last branch capture is enabled.
  67. ;
  68.  
  69.         test    dx, DR7_TRACE_BRANCH or DR7_LAST_BRANCH ; test for extended enables
  70.         jz      short KiSC10            ; if z, extended debugging not enabled
  71.         mov     r8, rcx                 ; save processor state address
  72.         mov     ecx, MSR_LAST_BRANCH_FROM ; save last branch information
  73.         rdmsr                           ;
  74.         mov     PsLastBranchFromRip[r8], eax ;
  75.         mov     PsLastBranchFromRip + 4[r8], edx ;
  76.         mov     ecx, MSR_LAST_BRANCH_TO ;
  77.         rdmsr                           ;
  78.         mov     PsLastBranchToRip[r8], eax ;
  79.         mov     PsLastBranchToRip + 4[r8], edx ;
  80.         mov     ecx, MSR_LAST_EXCEPTION_FROM ;
  81.         rdmsr                           ;
  82.         mov     PsLastExceptionFromRip[r8], eax ;
  83.         mov     PsLastExceptionFromRip + 4[r8], edx ;
  84.         mov     ecx, MSR_LAST_EXCEPTION_TO ;
  85.         rdmsr                           ;
  86.         mov     PsLastExceptionToRip[r8], eax ;
  87.         mov     PsLastExceptionToRip + 4[r8], edx ;
  88.         mov     ecx, MSR_DEGUG_CTL      ; clear extended debug control
  89.         rdmsr                           ;
  90.         and     eax, not (MSR_DEBUG_CTL_LBR or MSR_DEBUG_CRL_BTF) ;
  91.         wrmsr                           ;
  92. KiSC10: ret                             ; return


Это у амд отображение управляющих бит мср на др. Поэтому можно запустить этот механизм из юм загрузкой dr7 в контексте. При свопе потоков или при переключении мода(возврате в юм) - Kei386EoiHelper() etc, не происходит перезагрузка мср, таким образом записав принудительно мср и запустив механизм трассировки ветвлений он начнёт выполняться для всех потоков в системе(без BTS_OFF_OS начнётся трассировка ядра). Поэтому нужно написать дров, который будет управлять данным процессом.

Добавлено спустя 15 минут
> в чем магический смысл 0xCC и 0xCD 0x03

Это ловушка(trap), поэтому в ISR передаётся адрес следующей инструкции, но система его не правильно фиксит:

Code:
  1.         mov     ebx, [ebp]+TsEip
  2.         dec     ebx                     ; (ebx)-> int3 instruction
  3.         mov     ecx, 3
  4.         mov     eax, STATUS_BREAKPOINT
  5.         call    CommonDispatchException ; Never return


Отматывается один байт назад, это правильно для CC, но не для CD с префиксами или двубайтному.

Добавлено спустя 18 минут
> хотя можно же и софтово реализовать ? дизасмом смотреть опкоды бранчей и генерить брекпоинт

Можно, я уже где то писал про такое. Но железячная трассировка ветвлений хороша из за профайла. А можно есчо по простому сделать, если профайл не важен - трассируем как обычно(TF) и продолжаем до обнаружения ветвления.

-----
vx





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 04 июня 2017 16:59 · Поправил: reversecode
· Личное сообщение · #17

у интела такой же код для dr7, я смотрел дизасмом свой кернель, просто в wrk его похоже нет

сколько байт у опкодов int 3 я и так знаю, мне интересует какая нужда применять разные опкоды на практике?
может их проц по другому ловит и обрабатывает ?
если есть 0xCC зачем нужен 0xCD 0x03 ?




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

Создано: 04 июня 2017 17:01 · Поправил: difexacaw
· Личное сообщение · #18

reversecode

Смысл не в коде, у амд несколько бит в мср отображены на др, тоесть пишем их в др, а они меняются в мср

-----
vx





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 04 июня 2017 17:03
· Личное сообщение · #19

так я еще раз повторяю, причем здесь amd ? в интела все тоже самое, даже по коду
фокус в том что не работает, ранее чал копал, и вроде наткунлся что в старых кернелях была проверка на тип проца,
и как он подметил, видимо документация из интела не дошла в МС по новым процам, и там забыли добавить новые типы для возможности записи msr через dr7




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

Создано: 04 июня 2017 17:31 · Поправил: difexacaw
· Личное сообщение · #20

reversecode

> может их проц по другому ловит и обрабатывает ?

Разницы заметной нет, кроме не существенных деталей(не проверяет IOPL из V86).

Допустим у нас последовательность F3 CD 03. При останове Ip = 03. Нужно идти назад и найти начало инструкции, а при серии префиксов это не всегда возможно сделать.

> причем здесь amd ? в интела все тоже самое

Да нет же, эта фича даже не описана в мане амд(том 2). Я давно читал в какой то их спецификации, но не помню где. На Интеле это не сработает, я проверял на i5. Выше в коде посмотрите имена полей dr7: DR7_TRACE_BRANCH or DR7_LAST_BRANCH. У Интела этих бит нет.

-----
vx





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 04 июня 2017 17:40
· Личное сообщение · #21

у интела и amd есть msr и оно поддерживается ( во всяком случае это можно проверять через cpuid)
dr7 поля, это мапинг, эти поля устанавливаются из ring3 и через SetContext, ядро ловит эти установки и перекладывает на msr

был бы ядреный дебагер или бы я был профспецом по windbg, я бы уже взял да проверил доходят ли эти установки из ring3 в ring0 или ломаются на каких то проверках




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

Создано: 04 июня 2017 18:01
· Личное сообщение · #22

Что то такое происходит в amd-64, но на 86 этой эмуляции вообще нет.

-----
vx





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 04 июня 2017 18:14
· Личное сообщение · #23

ну да, такой мапинг msr только на x64 платформе, на x86 такого увы нет, но и платформы такой уже почти нет
везде все x64




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

Создано: 04 июня 2017 18:33
· Личное сообщение · #24

А чем обычная трассировка не устраивает. Можно блок линейный выделить, но это дизасм длин нужен.

7517_04.06.2017_EXELAB.rU.tgz - bt.rar

Добавлено спустя 1 час 2 минуты
Вот есчо через HWB. Можно напрямую блок выполнить в буфере, принципиально разницы нет.

eec9_04.06.2017_EXELAB.rU.tgz - bt2.rar

-----
vx





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 04 июня 2017 21:16
· Личное сообщение · #25

это все хаки, сиеровский тоже умеет
хочется хардварно через мср




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

Создано: 04 июня 2017 21:45 · Поправил: difexacaw
· Личное сообщение · #26

А что мешает собрать простейший драйвер для операций с мср ?

В 8-ке кстате есть такой код:

Code:
  1. PAGEVRFY:007DC71C ; __stdcall VfStartBranchTracing()
  2. PAGEVRFY:007DC71C _VfStartBranchTracing@0 proc near       ; CODE XREF: KiFreezeTargetExecution(x,x)+36Dp
  3. PAGEVRFY:007DC71C                                         ; VfNotifyVerifierOfEvent(x)+34p ...
  4. PAGEVRFY:007DC71C                 mov     eax, _MmVerifierData
  5. PAGEVRFY:007DC721                 test    eax, 8000000h
  6. PAGEVRFY:007DC726                 jz      short loc_7DC794
  7. PAGEVRFY:007DC728                 cmp     ds:_VfBTSSupported, 0
  8. PAGEVRFY:007DC72F                 jz      short loc_7DC794
  9. PAGEVRFY:007DC731                 xor     ecx, ecx
  10. PAGEVRFY:007DC733                 cmp     ds:_VfBTSInitialized, ecx
  11. PAGEVRFY:007DC739                 jnz     short loc_7DC741
  12. PAGEVRFY:007DC73B
  13. PAGEVRFY:007DC73B loc_7DC73B:                             ; CODE XREF: VfStartBranchTracing()+38j
  14. PAGEVRFY:007DC73B                 mov     eax, 0C000042Ah
  15. PAGEVRFY:007DC740                 retn
  16. PAGEVRFY:007DC741 ; ---------------------------------------------------------------------------
  17. PAGEVRFY:007DC741
  18. PAGEVRFY:007DC741 loc_7DC741:                             ; CODE XREF: VfStartBranchTracing()+1Dj
  19. PAGEVRFY:007DC741                 mov     eax, large fs:20h
  20. PAGEVRFY:007DC747                 mov     eax, [eax+3CCh]
  21. PAGEVRFY:007DC74D                 cmp     ds:_VfBTSStarted[eax*4], ecx
  22. PAGEVRFY:007DC754                 jnz     short loc_7DC73B
  23. PAGEVRFY:007DC756                 mov     eax, ds:_VfBTSProcessorFamily
  24. PAGEVRFY:007DC75B                 cmp     eax, 0Fh
  25. PAGEVRFY:007DC75E                 jnz     short loc_7DC765
  26. PAGEVRFY:007DC760                 push    ecx
  27. PAGEVRFY:007DC761                 push    0Ch
  28. PAGEVRFY:007DC763                 jmp     short loc_7DC770
  29. PAGEVRFY:007DC765 ; ---------------------------------------------------------------------------
  30. PAGEVRFY:007DC765
  31. PAGEVRFY:007DC765 loc_7DC765:                             ; CODE XREF: VfStartBranchTracing()+42j
  32. PAGEVRFY:007DC765                 cmp     eax, 6
  33. PAGEVRFY:007DC768                 jnz     short loc_7DC77A
  34. PAGEVRFY:007DC76A                 push    ecx
  35. PAGEVRFY:007DC76B                 push    0C0h
  36. PAGEVRFY:007DC770
  37. PAGEVRFY:007DC770 loc_7DC770:                             ; CODE XREF: VfStartBranchTracing()+47j
  38. PAGEVRFY:007DC770                 push    1D9h
  39. PAGEVRFY:007DC775                 call    _WRMSR@12       ; WRMSR(x,x,x)
  40. PAGEVRFY:007DC77A
  41. PAGEVRFY:007DC77A loc_7DC77A:                             ; CODE XREF: VfStartBranchTracing()+4Cj
  42. PAGEVRFY:007DC77A                 mov     eax, large fs:20h
  43. PAGEVRFY:007DC780                 mov     eax, [eax+3CCh]
  44. PAGEVRFY:007DC786                 mov     ds:_VfBTSStarted[eax*4], 1
  45. PAGEVRFY:007DC791                 xor     eax, eax
  46. PAGEVRFY:007DC793                 retn
  47. PAGEVRFY:007DC794 ; ---------------------------------------------------------------------------
  48. PAGEVRFY:007DC794
  49. PAGEVRFY:007DC794 loc_7DC794:                             ; CODE XREF: VfStartBranchTracing()+Aj
  50. PAGEVRFY:007DC794                                         ; VfStartBranchTracing()+13j
  51. PAGEVRFY:007DC794                 mov     eax, 0C0000002h
  52. PAGEVRFY:007DC799                 retn
  53. PAGEVRFY:007DC799 _VfStartBranchTracing@0 endp


Может как то и можно через это из юм заюзать bt, ссылок много на функу, но должен быть запущен верифер.

--> Link <--

-----
vx





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 04 июня 2017 22:50
· Личное сообщение · #27

никто не мешает, но ring3 дебаггер не подразумевает драйверов
а так бы да, я бы мог дернуть и драйвер МС с windbg

по ссылке выше tb это да, его же и исследовал выше по ссылкам, но как к нему добраться на x64 в ring3 без дров, загадка




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

Создано: 04 июня 2017 23:18
· Личное сообщение · #28

Я мельком глянул, KiSaveProcessorControlState <- ExpSystemErrorHandler <- ExpRaiseHardError вызвать(NtRaiseHardError) с подходящими аргументами.

-----
vx




Ранг: 145.8 (ветеран), 191thx
Активность: 0.140.36
Статус: Участник

Создано: 05 июня 2017 14:11
· Личное сообщение · #29

reversecode пишет:
а так бы да, я бы мог дернуть и драйвер МС с windbg

А там нечего дергать. Этот драйвер просто врапер KdSystemDebugControl.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 05 июня 2017 18:13
· Личное сообщение · #30

хм
полез в 64 битное ядро, таки да
доступ к msr присутсвует
Code:
  1.     {
  2.       if ( (_DWORD)a3 != 16 )
  3.         return 3221225476i64;
  4.       v15 = KdpSysReadMsr(*(_DWORD *)a2, a2 + 1);
  5.       goto LABEL_90;
  6.     }
  7.     v20 = v19 - 1;
  8.     if ( !v20 )
  9.     {
  10.       if ( (_DWORD)a3 != 16 )
  11.         return 0xC0000004i64;
  12.       v15 = KdpSysWriteMsr(*(_DWORD *)a2, (unsigned int *)a2 + 2);
  13.       goto LABEL_90;

так что если что, можно пытаться через nt dll вскочить, если там нет заглушек в ring3




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

Создано: 05 июня 2017 19:07
· Личное сообщение · #31

reversecode

Может и можно, через извраты:

> это все хаки, сиеровский тоже умеет
> хочется хардварно через мср



-----
vx



<< . 1 . 2 . 3 . 4 . 5 . 6 . >>
 eXeL@B —› Оффтоп —› syser - а он еще нужен?

У вас должно быть 20 пунктов ранга, чтобы оставлять сообщения в этом подфоруме, но у вас только 0

   Для печати Для печати