您的位置:逆风者 汇编技术 正文
原作者:www.upwinder.com 添加时间:2007-09-01 原文发表:2007-08-31 人气:12 来源:未知

本文章共1686字,分2页,当前第1页,快速翻页:
 

   想一想,如果你要写一个加密程序,或者病毒程序,都需要对文件进行修改(写操作)。在dos下,系统提供有相应的功能调用来完成这样的操作,如:“打开文件\移动指针\读文件\写文件\关闭文件”,在windows下,系统也提供有相应的Api函数。如“CreateFile\SetFilePointer\ReadFile\WriteFile\SetEndOfFile\CloseHandle”等,利用这些编程和dos下没什么两样,这里就不再多说啦!咱们今天要用的是利用“内存映射文件”来操作。简单的说就是把文件内容映射到一个内存块,改变这块内存的内容就是改变文件的内容,系统可提供的这块内存巨大、平坦,操作起来真是方便!
逆风编程精品

这种方法要用到“CreateFile/CreatFileMapping/MapViewOfFile/UnmapViewOfFile/CloseHandle”,具体使用参考“Win32 Developer's References”。俺也是刚看,不敢乱说,嘿嘿嘿。

--------------------------------------------------------------
;例:打开一个已存在的文件并修改,建议文件具有一定的大小,比如80H字节。
;文件名:12.asm

.386
.Model Flat, StdCall
Option Casemap :None
;---------------------------------------------------------
Includewindows.inc
Includekernel32.inc
IncludeLib kernel32.lib
ModifyFile PROTO:LPSTR
.data
MyFile db 'd:\masm7\MyTest',0;文件MyTest必须存在,若不存在,程序将什么也不做
M1 db 'Good morning',0 ;将写到文件中的字符串
M2 db 'Good afternoon',0
M3 db 'Good evening',0
;---------------------------------------------------------
.data?
hFiledd?
hMap dd?
pMapAddr dd?
;---------------------------------------------------------
.code
START:
invoke CreateFile, \;打开文件,该函数具有多种功能
ADDR MyFile,\ ;指向要打开的文件名字符串
GENERIC_READ or GENERIC_WRITE ,\;打开的文件具有读写的权限
FILE_SHARE_READ or FILE_SHARE_WRITE,\ ;别人也可读写此文件
NULL, \ ;95下不用
OPEN_EXISTING, \;要打开的文件必须存在
FILE_ATTRIBUTE_NORMAL,\ ;文件的属性
NULL;95下必须是NULL
.if eax!=INVALID_HANDLE_VALUE ;判断文件是否已正常打开
mov hFile, eax;保存文件句柄
invoke CreateFileMapping, \;creates file-mapping object for the specified file.
hFile, \ ;Identifies the file from which to create a mapping object
NULL, \;ignored
PAGE_READWRITE, \;ACCESS
0, \ ;high-order 32 bits of the maximum size
0, \ ;low-order 32 bits of the maximum size
NULL ;the mapping object is created without a name
.if eax!=NULL;
mov hMap,eax ;the return value is a handle to the file-mapping object
invoke MapViewOfFile,hMap,FILE_MAP_WRITE,0,0,NULL ;映射文件到内存
.if eax!=NULL
mov pMapAddr,eax ;保存返回的内存块首地址
invoke ModifyFile,pMapAddr ;修改内存块内容
invoke UnmapViewOfFile,pMapAddr;解除文件映射
.endif
invoke CloseHandle,hMap;关闭内存映射文件
.endif
invoke CloseHandle, hFile;关闭文件
.endif
invoke ExitProcess,0 ;结束程序

;修改内存块的内容,就相当于修改文件的内容
ModifyFileproc uses ebx esi edi,lpBufferAddress:LPSTR
mov edi,lpBufferAddress;取内存块地址
invoke lstrcpy,edi,addr M1 ;修改内存块内容
add edi,40h;调整地址(随意)
invoke lstrcpy,edi,addr M2 ;修改
add edi,240h
invoke lstrcpy,edi,addr M3
ret
ModifyFileendp
END START
----------------------------------------------------------------------
注意:

0、程序运行后无任何提示,只可从被修改的文件上看变化
1、第39、40行的值都是0,这样,内存映射文件的大小就正好取文件的实际大小
2、可以看到,第62、63行的修改并没起作用,因为文件没有这样大。
3、将40行的数据改为100H,可看到运行后原文件的大小将变为100H
 

本文章更多内容1 - 2 - 下一页>>
相关文章

矛与盾的较量——CRC原理篇
移位指令在Win32消息处理中的一些问题
小试Win32汇编
客户寄存器结构
事件对象
扩展Int 13H调用规范
内存映射文件
使用DLL中的资源
关于在8086/88内存寻址方式
抓取屏幕内容(字符模式)
80386的中断和异常
列表视图控件
Windows下控制台输出
在弹出菜单的同时再次弹出菜单
自己编程实现多引导
虚拟设备驱动程序初步
VxD 程序设计入门
Win32调试API 第一部分
树型视图控件
80386的异常类型

相关评论


本文章所属分类:首页 汇编技术

  热门关键字:
进制数据输出的通用程序 2007-09-12
汇编源码--showmem 2007-08-31
汇编源码--CLEAN 2007-08-31
汇编源码--hdr 2007-08-31
汇编源码--basload 2007-08-31
汇编源码--CHAR 2007-08-31
汇编源码--fxn 2007-08-31
汇编源码--alarm 2007-08-31
汇编源码--getsect 2007-08-31
汇编源码--DEV 2007-08-31
汇编源码--getspace 2007-08-31
汇编源码--frespace 2007-08-31
CIH文件型病毒检测消除程序 2007-08-31
Mixer Volume Ctrler V1.0 2007-08-31
汇编源码--COMINT 2007-08-31
自己用汇编语言写的一个病毒(源码... 2007-08-31
汇编源码--col 2007-08-31
汇编源码--BURNOUT 2007-08-31