庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>程序设计>汇编语言>技巧教程>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

修改文件操作

 作者:本站收集   日期:2005-8-1 15:50:40
字号选择〖 〗/ 双击滚屏 单击停止   

   想一想,如果你要写一个加密程序,或者病毒程序,都需要对文件进行修改(写操作)。在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、其他的没测试,自己琢磨吧!

上一篇:压缩PE大小    下一篇:把数据写到代码段  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-8-1 15:50:40
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿