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

 eXeL@B —› Программирование —› Int 0x2B -> .. ?
Посл.ответ Сообщение

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

Создано: 22 марта 2010 02:29
· Личное сообщение · #1

Здрасте.
Интересный теоретический вопрос . Есть такой код:

Куда будет передано управление при вызове прерывания(это KiCallbackReturn) ?
Никакая память не изменена, исключений также не будет.
(Тут экзешник openfile.ru/554658/)



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

Создано: 22 марта 2010 09:18
· Личное сообщение · #2

Не знаю почему, но я попадаю сюда:
это comctl32

Code:
  1. 773C4261    A1 9C154577     MOV EAX,DWORD PTR DS:[7745159C]
  2. 773C4266    85C0            TEST EAX,EAX
  3. 773C4268    56              PUSH ESI
  4. 773C4269    8B35 5C103C77   MOV ESI,DWORD PTR DS:[<&GDI32.DeleteDC>]     ; GDI32.DeleteDC
  5. 773C426F    74 03           JE SHORT comctl32.773C4274
  6. 773C4271    50              PUSH EAX
  7. 773C4272    FFD6            CALL ESI
  8. 773C4274    A1 A0154577     MOV EAX,DWORD PTR DS:[774515A0]
  9. 773C4279    85C0            TEST EAX,EAX
  10. 773C427B    74 03           JE SHORT comctl32.773C4280
  11. 773C427D    50              PUSH EAX
  12. 773C427E    FFD6            CALL ESI
  13. 773C4280    8325 A0154577 0>AND DWORD PTR DS:[774515A0],0
  14. 773C4287    8325 9C154577 0>AND DWORD PTR DS:[7745159C],0
  15. 773C428E    E8 B1FEFFFF     CALL comctl32.773C4144
  16. 773C4293    8325 74154577 0>AND DWORD PTR DS:[77451574],0
  17. 773C429A    68 78154577     PUSH comctl32.77451578
  18. 773C429F    FF15 18123C77   CALL DWORD PTR DS:[<&KERNEL32.DeleteCritical>; ntdll.RtlDeleteCriticalSection
  19. 773C42A5    E8 D6690800     CALL comctl32.7744AC80
  20. 773C42AA    5E              POP ESI
  21. 773C42AB    C2 0400         RETN 4
  22.  

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

-----
Надежда - есть худшее из зол, ибо она продлевает наши страдания.© Ф. Ницше





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 22 марта 2010 10:28
· Личное сообщение · #3

Clerk пишет:
Куда будет передано управление при вызове прерывания

>00401035
всё начинается с адресса
>00401033 обработка прерывания и нас выкидывает в 00401016

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 22 марта 2010 16:44 · Поправил: mak
· Личное сообщение · #4

а куда нужно попасть ? Трюки с 2б , 2с , 2е весьма распостранены среди писателей малвари

Code:
  1. 7E37A740   8BFF             MOV EDI,EDI
  2. 7E37A742   55               PUSH EBP
  3. 7E37A743   8BEC             MOV EBP,ESP
  4. 7E37A745   83EC 0C          SUB ESP,0C
  5. 7E37A748   8B45 08          MOV EAX,DWORD PTR SS:[EBP+8]
  6. 7E37A74B   FF70 18          PUSH DWORD PTR DS:[EAX+18]
  7. 7E37A74E   8365 F8 00       AND DWORD PTR SS:[EBP-8],0
  8. 7E37A752   8365 FC 00       AND DWORD PTR SS:[EBP-4],0
  9. 7E37A756   8D48 08          LEA ECX,DWORD PTR DS:[EAX+8]
  10. 7E37A759   51               PUSH ECX
  11. 7E37A75A   FF70 04          PUSH DWORD PTR DS:[EAX+4]
  12. 7E37A75D   FF30             PUSH DWORD PTR DS:[EAX]
  13. 7E37A75F   FF50 1C          CALL DWORD PTR DS:[EAX+1C] ; cb.00401021
  14.  


Code:
  1. 00401021  |. 8B6424 10      MOV ESP,DWORD PTR SS:[ESP+10]
  2. 00401025  |. 61             POPAD
  3. 00401026  \. C3             RETN
  4.  


после

Code:
  1. 0040104A   . 50             PUSH EAX
  2. 0040104B   . 50             PUSH EAX
  3. 0040104C   . 50             PUSH EAX
  4. 0040104D   . 8BCC           MOV ECX,ESP
  5. 0040104F   . CD 2B          INT 2B
  6.  


попадаем на

Code:
  1. 00401035   . 33C0           XOR EAX,EAX
  2. 00401037   . 8BE7           MOV ESP,EDI
  3. 00401039   . FFE6           JMP ESI


точнее на
Code:
  1. 00401037   . 8BE7           MOV ESP,EDI
  2. 00401039   . FFE6           JMP ESI


так как после 2е одна команда выполняется в пролете

; NTSTATUS
; NtCallbackReturn (
; IN PVOID OutputBuffer OPTIONAL,
; IN ULONG OutputLength,
; IN NTSTATUS Status
; )

Routine Description:
This function returns from a user mode callout to the kernel mode caller of the user mode callback function.

2B отвечает за возврат из прерывания , многое зависит от сервис пака в котором идет отладка в оледбг. Своеобразный метод перехода из ринг3 в ринг0 , можно много чего еще придумать. Типо подменять адрес возврата или чтонить в этом роде ...

После еси идем на
Code:
  1. 00401053   . 90             NOP
  2. 00401054   . 90             NOP
  3. 00401055   . 90             NOP
  4.  


Когда переходим по инт 2е можно увидеть вот такую вещь
Code:
  1. 7C91E453   33C9             XOR ECX,ECX
  2. 7C91E455   33D2             XOR EDX,EDX
  3. 7C91E457   CD 2B            INT 2B
  4. 7C91E459   CC               INT3
  5.  


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




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

Создано: 22 марта 2010 17:36
· Личное сообщение · #5

mak
До кода по адресу 0x401043 выполняется инициализация, собственно интересует прерывание. Для этого на скрине контекст показан. Состояние контекста и стека для кода 0x401007 и 0x401016 одинаково. Вот как определить адрес куда выполнится переход по Int 0x2B.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 22 марта 2010 19:04
· Личное сообщение · #6

А понятно ..... хз , нужно поковырятся в сторону KeUsermodeCallback и KiUserCallbackDispatcher, вроде возврат идет туда из Int 0x2B и потом все как обычно ... буду дома посмотрю

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




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

Создано: 22 марта 2010 21:12 · Поправил: Clerk
· Личное сообщение · #7

mak
Code:
  1. Сохранение и восстановление контекста.
  2.  
  3. QUERY_SERVICE_ID macro
  4.          mov eax,dword ptr [_imp__EnumDisplayMonitors]
  5.          mov eax,dword ptr [eax + 1]        ; ID NtUserEnumDisplayMonitors
  6. endm
  7.  
  8. ; +
  9. ; Сохранение контекста.
  10. ; o User32.dll инициализирована.
  11. ; o Eax: адрес возврата при восстановлении контекста.
  12. ; o Сохраняются регистры:
  13. ; - EFlags
  14. ; - Ebp
  15. ; - Ebx
  16. ; - Esp
  17. ; o NPX не сохраняется.
  18. ;
  19. SAVE_TASK_STATE macro
  20.          mov esi,eax
  21.          mov edi,esp
  22.          Call @f
  23.          jmp Break
  24. @@:      
  25.          pushad
  26.          xor ecx,ecx
  27.          push esp
  28.          Call @f
  29.          mov esp,dword ptr [esp + 4*4]
  30.          popad
  31.          ret
  32. @@:
  33.          push ecx
  34.          push ecx
  35.          QUERY_SERVICE_ID
  36.          mov edx,esp
  37.          Int 2EH
  38.          xor eax,eax
  39.          mov esp,edi
  40.          jmp esi
  41. Break:
  42. endm
  43.  
  44. ; +
  45. ; Восстановление контекста.
  46. ;
  47. RESTORE_TASK_STATE macro
  48.          xor eax,eax
  49.          mov edx,3*4
  50.          push eax
  51.          push eax
  52.          push eax
  53.          mov ecx,esp
  54.          Int 2BH
  55. endm

Тот код такой:
Code:
  1. Entry proc
  2.          invoke MessageBeep, 0
  3.          lea eax,offset cbRet
  4.          SAVE_TASK_STATE
  5.          xor ebx,ebx
  6.          xor esi,esi
  7.          xor edi,edi
  8.          xor ebp,ebp
  9.          RESTORE_TASK_STATE
  10.          int 3
  11.          int 3
  12. cbRet:
  13.          nop
  14.          nop
  15.          nop
  16.          ret
  17. Entry endp





Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 23 марта 2010 13:30 · Поправил: mak
· Личное сообщение · #8

я так понял что ты используешь промежуточный выход в усермод при вызове определенного сервиса , когда случается Int 2EH , контекст должен сохраниться , когда же мы вернемся из прерывания то мы должны оказаться там где были , то есть после инт 2е

Code:
  1. 7C90EAD0 ntdll.KiUserCallbackDispatcher   83C4 04     ADD ESP,4
  2. 7C90EAD3                                             5A                            POP EDX
  3. 7C90EAD4                                             64:A1 18000000                MOV EAX,DWORD PTR FS:[18] ; eax=TEB
  4. 7C90EADA                                             8B40 30                       MOV EAX,DWORD PTR DS:[EAX+30]; EAX=PEB
  5. 7C90EADD                                             8B40 2C                       MOV EAX,DWORD PTR DS:[EAX+2C]; EAX=KernelCallbackTable
  6. 7C90EAE0                                             FF1490                        CALL DWORD PTR DS:[EAX+EDX*4]; call dword ptr KernelCallbackTable[edx*4]
  7. 7C90EAE3                                             33C9                          XOR ECX,ECX
  8. 7C90EAE5                                             33D2                          XOR EDX,EDX
  9. 7C90EAE7                                             CD 2B                         INT 2B ;!idt -a -> 2b:80540d20 nt!KiCallbackReturn
  10. 7C90EAE9                                             CC                            INT3


Тут вызовется CALL DWORD PTR DS:[EAX+EDX*4] ; __ClientMonitorEnumProc

Весь ее код
Code:
  1. 7C90EAD3                                             5A                            POP EDX
  2. 7C90EAD4                                             64:A1 18000000                MOV EAX,DWORD PTR FS:[18]
  3. 7C90EADA                                             8B40 30                       MOV EAX,DWORD PTR DS:[EAX+30]
  4. 7C90EADD                                             8B40 2C                       MOV EAX,DWORD PTR DS:[EAX+2C]
  5. 7C90EAE0                                             FF1490                        CALL DWORD PTR DS:[EAX+EDX*4]
  6. 7C90EAE3                                             33C9                          XOR ECX,ECX
  7. 7C90EAE5                                             33D2                          XOR EDX,EDX
  8. 7C90EAE7                                             CD 2B                         INT 2B
  9. 7C90EAE9                                             CC                            INT3
  10.  


После INT 2B в

Code:
  1. 7C90EAE3                                             33C9                          XOR ECX,ECX
  2. 7C90EAE5                                             33D2                          XOR EDX,EDX
  3. 7C90EAE7                                             CD 2B                         INT 2B
  4. 7C90EAE9                                             CC                            INT3


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

После этого идем на KeUsermodeCallback , где получаем адрес стека в Р3 из сохраненного контекста р3, в KTRAP_FRAME структуре нашего потока.

Получается всю информацию по возврату нужно искать где то в сохранном контексте , или же может что то типа Interrupt Stack Table , с которой я не имел дела

Ни у кого больше мнений нет ?!

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




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

Создано: 23 марта 2010 17:39 · Поправил: Clerk
· Личное сообщение · #9

mak
Верно, при вызове теневого калбэка трап-фрейм сохраняется, существует стек калбэков. При возврате в ядро трап-фрейм восстанавливается, в частности флажки, что позволяет сбросить TF. Тут юзермодный код перечисляющий фреймы в стеке и выводящий Ip каждого фрейма(в блоге это описал):
http://indy-vx.narod.ru/Bin/Callout.zip

Без доступа к ядерной памяти нельзя определить куда будет выполнен возврат



Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 25 марта 2010 13:37
· Личное сообщение · #10

Clerk
Сделал бы сайт себе, было бы что почитать.

-----
продавец резиновых утёнков




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

Создано: 25 марта 2010 18:32
· Личное сообщение · #11

Так как мнений ни у кого больше нет, закрою ветку.


 eXeL@B —› Программирование —› Int 0x2B -> .. ?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати