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_ATTRIBUTE_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
проверка PE файла на валидность (FASM)
проверяющей PE EXE на валидность... очень нужно...
я в ФАСМе новичок, на МАСМе я б эту прогу быстро написал...
а вот то, что я написал на ФАСМе... (похоже тут какие-то ошибки с SEH...):
Код:
и 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
#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
заранее огромное спасибо
вот мне интересно зачем ты привёл весь код программы зачем всё это нужно? если можно было привести только код процедурки CheckFile. Ты лучше скажи в чём проблема. Он у тебя вообще компилируется?
если PE файл правильный, то он пишет, что правильный - все ок,
но если файл не правильный - он иногда пишет, что файл неправильный, а иногда просто прога завершается сразу...
я могу использовать IsBadReadPtr, и тогда все будет ок... но мне очень интересно, где ошибка в этой программе...
у меня есть прога такая (исходник), но на МАСМ... мне бы ее перевести на ФАСМ...
вот я попробовал перевести, но, не получилось... я уже вообще не уверен, что это возможно...
на 5 форумах этот вопрос задал, но не помогли...
я смотрел только код процедурки CheckFile. я непонимаю (может я тормоз?) зачем все эти извращения с мэпингом и причём тут SEH, если можно просто считать первые 512 байт (или 1 КБ больше не надо) файла и анализировать их.
а SEH вот для чего:
например, найдена MZ-сигнатура, ищется PE-сигнатура
cmp word[edi],'MZ'
jne .notmz
add edi,dword[edi+3Ch]
cmp dword[edi],00004550h
je _valid
xor ecx,ecx
смотри тут add edi,[edi+3Ch] - там может быть значение, указывающие в никуда, если это не PE-файл... и программа ....
можно после add edi,[edi+3Ch] использовать
invoke IsPadReadPtr,edi,4
test eax,eax
если ZF поднят - память там доступна для чтения,
если нет - недоступна и будет ошибка...
но в примере ICZELION'а использовался SEH, мне хотелось бы его тоже использовать...:(
Цитата: Necromancer13
смотри тут add edi,[edi+3Ch] - там может быть значение, указывающие в никуда, если это не PE-файл...
а лучше сделать так: извлечь оттуда значение (например, mov ebx, [edi+3Ch]) и посмотреть, если оно больше чем 512 (или больше чем размер файла), то там неверное значение.
проверку на валидноть сделал=)
теперь парюсь с выводом информации о файле в MessageBox'е (адрес точки входа, количество секций и т.п....)
алгоритм преоразования числа в строку есть здесь:
а вот сейчас ничего не понимаю - отладчик превратил
push 3.2
у
push 404CCCCD
не подскажите, где найти информацию о числах с запятой в Ассемблере? :(
P.S. просьба не советовать использовать сопроцессор... я хочу научиться переводить десятеричные числа с запятой в шест. и двоичные... это ведь не будет лишним?..
а вот то, что я написал на ФАСМе...
[LEFT][/LEFT]
всегда считал что разница между фасмом и масм32 только в скобках ,взятие значение по адресу [x] и просто значение x
отличий не много, но все же не привычно;)