WIN32的问题 请大家帮忙看下!

nvnvnv21 2008-12-10 01:51:23

下面是一个子程序

IsFileModified proc
LOCAL hFile: HANDLE
LOCAL dwFileSize: DWORD
LOCAL dwNumberOfBytesReadWritten: DWORD
LOCAL hMemory: HANDLE
LOCAL pMemory: DWORD
LOCAL OriginalCRC32: DWORD ;文件原本的CRC-32值
LOCAL bModify: BOOL

mov bModify, FALSE

;获得文件名:
invoke GetModuleFileName, hInstance, addr szFileName, MAX_PATH

;打开文件:
invoke CreateFile, addr szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0
mov hFile, eax mov hFile, eax

.if hFile != INVALID_HANDLE_VALUE

;获得文件长度:
invoke GetFileSize, hFile, NULL
mov dwFileSize, eax
;建立文件的内存映射
invoke CreateFileMapping,hFile,NULL,PAGE_READONLY,0,0,NULL
.if ! eax
jmp _Ret1
.endif
mov hMemory, eax
;将文件映射到指定内存地址
invoke MapViewOfFile,eax,FILE_MAP_READ,0,0,0
.if ! eax
jmp _Ret2
.endif
mov pMemory, eax



;读3ch处的PE文件头指针:
mov ecx, 3ch
add ecx, pMemory
mov ecx, [ecx]

;定位到PE Optional_Section的Win32Version处,并读出储存在这里的CRC-32值:
add ecx, 4ch
add ecx, pMemory
mov eax, [ecx]
mov OriginalCRC32, eax

;下面这步非常关键!!!作用是把Win32Version处的4个字节写成0,否则得出的CRC-32值将会与原先的不同:
----------------mov dword ptr [ecx], 0 //////////////////运行到这里出错

;初始化crc32table:
invoke init_crc32table

;下面赋值给寄存器ebx和ecx,以便进行crc32转换:
;EBX是待转换的字符串的首地址:
mov ebx, pMemory
;ECX是文件的长度:
mov ecx, dwFileSize

;进行crc32转换:
invoke arraycrc32

cmp OriginalCRC32, eax
.if !zero?
mov bModify, TRUE
.endif
_Ret3:
invoke UnmapViewOfFile,pMemory
_Ret2:
invoke CloseHandle,hMemory
_Ret1:
invoke CloseHandle,hFile
.endif

mov eax, bModify
ret

IsFileModified endp

end start

当程序运行到 mov dword ptr [ecx], 0 这一句时出错
我用OD跟了一下 分析原因可能是由于 文件映射在内存的属性是只读的
也就是invoke MapViewOfFile,eax,FILE_MAP_READ,0,0,0 中的FILE_MAP_READ这个参数
但如查改成可写参数文件文件映射在内存失败 也就是调用MapViewOfFile这个函数返回0
请问一下 错误的原因在哪儿??如何修改
还是这个程序根本行不通!
谢谢大家请指教!

...全文
124 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nvnvnv21 2008-12-11
  • 打赏
  • 举报
回复
谢谢 楼上的朋友

明白了!
nvnvnv21 2008-12-11
  • 打赏
  • 举报
回复
谢谢 楼上的朋友

明白了!
xiaopoy 2008-12-11
  • 打赏
  • 举报
回复
是修改被其他进程使用着的文件?
简单的思路直接在磁盘上读写,或者注入目标进程用目标进程的权限完成修改.

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧