![]() |
eXeL@B —› Вопросы новичков —› проверка PE-файла на валидность |
Посл.ответ | Сообщение |
|
Создано: 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-файла, то все ок, а если проверить файл неправильный.... прога "вылетает"... ![]() |
|
Создано: 24 октября 2007 06:43 · Личное сообщение · #2 |
|
Создано: 24 октября 2007 07:33 · Личное сообщение · #3 |
|
Создано: 24 октября 2007 09:51 · Личное сообщение · #4 это не странность, это ошибка в установке SEH'a или део вообще не в нем.. проверять твой код врядли кто очень захочет, так что посмотри структуру (или в фасме она стандартна?) и поглади на код внимательне.. установи СЕХ, потом просто подели на ноль и потрейси.. вот на всякий случай пример нормальной структуры: SEH struct ; начало описания структуры
и соответственно его установка: ; --------------------установка нового обработчика исключений--------------------------------------
----- invoke OpenFire ![]() |
|
Создано: 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'ом делаю правильно... ![]() |
|
Создано: 24 октября 2007 16:07 · Личное сообщение · #6 |
|
Создано: 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 а перевести на ФАСМ это не могу((( ![]() |
|
Создано: 24 октября 2007 16:55 · Личное сообщение · #8 довы издеваетесь! для СЕХ"а достаточно минимальной структуры, создайте новый проект, создайте структуру, установит его, поделите на ноль, загрузите все в отладчек и пиздец.. это вместо того, чтобы постить сюда огромные листинги при этом выделяя их жирным шрефтом (там кнпочка "code" есть) ----- invoke OpenFire ![]() |
|
Создано: 24 октября 2007 17:33 · Личное сообщение · #9 сорри, у меня кнопочка не подписана... больше так не буду... да простые задачи с сехом у меня получались!.. мне надо чтоб эта программа работала.. короче, очень большая просьба для тех, кто хорошо знает АСМ - перевести прежний исходник (жирным выделенный) с МАСМа на ФАСМ ![]() я уже вообще сейчас не уверен, что это возможно... ![]() ![]() |
![]() |
eXeL@B —› Вопросы новичков —› проверка PE-файла на валидность |