Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2011, 19:15   #1
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию Проверка файла на PE заголовок.

На основе прочитанных парочки уроков решил написать программу, определяющую файл на правильность PE-заголовка. Почему то, что бы я не выбрал, выдает что это не PE заголовок. В чем проблема?


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

.const
MEMSIZE equ 65535
MAXSIZE equ 260

.data?
hMemory dd ?
pMemory dd ?
hFile dd ?
buffer db 256 dup(?)

.data
ofn OPENFILENAME <>
PE_da db "PE заголовок", 0
PE_net db "Не PE заголовок", 0
FilterString db "All Files",0,"*.*",0

.code
start:
mov ofn.lStructSize,SIZEOF ofn
mov  ofn.lpstrFilter, OFFSET FilterString
mov  ofn.lpstrFile, OFFSET buffer
mov  ofn.nMaxFile,MAXSIZE

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, \
                   NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, \
				   NULL
mov hFile, eax
invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE
mov hMemory, eax
invoke GlobalLock, hMemory
mov pMemory, eax
mov esi, pMemory
call ValidPE
.if eax==TRUE
invoke MessageBox, 0, addr PE_da, 0, MB_OK
.elseif eax==FALSE
invoke MessageBox, 0, addr PE_net, 0, MB_OK
.endif

invoke GlobalUnlock, pMemory
invoke GlobalFree, hMemory
invoke CloseHandle, hFile
.endif
invoke ExitProcess, 0

ValidPE proc
push esi
pushf
.if word ptr [esi]=="ZM"
   assume esi:ptr IMAGE_DOS_HEADER
   add esi, [esi].e_lfanew
   .if word ptr [esi]=="EP"
       popf
       pop esi
       mov eax, TRUE
       ret
   .endif
.endif
popf
pop esi
mov eax, FALSE
ret
ValidPE endp
end start
Ibanez Wizard вне форума Ответить с цитированием
Старый 21.02.2011, 19:41   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

эмм, а вы где с файла то читаете?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.02.2011, 19:51   #3
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

эмм...чтения у меня нету
Всегда на таких тупостях подкалываюсь). Я в общем исправил - добавил чтение, но проблема в том, что теперь вместо мессэдж бокса, программа выдает ошибку (инструкция с такого то адреса перешла в другой адрес...т.д. и т.п.)
Вот прога с исправлениями:

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

.const
MEMSIZE equ 65535
MAXSIZE equ 260

.data?
hMemory dd ?
pMemory dd ?
hFile dd ?
buffer db 256 dup(?)

.data
ofn OPENFILENAME <>
PE_da db "PE заголовок", 0
PE_net db "Не PE заголовок", 0
FilterString db "All Files",0,"*.*",0

.code
start:
mov ofn.lStructSize,SIZEOF ofn
mov  ofn.lpstrFilter, OFFSET FilterString
mov  ofn.lpstrFile, OFFSET buffer
mov  ofn.nMaxFile,MAXSIZE

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, \
                   NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, \
				   NULL
mov hFile, eax
invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE
mov hMemory, eax
invoke GlobalLock, hMemory
mov pMemory, eax
invoke ReadFile,hFile,pMemory, sizeof pMemory-1, NULL ,NULL
mov esi, pMemory
call ValidPE
.if eax==TRUE
invoke MessageBox, 0, addr PE_da, 0, MB_OK
.elseif eax==FALSE
invoke MessageBox, 0, addr PE_net, 0, MB_OK
.endif

invoke GlobalUnlock, pMemory
invoke GlobalFree, hMemory
invoke CloseHandle, hFile
.endif
invoke ExitProcess, 0

ValidPE proc
push esi
pushf
.if word ptr [esi]=="ZM"
   assume esi:ptr IMAGE_DOS_HEADER
   add esi, [esi].e_lfanew
   .if word ptr [esi]=="EP"
       popf
       pop esi
       mov eax, TRUE
       ret
   .endif
.endif
popf
pop esi
mov eax, FALSE
ret
ValidPE endp
end start
Ibanez Wizard вне форума Ответить с цитированием
Старый 21.02.2011, 21:38   #4
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Посмотрите уроки Айцзелиона-он такой пример на пальцах разобрал заодно с СЕХ даже уже лет чуть ли не 15 назад.

invoke ReadFile,hFile,pMemory, sizeof pMemory-1, NULL ,NULL
здесь: sizeof pMemory-1 укажет читать из файла 3 байта; 4й параметр не должен быть равным нулю - в него возвращается количество загруженных байт, ежели не хотите выделять отдельную переменную, то поставьте хотя бы esp
вообщем сделайте хотя бы так
invoke ReadFile,hFile,pMemory, 100h, esp ,NULL
но это шибко грубо и чревато ошибками, так что все же рекомендую ознакомится с туториалом приведенным в пример выше
Нет, ну правда..

Последний раз редактировалось yuran666666; 22.02.2011 в 10:43.
yuran666666 вне форума Ответить с цитированием
Старый 22.02.2011, 18:57   #5
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Спасибо).
А кстати - зачем нужен SEH?
Ibanez Wizard вне форума Ответить с цитированием
Старый 22.02.2011, 20:40   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

SEH - это механизм обработки исключений возникающих в программе
rpy3uH вне форума Ответить с цитированием
Старый 23.02.2011, 00:08   #7
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Вот вам пример все оттуда же:
мы даем на съедение данной программе не ПЕ-файл, а какой либо другой, пусть хоть даже текстовый документ, программа же сделает что(возьмем наш вариант программы):
1. Загрузит первые его 0х100 байт в память
2. Прибавит к адресу в памяти по которому загружены эти 100 байт смещение на ПЕ-заголовок, расположенное по смещению 0х3с от начала этого же куска памяти с нашими байтами.
Теперь вопрос на засыпку: что произойдет если в данном текстовом документе спустя от начала 0х3с символов будет слово 'fuck'?
Программа рассмотрит это байты (аскии коды символов 'fuck') как смещение на пе-заголовок и обратится за поиском РЕ-сигнатуры как минимум к тому месту где их уж точно быть не может, а скорее всего к адресу, запрос доступа к которому вызовет исключение(неразмеченное виртуальное пространство, адреса ниже 0х10000 и выше 0х7ффффффф). Если программа не использует механизм обработки исключений, то вызывается стандартный обработчик, говорящий о том, что инструкция по адресу Х обратилась по адресу У, память не может быть прочитана в данном случае. Вот собственно и все.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 23.02.2011, 10:38   #8
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Спасибо). Просто я хотел сам попробовать написать программу, определяющую PE или нет). И хотел обойтись без сеха, но по видимому у меня это не получилось.
Ibanez Wizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка текста из файла!!! DKENT PHP 11 09.02.2011 21:01
Проверка наличия файла nervniy Работа с сетью в Delphi 4 28.10.2010 19:47
Проверка на наличие файла ruavia3 Microsoft Office Excel 1 05.02.2010 21:13
Проверка на наличие файла Demetrius Помощь студентам 12 28.07.2009 00:27
Проверка атрибутов файла. v01umE Общие вопросы C/C++ 2 31.05.2008 08:37