邪恶八进制信息安全团队技术讨论组's Archiver

asm 2006-12-15 20:27

[讨论]关于读取文件内容问题

目前我知道读取文件内容的方法有两种:

一是先打开文件,然后ReadFile,读取内容,然后比较

具体的的流程是CreateFile---SetFilePointer---ReadFile---lstrcmp

二是内存影射文件直接在内存中比较

具体的的流程是CreateFile--GetFileSize--CreateFileMapping--MapViewOfFile,这里返回一个句柄,然后ReadFile来读,接着用lstrcmp对比是否发现.

具体例子:

一个文件的内容是:

醒时饮酒醉时歌
诸君碌碌我蹉跎
牛衣空负眉头白
酒中不胜是呤哦
青蚨血尽无长物
心魔原来是酒魔
将进酒,将进酒
席上无歌方劝酒
无酒无歌且奈何

我现在想读取这个文件里,是否发现 “心魔原来是酒魔”这句诗.下面看看我写的代码错哪了?

[code]
szLogFile db "C:\test.txt",0
lpBuffer db '心魔原来是酒魔',0
sz1 db '成功找到!',0
x_str db 256 dup(0)

.data?
hFile dd ?

_File  proc
local  x_strlen: DWORD
invoke CreateFile, addr szLogFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
mov hFile, eax
  invoke  SetFilePointer,hFile,0,0,FILE_BEGIN ;设定指针
  invoke  ReadFile ,hFile, addr  x_str ,8, addr  x_strlen , NULL ;读取文件
  invoke  lstrcmp , addr  x_str,addr lpBuffer ;对比是否发现指定诗句
.if eax != NULL
invoke MessageBox,NULL,addr sz1,NULL,MB_OK ;如果符合,就处理
.
.
_File endp
[/code]

第二种在内存中读取的代码:

[code]
.data
FileName db "C:\test.txt",0
lpBuffer db '心魔原来是酒魔',0
sz1 db '成功找到!',0
.code
start:
_ifile  proc
              local  @hFile,@dwFileSize,@hMapFile,@lpMemory
             invoke  CreateFile,addr FileName,GENERIC_READ,\
                   FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\
                   OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
              .if    eax !=  INVALID_HANDLE_VALUE
                   mov    @hFile,eax
                   invoke  GetFileSize,eax,NULL
                   mov    @dwFileSize,eax
                   .if    eax
                  invoke  CreateFileMapping,@hFile,\
                        NULL,PAGE_READONLY,0,0,NULL
                   .if    eax
                        mov    @hMapFile,eax
                        invoke  MapViewOfFile,eax,\
                              FILE_MAP_READ,0,0,0
                        .if    eax
                              mov    @lpMemory,eax ;返回的句柄应该怎么处理?
.
.
invoke lstrcmp,addr lpBuffer.......这里貌似返回一个变量才能比较
[/code]

幽游 2007-4-4 11:17

第一种:
invoke  ReadFile ,hFile, addr x_str ,8, addr x_strlen , NULL ;读取文件
读取的是8个字节,而汉字一个字是2字节
invoke  lstrcmp , addr x_str,addr lpBuffer ;对比是否发现指定诗句
.if eax != NULL
返回的是大于小于和等于不是NULL
小弟初学Win32,有错还请指正

asm 2007-4-5 13:07

汗,这么老的帖子都翻出来

.386
.model flat, stdcall
option casemap :none

include    windows.inc
include    user32.inc
includelib  user32.lib
include    kernel32.inc
includelib  kernel32.lib
.data
szFile db "C:\test.txt",0
szName db "心魔原来是酒魔",0
sz1 db "Find OK",0
.data?
@hFile dd ?
@dwFileSize dd ?
@hMapFile dd ?
@lpMemory dd ?
.code
start:
invoke CreateFile,addr szFile,GENERIC_READ,\
              FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,\
              OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
          .if   eax != INVALID_HANDLE_VALUE
              mov   @hFile,eax
              .endif
              invoke GetFileSize,eax,NULL
              mov   @dwFileSize,eax
              .if   eax
              invoke CreateFileMapping,@hFile,\
                  NULL,PAGE_READONLY,0,0,NULL
              .if   eax
                  mov   @hMapFile,eax
                  .endif
                  invoke MapViewOfFile,eax,\
                      FILE_MAP_READ,0,0,0
                  .if   eax
                      mov   @lpMemory,eax
                      .endif
                      .endif

mov ecx, @dwFileSize
sub ecx,13
mov esi, @lpMemory
@@:
mov edi, offset szName
push ecx
push esi
mov ecx,14
repe cmpsb
pop esi
pop ecx
je @f
inc esi
loop @b
@@:
.if ecx != 0
invoke  MessageBox,NULL,addr sz1,NULL,MB_OK
.endif
invoke UnmapViewOfFile,@lpMemory
invoke CloseHandle,@hMapFile
invoke CloseHandle,@hFile
invoke ExitProcess,NULL
end start

页: [1]
© 1999-2008 EvilOctal Security Team