Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проверка PE файла на валидность (FASM)

22K
24 октября 2007 года
Necromancer13
36 / / 24.10.2007
Пожалуйста, помогите найти исходник программы на FASM,
проверяющей PE EXE на валидность... очень нужно...

я в ФАСМе новичок, на МАСМе я б эту прогу быстро написал...
а вот то, что я написал на ФАСМе... (похоже тут какие-то ошибки с 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_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



и 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


заранее огромное спасибо
261
24 октября 2007 года
ahilles
1.5K / / 03.11.2005
вот мне интересно зачем ты привёл весь код программы зачем всё это нужно? если можно было привести только код процедурки CheckFile. Ты лучше скажи в чём проблема. Он у тебя вообще компилируется?
22K
24 октября 2007 года
Necromancer13
36 / / 24.10.2007
Да, компилируется...
если PE файл правильный, то он пишет, что правильный - все ок,
но если файл не правильный - он иногда пишет, что файл неправильный, а иногда просто прога завершается сразу...

я могу использовать IsBadReadPtr, и тогда все будет ок... но мне очень интересно, где ошибка в этой программе...

у меня есть прога такая (исходник), но на МАСМ... мне бы ее перевести на ФАСМ...
вот я попробовал перевести, но, не получилось... я уже вообще не уверен, что это возможно...
на 5 форумах этот вопрос задал, но не помогли...
261
24 октября 2007 года
ahilles
1.5K / / 03.11.2005
да всё возможно!!! а эта прога на МАСМе всегда работает?
я смотрел только код процедурки CheckFile. я непонимаю (может я тормоз?) зачем все эти извращения с мэпингом и причём тут SEH, если можно просто считать первые 512 байт (или 1 КБ больше не надо) файла и анализировать их.
22K
24 октября 2007 года
Necromancer13
36 / / 24.10.2007
На МАСМе все работает!

а 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, мне хотелось бы его тоже использовать...:(
261
25 октября 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: Necromancer13

смотри тут add edi,[edi+3Ch] - там может быть значение, указывающие в никуда, если это не PE-файл...


а лучше сделать так: извлечь оттуда значение (например, mov ebx, [edi+3Ch]) и посмотреть, если оно больше чем 512 (или больше чем размер файла), то там неверное значение.

22K
25 октября 2007 года
Necromancer13
36 / / 24.10.2007
ну или так...:)
проверку на валидноть сделал=)
теперь парюсь с выводом информации о файле в MessageBox'е (адрес точки входа, количество секций и т.п....)
261
25 октября 2007 года
ahilles
1.5K / / 03.11.2005
алгоритм преоразования числа в строку есть здесь:
http://forum.codenet.ru/showthread.php?t=37570
22K
26 октября 2007 года
Necromancer13
36 / / 24.10.2007
не.. с алгоритмом еще не плохо - все получилось... там не сложно..
а вот сейчас ничего не понимаю - отладчик превратил
push 3.2
у
push 404CCCCD

не подскажите, где найти информацию о числах с запятой в Ассемблере? :(
P.S. просьба не советовать использовать сопроцессор... я хочу научиться переводить десятеричные числа с запятой в шест. и двоичные... это ведь не будет лишним?..
33K
29 октября 2007 года
5C0A0
4 / / 26.10.2007
на МАСМе я б эту прогу быстро написал...
а вот то, что я написал на ФАСМе...

[LEFT][/LEFT]


всегда считал что разница между фасмом и масм32 только в скобках ,взятие значение по адресу [x] и просто значение x
22K
30 октября 2007 года
Necromancer13
36 / / 24.10.2007
ну почти так;)
отличий не много, но все же не привычно;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог