老文章档案 · 2003 年

修改文件操作

天下资讯 · 破解文章 · 2003-09-19 · 作者:怜香 人气: · 出处:赢政天下整理收藏)

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

;---------------------------------------------------------

Include windows.inc

Include kernel32.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?

hFile dd ?

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

4、将40行的数据改为200H,47行的指令屏蔽掉不执行,程序运行后可看到文件的大小将成200H

5、此时将40行的数据改为80H,运行程序,文件不会变小

6、恢复47行指令,运行后文件亦不能减小

7、真想减少文件尺寸,可在52行前多执行两条指令:①SetFilePointer②SetEndOfFile

8、其他的没测试,自己琢磨吧!

(出处:赢政天下整理收藏)

相关资讯:

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright ? 1998-2003 winzheng.com

All Rights Reserved.

特别感谢 蓝芒科技 提供下载站及论坛服务器

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史