Сейчас на форуме: vsv1, _MBK_ (+3 невидимых)

 eXeL@B —› Вопросы новичков —› проверка PE-файла на валидность
Посл.ответ Сообщение

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

Создано: 23 октября 2007 22:54 · Поправил: Necromancer13
· Личное сообщение · #1

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

вот исходник:

format PE GUI 4.0
entry start
include '%fasminc%\win32a.inc'
include '%fasminc%\macro\masm.inc'
struct SEH
PrevLink dd ?
CurrentHandler dd ?
SafeOffset dd ?
PrevEsp dd ?
PrevEbp dd ?
ends

struct FLOATING_SAVE_AREA
ControlWord dd ?
StatusWord dd ?
TagWord dd ?
ErrorOffset dd ?
ErrorSelector dd ?
DataOffset dd ?
DataSelector dd ?
RegisterArea rb SIZE_OF_80387_REGISTERS
Cr0NpxStatedd dd ?
ends

struct CONTEXT
ContextFlags dd ?
Dr0 dd ?
Dr1 dd ?
Dr2 dd ?
Dr3 dd ?
Dr6 dd ?
Dr7 dd ?
FloatSave FLOATING_SAVE_AREA
SegGs dd ?
SegFs dd ?
SegEs dd ?
SegDs dd ?
Edi dd ?
Esi dd ?
Ebx dd ?
Edx dd ?
Ecx dd ?
Eax dd ?
Ebp dd ?
Eip dd ?
SegCs dd ?
EFlags dd ?
Esp dd ?
SegSs dd ?
MAXIMUM_SUPPORTED_EXTENSION = 1 ; Because I have not this constant defined anywhere. You obviously have to solve this in another way
ExtendedRegisters rb MAXIMUM_SUPPORTED_EXTENSION
ends

SIZE_OF_80387_REGISTERS = 80
IDD_DLG1 = 1
MAXSIZE = 512
ButtonID = 3
section '.data' data readable writeable
hInstance dd ?
CommandLine dd ?
ofn OPENFILENAME
FilterString db 'EXE-files (*.exe), DLL-files (*.dll)',0,'*.exe;*.dll',0
db 'All Files (*.*)',0,'*.*',0,0
buffer rb MAXSIZE
hFileRead dd ?
hMapFile dd ?
pMemory dd ?
seh SEH
section '.code' code readable writeable executable
start:
invoke GetModuleHandle,0
mov [hInstance],eax
invoke GetCommandLine
mov [CommandLine],eax
invoke DialogBoxParam,[hInstance],IDD_DLG1,HWND_DESKTOP,DlgProc,0
invoke ExitProcess,eax

proc DlgProc hWnd,uMsg,wParam,lParam
cmp [uMsg],WM_INITDIALOG
jz .initdialog
cmp [uMsg],WM_CLOSE
jz .wmclose
cmp [uMsg],WM_COMMAND
jz .wmcommand
mov eax,FALSE
ret
.initdialog:
mov [ofn.lStructSize],sizeof.OPENFILENAME
push [hWnd]
pop [ofn.hwndOwner]
push [hInstance]
pop [ofn.hInstance]
mov [ofn.lpstrFilter],FilterString
mov [ofn.lpstrFile],buffer
mov [ofn.nMaxFile],MAXSIZE
jmp _finish
.wmclose:
cmp [hMapFile],0
je @f
call CloseMapFile
@@:
invoke EndDialog,[hWnd],0
jmp _finish
.wmcommand:
mov eax,[wParam]
mov edx,eax
shr edx,16
cmp dx,BN_CLICKED
jne _finish
cmp ax,ButtonID
jne _finish
mov [ofn.Flags],OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
invoke GetOpenFileName,ofn
cmp eax,TRUE
jne _finish
invoke CreateFile,buffer,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_AT TRIBUTE_NORMAL,0
test eax,eax
je _erroropen
mov [hFileRead],eax
invoke CreateFileMapping,[hFileRead],0,PAGE_READONLY,0,0,0
test eax,eax
je _errormap
mov [hMapFile],eax

;=======================================
;=======================================
call CheckFile
FinalExit:
test ecx,ecx
jne @next
jmp @f
ValidText db 'It''s a valid PE file!',0
AppName db 'PE View',0
@@:
invoke MessageBox,HWND_DESKTOP,ValidText,AppName,MB_ICONINFORMATION
push [seh.PrevLink]
pop dword[fs:0]
invoke UnmapViewOfFile,[pMemory]
invoke CloseHandle,[pMemory]
invoke CloseHandle,[hMapFile]
jmp _finish
@next:
push [seh.PrevLink]
pop dword[fs:0]
invoke UnmapViewOfFile,[pMemory]
jmp @f
InvalidText db 'It''s not a valid PE file!',0
@@:
invoke MessageBox,HWND_DESKTOP,InvalidText,AppName,MB_ICONERROR
push [seh.PrevLink]
pop dword[fs:0]
invoke UnmapViewOfFile,[pMemory]
invoke CloseHandle,[pMemory]
invoke CloseHandle,[hMapFile]
jmp _finish
;=======================================
;=======================================
_finish:
mov eax,TRUE
ret
errop db 'Can not open file for reading',0
errmp db 'Can not map file',0

_erroropen:
invoke MessageBox,HWND_DESKTOP,errop,AppName,MB_ICONERROR
jmp _finish
_errormap:
invoke MessageBox,HWND_DESKTOP,errmp,AppName,MB_ICONERROR
jmp _finish
endp

proc CloseMapFile
invoke CloseHandle,[hMapFile]
mov [hMapFile],0
invoke CloseHandle,[hFileRead]
ret
endp

proc CheckFile
invoke MapViewOfFile,[hMapFile],FILE_MAP_READ,0,0,0
test eax,eax
je _mappingerror
mov [pMemory],eax
push dword[fs:0]
pop [seh.PrevLink]
mov [seh.CurrentHandler],SEHHandler
mov [seh.SafeOffset],FinalExit
mov eax,seh
mov [fs:0],eax
mov [seh.PrevEsp],esp
mov [seh.PrevEbp],ebp
mov edi,[pMemory]
cmp word[edi],'MZ'
jne .notmz
add edi,dword[edi+3Ch]
cmp dword[edi],00004550h
je _valid
xor ecx,ecx
inc ecx
ret
.notmz:
jmp @f
NotMZ db 'MZ-signature is not found!',0
@@:
invoke MessageBox,HWND_DESKTOP,NotMZ,AppName,MB_ICONERROR
xor ecx,ecx
inc ecx
ret
_mappingerror:
jmp @f
MappingError db 'Can not map file into memory!',0
@@:
invoke MessageBox,HWND_DESKTOP,MappingError,AppName,MB_ICONERROR
xor ecx,ecx
inc ecx
ret
_valid:
xor ecx,ecx
ret
endp

proc SEHHandler pExcept,pFrame,pContext,pDispatch
push edx
mov edx,[pFrame]
assume edx:SEH
mov eax,[pContext]
assume eax:CONTEXT
push [edx.SafeOffset]
pop [eax.Eip]
push [edx.PrevEsp]
pop [eax.Esp]
push [edx.PrevEbp]
pop [eax.Ebp]
xor ecx,ecx
inc ecx
pop edx
ret
endp

section '.idata' import data readable writeable
library user32,'user32.dll',\
kernel32,'kernel32.dll',\
comdlg32,'comdlg32.dll'
include '%fasminc%\api\user32.inc'
include '%fasminc%\api\kernel32.inc'
include '%fasminc%\api\comdlg32.inc'
section '.rsrc' resource from 'PEView.res' data readable



вот RC-файл:


#define IDD_DLG1 1
#define IDC_GRP1 2
#define IDC_BTN1 3
IDD_DLG1 DIALOGEX 150,88,192,118
CAPTION "PE View"
FONT 10,"Comic Sans MS",400,0,204
STYLE 0x10CA0000
BEGIN
CONTROL "PE VIEW",IDC_GRP1,"Button",0x50000007,0,0,192,119
CONTROL "Open File",IDC_BTN1,"Button",0x50012F00,10,41,168,27
END


заранее огромное спасибо...

если при проверке правильного PE-файла, то все ок, а если проверить файл неправильный....
прога "вылетает"...




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 24 октября 2007 06:43
· Личное сообщение · #2

бряк на push EDX в SEHHandler и смотри че у тебя там за косяк..

з.ы. выделяй код следующий раз

-----
invoke OpenFire




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

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

вот как раз в том и странность, что прога не попадает в SEHHandler!




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 24 октября 2007 09:51
· Личное сообщение · #4

это не странность, это ошибка в установке SEH'a или део вообще не в нем.. проверять твой код врядли кто очень захочет, так что посмотри структуру (или в фасме она стандартна?) и поглади на код внимательне.. установи СЕХ, потом просто подели на ноль и потрейси.. вот на всякий случай пример нормальной структуры:

SEH struct ; начало описания структуры
pPrevSEH dd ? ; адрес предыдущей структуры SEH
pHandler dd ? ; адрес собственного обработчика исключения
pSafeOffset dd ? ; адрес, с которого продолжится выполнение после
dPrevEsp dd ? ; старое значение в ESP
dPrevEbp dd ? ; старое значение в EBP
SEH ends ; конец описания



и соответственно его установка:

; --------------------установка нового обработчика исключений--------------------------------------
assume FS:nothing ;fs необходимо отвязать
push FS:[0] ;запишем в стек адрес предыдущего обработчика
pop seh.pPrevSEH ;выдернем в структуру
mov seh.pHandler,offset fHandler ;адрес обработчика в струтуру
mov seh.pSafeOffset,offset lFin ;адрес "безопасного места"
lea EAX, seh ; в EAX адрес нашей SEH структуры
mov FS:[0], EAX ;чтобы она вступила в силу надо поместить ее в цепочку
mov seh.dPrevEsp, ESP ;и сохраним в ней старые значения
mov seh.dPrevEbp, EBP ;ESP и EBP


-----
invoke OpenFire




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

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

ASSUME fs:nothing в ФАСМе не требуется...

вот структура SEH:

struct SEH
PrevLink dd ?
CurrentHandler dd ?
SafeOffset dd ?
PrevEsp dd ?
PrevEbp dd ?
ends


прога открывает файл, мэппирует его в память..
в [EDI ] начало промэппированного файла...
проверяет на наличие MZ-сигнатуры...

добавляет до edi то, дворд с [EDI+3Ch]...
но если файл неправильный, в [EDI+3Ch] будет находиться не то число, и оно будет слишком - слаживаются EDI + dword ptr [Edi+3Ch] и проверяется по адресу [EDI] есть ли PE-сигнатура... но с EDI (если файл неправильный) может оказатся такое, число, что чтение с памяти по этому адресу невозможное...

и тогда программа завершивается.. SEH не срабатывает...

вроде бы все с SEH'ом делаю правильно...



Ранг: 103.1 (ветеран), 3thx
Активность: 0.070.01
Статус: Участник

Создано: 24 октября 2007 16:07
· Личное сообщение · #6

Necromancer13
Лучше предупреждать возникновение ошибок, а не обрабатывать их (по возможности).
Можно ведь просто сравнить смещение с размером файла.

-----
Crack your mind, save the planet




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

Создано: 24 октября 2007 16:24
· Личное сообщение · #7

я вроде знаю, как это делать..
вроде IsBadReadPtr или что-то типа этого...

но на МАСМе я видел прогу с помощью SEH, а на ФАСМ ее перевести уже не могу((:


.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comdlg32.lib

SEH struct
PrevLink dd ? ; the address of the previous seh structure
CurrentHandler dd ? ; the address of the 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

.data
AppName db "PE tutorial no.2",0
ofn OPENFILENAME <>
FilterString db "Executable Files (*.exe, *.dll)",0,"*.exe;*.dll",0
db "All Files",0,"*.*",0,0
FileOpenError db "Cannot open the file for reading",0
FileOpenMappingError db "Cannot open the file for memory mapping",0
FileMappingError db "Cannot map the file into memory",0
FileValidPE db "This file is a valid PE",0
FileInValidPE db "This file is not a valid PE",0

.data?
buffer db 512 dup(?)
hFile dd ?
hMapping dd ?
pMapping dd ?
ValidPE dd ?

.code
start proc
LOCAL seh:SEH
mov ofn.lStructSize,SIZEOF ofn
mov ofn.lpstrFilter, OFFSET FilterString
mov ofn.lpstrFile, OFFSET buffer
mov ofn.nMaxFile,512
mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
invoke GetOpenFileName, ADDR ofn
.if eax==TRUE
invoke CreateFile, addr buffer, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
.if eax!=INVALID_HANDLE_VALUE
mov hFile, eax
invoke CreateFileMapping, hFile, NULL, PAGE_READONLY,0,0,0
.if eax!=NULL
mov hMapping, eax
invoke MapViewOfFile,hMapping,FILE_MAP_READ,0,0,0
.if eax!=NULL
mov pMapping,eax
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
mov seh.PrevEsp,esp
mov seh.PrevEbp,ebp
mov edi, pMapping
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
mov ValidPE, TRUE
.else
mov ValidPE, FALSE
.endif
.else
mov ValidPE,FALSE
.endif
FinalExit:
.if ValidPE==TRUE
invoke MessageBox, 0, addr FileValidPE, addr AppName, MB_OK+MB_ICONINFORMATION
.else
invoke MessageBox, 0, addr FileInValidPE, addr AppName, MB_OK+MB_ICONINFORMATION
.endif
push seh.PrevLink
pop fs:[0]
invoke UnmapViewOfFile, pMapping
.else
invoke MessageBox, 0, addr FileMappingError, addr AppName, MB_OK+MB_ICONERROR
.endif
invoke CloseHandle,hMapping
.else
invoke MessageBox, 0, addr FileOpenMappingError, addr AppName, MB_OK+MB_ICONERROR
.endif
invoke CloseHandle, hFile
.else
invoke MessageBox, 0, addr FileOpenError, addr AppName,
MB_OK+MB_ICONERROR
.endif
.endif
invoke ExitProcess, 0
start endp

SEHHandler proc 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 ValidPE, FALSE
mov eax,ExceptionContinueExecution
ret
SEHHandler endp
end start



а перевести на ФАСМ это не могу(((




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 24 октября 2007 16:55
· Личное сообщение · #8

довы издеваетесь! для СЕХ"а достаточно минимальной структуры, создайте новый проект, создайте структуру, установит его, поделите на ноль, загрузите все в отладчек и пиздец.. это вместо того, чтобы постить сюда огромные листинги при этом выделяя их жирным шрефтом (там кнпочка "code" есть)

-----
invoke OpenFire




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

Создано: 24 октября 2007 17:33
· Личное сообщение · #9

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


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


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