想一想,如果你要写一个加密程序,或者病毒程序,都需要对文件进行修改(写操作)。在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 - 下一页>> |