|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Янв 27, 2004 00:19:24 Объясните пожалуйста, почему Ицзелион после выхода из SEHHandler не делает коррекцию стека и почему SEHHandler объявляется как:SEHHandler proc C ?? http://www.wasm.ru/article.php?article=1002006 |
|
|
Дата: Янв 27, 2004 01:02:15 · Поправил: volodya Туплю :) Программу пробовал запускать? |
|
|
Дата: Янв 27, 2004 01:23:51 Какую, Ицзелионову? Просто я смотрю как поставлен SEH у Four-F, потом смотрю у Ицзелиона и уже ни во что не врубаюсь, короче сомневаюсь я, хотя на основе Ицзелионова варианта я написал процедуру, которая вроде работает, но... не знаю... |
|
|
Дата: Янв 27, 2004 01:27:21 Вот собственно она:
GetAddressOfVAForCurrentApiInIAT PROTO :DWORD, :DWORD, :DWORD
SEH struct
PrevLink dd ? ; the address of the previous seh structure
CurrentHandler dd ? ; the address of the new exception handler
SafeOffset dd ? ; the offset where it's safe to continue execution
PrevEsp dd ? ; the old value in esp
PrevEbp dd ? ; the old value in ebp
SEH ends
.CODE
GetAddressOfVAForCurrentApiInIAT proc uses edi BaseOfImage:DWORD, lpszNameOfDll:DWORD, lpszNameOfApi:DWORD
LOCAL ValidPE:BOOL
LOCAL seh:SEH
LOCAL VAOfApi:DWORD
and ValidPE, FALSE ; обнуляем локальную переменную ValidPE
assume fs:nothing
push fs:[0]
pop seh.PrevLink
mov seh.CurrentHandler, OFFSET SEHHandler
mov seh.SafeOffset, OFFSET @FinalExit
lea eax, seh
mov fs:[0], eax
assume fs:error
mov seh.PrevEsp, esp
mov seh.PrevEbp, ebp
mov edi, BaseOfImage
assume edi:ptr IMAGE_DOS_HEADER
.IF [edi].e_magic == IMAGE_DOS_SIGNATURE
add edi, [edi].e_lfanew
assume edi:ptr IMAGE_NT_HEADERS
.IF [edi].Signature == IMAGE_NT_SIGNATURE
inc ValidPE ; mov ValidPE, TRUE
.ENDIF
.ENDIF
@FinalExit:
push seh.PrevLink
assume fs:nothing
pop fs:[0]
assume fs:error
cmp ValidPE, FALSE
je @not_found
assume edi:ptr IMAGE_NT_HEADERS
mov edi, [edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
add edi, BaseOfImage
assume edi:ptr IMAGE_IMPORT_DESCRIPTOR
@loop1:
mov eax, [edi].Name1
test eax, eax
jz @not_found
add eax, BaseOfImage
invoke lstrcmpi, lpszNameOfDll, eax
test eax, eax
jz @F
add edi, sizeof IMAGE_IMPORT_DESCRIPTOR
jmp @loop1
@@:
invoke GetModuleHandle, lpszNameOfDll
invoke GetProcAddress, eax, lpszNameOfApi
mov VAOfApi, eax
mov edi, [edi].FirstThunk
assume edi:nothing
add edi, BaseOfImage
@loop2:
mov eax, DWORD PTR [edi]
test eax, eax
jz @not_found
cmp VAOfApi, eax
je @found
add edi, 004h
jmp @loop2
@found:
mov eax, edi
ret
@not_found:
xor eax, eax
ret
GetAddressOfVAForCurrentApiInIAT endp
SEHHandler proc C uses edx pExcept:DWORD, pFrame:DWORD, pContext:DWORD, pDispatch:DWORD
mov edx, pFrame
assume edx:ptr SEH
mov eax, pContext
assume eax:ptr CONTEXT
push [edx].SafeOffset
pop [eax].regEip
push [edx].PrevEsp
pop [eax].regEsp
push [edx].PrevEbp
pop [eax].regEbp
mov eax, ExceptionContinueExecution
ret
SEHHandler endp |
|
|
Дата: Янв 27, 2004 02:18:58 Кажется когда объявляется процедура как SEHHandler proc C внутри неё нет коррекции стека как в stdcall, тогда, по идее эта корекция должна делаться после выхода.. но... её нету, может и не нужно тогда? |
|
|
Дата: Янв 27, 2004 02:28:48 · Поправил: Quantum Asterix Хмм... Вот SEH из кода, который я использую для "безопасного" доступа к LPT: ALIGN DWORD SEH_Filter PROC pExPtrs:DWORD mov edx,pExPtrs mov edx,(EXCEPTION_POINTERS PTR [edx]).pExceptionRecord xor eax,eax ; EXCEPTION_CONTINUE_SEARCH cmp (EXCEPTION_RECORD PTR [edx]).ExceptionCode,EXCEPTION_PRIV_INSTRUCTION jne @F mov edx,pExPtrs mov edx,(EXCEPTION_POINTERS PTR [edx]).ContextRecord inc (CONTEXT PTR [edx]).regEip ; skip error inc bPrivException ; set error flag dec eax ; EXCEPTION_CONTINUE_EXECUTION @@: ret SEH_Filter ENDPТакое у меня работает и стек при этом не страдает... Может Iczelion просто допустил опечатку :-) |
|
|
Дата: Янв 27, 2004 03:13:22 Вряд ли у него опечатка сразу в нескольких туторах, просто я не могу точно себе объяснить что и почему, хотя и догадываюсь ;-) |
|
|
Дата: Янв 27, 2004 03:19:39 Asterix А ты заметил, что в самом туториале этой "C" нет? ;-) |
|
|
Дата: Янв 27, 2004 03:28:04 Гы... Aquila потерял при переводе :-))) В исходнике она есть! |
|
|
Дата: Янв 27, 2004 12:22:15 > Кажется когда объявляется процедура как SEHHandler proc > C внутри неё нет коррекции стека как в stdcall, тогда, > по идее эта корекция должна делаться после выхода.. > но... её нету, может и не нужно тогда Коррекция есть, в ntdll :) |
|
|
Дата: Янв 27, 2004 13:18:24 Dr.Golova А в 9х? ;-) |
|
|
Дата: Янв 27, 2004 13:42:20 Asterix Гы... Aquila потерял при переводе :-))) Исходники при переводе я не трогал ;). |
|
|
Дата: Янв 28, 2004 14:42:18 А в 9х? ;-) Там будет синий экран |
|
|
Дата: Янв 28, 2004 15:11:47 Правка А я тоже не заметил соглашения у SEHProc, писал по умолчанию (stdcall) - «и ничего»… Пока работает. Или мне сильно повезло? |
|
|
Дата: Янв 29, 2004 10:52:39 · Поправил: je_ значить для программы это НЕ-stdcall. усё тебе повезло, так как win сразу восстанавливает esp из ebp |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.233 |