|
Ассемблер в примерах - Мэпирование файла в память
- Вопрос:
- Недавно начал изучать assembler и не могу справиться с простой задачей:
1) промэпировать файл в память ничего с ним не делая
2) Научиться правильно пользоваться функцией GetLastError
Если не трудно найдите ошибку в коде.
includelib import32.lib
.386
.model flat
extrn ExitProcess : near
extrn CreateFileA : near
extrn MessageBoxA : near
extrn CreateFileMappingA : near
extrn UnmapViewOfFile : near
extrn CloseHandle : near
extrn MapViewOfFile : near
FILE_EXIST equ 3
GEN equ 80000000h or 40000000h
OPEN_NEW equ 0
READWRITE equ 00000004h
.data
FileName db '000.bat', 0
HFile dd ?
HFM dd ?
PHFM dd ?
szTitle db '123', 0
szMessage db 'ERROR'
.code
start:
push 00h
push 00h
push offset FILE_EXIST
push 00h
push 00h
push GEN
push offset FileName
call CreateFileA
cmp ax,-1
je ERROR
mov HFile, eax
С_MAP:
xor eax,eax
push eax
push eax
push eax
push READWRITE
push eax
push offset HFile
call CreateFileMappingA
test eax,eax
jz ERROR
mov HFM, eax
MAPPING:
xor eax,eax
push eax
push eax
push eax
push 00000002h
push offset HFM
call MapViewOfFile
test eax,eax
jz ERROR
mov PHFM,eax
UNMAP:
push offset PHFM
call UnmapViewOfFile
ClOSEF:
push offset HFile
call CloseHandle
jmp Exit
ERROR:
xor eax,eax
push 30h
push offset szTitle
push offset szMessage
push eax
call MessageBoxA
Exit:
push 0
call ExitProcess
end start
- Ответ:
-
различайте
push OFFSET x
и
push x
в первом случае в стек помещается смещение переменной в сегменте данных, т.е. при выполнении программы в стек занесется адрес переменной
во втором случае в стек помещается непосредственно значение переменной
суть идеи аналогична указателям в языке С, которые трактуются по-разному в зависимости от наличия или отсутствия '*'
по поводу GetLastError
отладчик OllyDebugger отображает значение результата вызова этой функции справа под регистрами
includelib import32.lib
.386
.model flat
extrn ExitProcess : near
extrn CreateFileA : near
extrn MessageBoxA : near
extrn CreateFileMappingA : near
extrn UnmapViewOfFile : near
extrn CloseHandle : near
extrn MapViewOfFile : near
OPEN_EXISTING = 3
FILE_ATTRIBUTE_NORMAL = 80h
GENERIC_READ = 80000000h
GENERIC_WRITE = 40000000h
PAGE_READWRITE = 00000004h
FILE_MAP_WRITE = 02h
;--------------------------------------
.data
FileName db '000.bat', 0
HFile dd ?
HFM dd ?
addr_of_the_mapped_view dd ?
szTitle db '123',0
szMessage db 'ERROR',0
;--------------------------------------
.code
_start:
push 00h
push FILE_ATTRIBUTE_NORMAL
push OPEN_EXISTING
push 00h
push 00h
push GENERIC_READ or GENERIC_WRITE
push offset FileName
call CreateFileA
cmp eax,-1
je ERROR
mov HFile,eax
CREATE_MAPPING:
xor eax,eax
push eax ;lpName
push eax ;dwMaximumSizeLow
push eax ;dwMaximumSizeHigh
push PAGE_READWRITE
push eax
push HFile
call CreateFileMappingA
test eax,eax
jz ERROR
mov HFM, eax
MAP:
xor eax,eax
push eax ;dwNumberOfBytesToMap
push eax ;dwFileOffsetLow
push eax ;dwFileOffsetHigh
push FILE_MAP_WRITE ;dwDesiredAccess
push HFM
call MapViewOfFile
test eax,eax
jz ERROR
mov addr_of_the_mapped_view,eax
UNMAP:
push addr_of_the_mapped_view
call UnmapViewOfFile
CLOSEMAP:
push HFM
call CloseHandle
ClOSEF:
push HFile
call CloseHandle
jmp Exit
ERROR:
xor eax,eax
push 30h
push offset szTitle
push offset szMessage
push eax
call MessageBoxA
Exit:
push 0
call ExitProcess
end _start
| |