Сейчас на форуме: -Sanchez-, barsik, vasilevradislav, vsv1, padad42664, kris_sexy (+6 невидимых)

 eXeL@B —› Крэки, обсуждения —› наткнулся на интересный глюк windows XP(sp2)
Посл.ответ Сообщение

Ранг: 24.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 сентября 2007 12:10 · Поправил: Xserg
· Личное сообщение · #1

Писал защиту для своей проги, сделал ошибку,
И наткнулся на интересный глюк windows.

Исходный код для ХР
.586
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\w2k\ntdll.inc
includelib \masm32\lib\w2k\ntdll.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib

ThreadHideFromDebugger equ 17
.data
isDebug db ?
Npass db ?
TestStop db ?
hThread dd ?
USER32 db 'User32.dll',0
MBTA db 'MessageBoxTimeoutA',0
tTestg db ' Test',0
tTestb db ' Test',0
wdebug db 'with debug',0
ndebug db 'no debug',0

assume fs:nothing
.code
;+++++++++++++++++++++
Check_SEH:
.if Npass==0
xor eax,eax
inc Npass
int 3 ; 0cch in SEH +1 ntdll.Exception
.elseif Npass==1
inc Npass
invoke GetModuleHandle,offset USER32
invoke GetProcAddress,eax,offset MBTA
;Будем хакать M$ windows
std ; <====== set D flag
push 1 ;msec
push 0
push 0
push offset tTestg
push offset tTestb
push 0
call EAX ;MessageBoxTimeoutA
cld ;<------------ Debugger Present
mov TestStop,-1
invoke ExitThread,0 ;<- Выход из потока
dec Npass
mov eax,-1
.elseif Npass==2
cld ;<------------ no Debugger
mov isDebug,-1
mov TestStop,-1
invoke ExitThread,0 ;<- Выход из потока
.endif
ret
;+++++++++++++++++++++
;-------------------------------------------
; Start Thread
Thread proc
mov isDebug,0
push offset Check_SEH
push fs:[0]
mov fs:[0],esp
mov Npass,0
db 0ffh,0ffh,0ffh,0ffh
Thread endp
;-------------------------------------------

start:
mov TestStop,0
invoke CreateThread,0,4000h,offset Thread,0,NORMAL_PRIORITY_CLASS,offset hThread
_Wait:
invoke Sleep,10
cmp TestStop,0
jz _Wait

.if isDebug==-1
invoke MessageBoxA,0,offset ndebug,offset tTestg,0
.else
invoke MessageBoxA,0,offset wdebug,offset tTestb,0
.endif
invoke TerminateProcess,-1,0
invoke ZwSetInformationThread,-2,ThreadHideFromDebugger,0,0
end start

Поспрашивал гугл, он похоже не читал про это.

Под моей системой (sp2), работает как часы.
Кто ни будь знает в чем прикол?
Почему под отладчиком управление не передается на SEH?


<img src="img/attach.gif"> <SCRIPT type=text/javascript>dfl("files/","f579_14.09.2007_CRACKLAB.rU.tgz");< /SCRIPT> - anti._exe



Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2007 14:36
· Личное сообщение · #2

Потому что отладчик сам обрабатывает исключение или вовсе его пропускает.



Ранг: 24.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 сентября 2007 15:24
· Личное сообщение · #3

bad_boy пишет:
Потому что отладчик сам обрабатывает исключение

Нет отладчик я запускаю по Shift-F9, значит контекст отлаживаемого процесса не меняется.

И если поменять
; push 1
; push 0
; push 0
; push offset tTestg
; push offset tTestb
; push 0
; call EAX ;MessageBoxTimeoutA
на
xor ebx,ebx
div ebx

то все работает как обычно, т.е. управление передается на SEH



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

Создано: 15 сентября 2007 00:34
· Личное сообщение · #4

Xserg

Замени int 1 на типа db 0F1h помоему - короче неверный код операции. И протестируй заново.



Ранг: 38.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 сентября 2007 05:52
· Личное сообщение · #5

F1 это и есть int 1



Ранг: 24.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 15 сентября 2007 06:53
· Личное сообщение · #6

Vadim Sergeevich пишет:
Замени int 1 на типа db 0F1h помоему - короче неверный код операции. И протестируй заново

Меня данный код интересует в качестве детектора отладчика.

Я его немного поизучал.

Система определяет критическую ошибку, и из кольца ring0 пытается сообщить об этом отладчику (она то знает что он есть). Если отладчик игнорирует, система сама завершает (в данном случае MessageBoxTimeoutA), и программа выполняется со следующей инструкции.
Без отладчика обработку ошибки система доверяет SEH.



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 15 сентября 2007 07:28
· Личное сообщение · #7

Фильтр исключений в дебаггере настрой правильно... И int 1 имеет опкод CD 01, F1 обычно называют icebp.



Ранг: 24.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 15 сентября 2007 07:48 · Поправил: Xserg
· Личное сообщение · #8

Поправил (Убрал Int1) сути вопроса не меняет:
Кто ни будь знает в чем прикол?
Почему под отладчиком управление не передается на SEH?

Или хотя бы потестите на ваших системах.
Программа специально написана для удобства отладки в OllyDbg
slil.ru/24857999
ps если пытаться отлаживать с ФантОм, вообще управление никуда не передается.




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

Создано: 15 сентября 2007 10:55 · Поправил: Hellspawn
· Личное сообщение · #9

хз чё у тя, у мну так:

(мой миниотладчик)

[Exception] Illegal Instruction
[Address] 004010AA
[dwThreadId]00000654
-----------------------
[Exception] Access Violation
[Address] 77F1A159
[dwThreadId]00000654

под ольгой также... (no debug)

з.ы. хватит кодить незнамо что)

-----
[nice coder and reverser]




Ранг: 24.9 (новичок)
Активность: 0.010
Статус: Участник

Создано: 15 сентября 2007 15:28
· Личное сообщение · #10

Hellspawn пишет:
з.ы. хватит кодить незнамо что)

Хотим лишить, меня развлечения?
Микроконтроллеры уже достали.

Тема закрыта буду добиваться, стабильности.


 eXeL@B —› Крэки, обсуждения —› наткнулся на интересный глюк windows XP(sp2)
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати