.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include ole32.inc
includelib ole32.lib
include shell32.inc
includelib shell32.lib
include Advapi32.inc
includelib Advapi32.lib
ICO_MAIN equ 1000
DLG_MAIN equ 100
IDC_RESULT equ 101
IDC_BROWSE equ 102
.data?
hInstance dd ?
hRichEdit dd ?
hWinMain dd ?
.const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
szFilter db '*.*',0
szExts db '.exe',0
szExtb db '.EXE',0
szDesktop db 'vexed.ini',0
szSystemTime db '%d-%d-%d',0dh,0ah,0
.code
_Handler proc _lpExceptionRecord,_lpSEH,_lpContext,_lpDispatcherContext
pushad
mov esi,_lpExceptionRecord
mov edi,_lpContext
assume esi:ptr EXCEPTION_RECORD,edi:ptr CONTEXT
mov eax,_lpSEH
push [eax + 0ch]
pop [edi].regEbp
push [eax + 8]
pop [edi].regEip
push eax
pop [edi].regEsp
assume esi:nothing,edi:nothing
popad
mov eax,ExceptionContinueExecution
ret
_Handler endp
_OpenFile proc _lpszPath
local @hFile,@dwFileSize,@hMapFile,@lpMemory,@dwTemp
local @szFileBuffer[MAX_PATH]:byte
;********************************************************************
; 打开文件并建立文件 Mapping
;********************************************************************
invoke CreateFile,_lpszPath,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
;********************************************************************
; 创建用于错误处理的 SEH 结构
;********************************************************************
assume fs:nothing
push ebp
;push offset _ErrFormat
push offset _Handler
push fs:[0]
mov fs:[0],esp
;********************************************************************
; 检测 PE 文件是否有效
;********************************************************************
mov esi,@lpMemory
assume esi:ptr IMAGE_DOS_HEADER
.if [esi].e_magic != IMAGE_DOS_SIGNATURE
jmp _ErrorExit
.endif
add esi,[esi].e_lfanew
assume esi:ptr IMAGE_NT_HEADERS
.if [esi].Signature != IMAGE_NT_SIGNATURE
jmp _ErrorExit
.endif
;invoke _ProcessPeFile,@lpMemory,esi,@dwFileSize
invoke MessageBox,NULL,addr @dwFileSize,NULL,MB_OK or MB_ICONSTOP
jmp _ErrorExit
_ErrorExit:
pop fs:[0]
add esp,0ch
invoke UnmapViewOfFile,@lpMemory
.endif
invoke CloseHandle,@hMapFile
.endif
;invoke CloseHandle,@hFile
.endif
invoke CloseHandle,@hFile
.endif
@@:
ret
_OpenFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;搜索EXE
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_FindExe proc uses ebx esi edi _lParam
local @stFindFile:WIN32_FIND_DATA
local @hFindFile
local @szPath[MAX_PATH]:byte ;用来存放“路径\”
local @szSearch[MAX_PATH]:byte ;用来存放“路径\*.*”
local @szFindFile[MAX_PATH]:byte ;用来存放“路径\找到的文件”
local @szTerm[MAX_PATH]:byte ;用来存放查找条件
pushad
invoke lstrcpy,addr @szPath,_lParam
;********************************************************************
; 在路径后面加上\*.*
;********************************************************************
@@:
invoke lstrlen,addr @szPath
lea esi,@szPath
add esi,eax
xor eax,eax
mov al,'\'
.if byte ptr [esi-1] != al
mov word ptr [esi],ax
.endif
invoke lstrcpy,addr @szSearch,addr @szPath
invoke lstrcpy,addr @szTerm,addr @szSearch
invoke lstrcat,addr @szSearch,addr szFilter
invoke lstrcat,addr @szTerm,addr szDesktop
invoke FindFirstFile,addr @szTerm,addr @szFindFile
.if eax != -1h
jmp _Ret
.endif
;********************************************************************
; 寻找文件
;********************************************************************
invoke FindFirstFile,addr @szSearch,addr @stFindFile
.if eax != INVALID_HANDLE_VALUE
mov @hFindFile,eax
.repeat
invoke lstrcpy,addr @szFindFile,addr @szPath
invoke lstrcat,addr @szFindFile,addr @stFindFile.cFileName
.if @stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
.if @stFindFile.cFileName != '.'
invoke _FindExe,addr @szFindFile
.endif
.else
pushad
invoke lstrlen,addr @szFindFile
lea ebx,@szFindFile
add ebx,eax
sub ebx,4
invoke lstrcmp,ebx,addr szExts
mov esi,eax
invoke lstrcmp,ebx,addr szExtb
.if eax==0 || esi==0
invoke _OpenFile,addr @szFindFile ;打开文件
.endif
popad
.endif
invoke FindNextFile,@hFindFile,addr @stFindFile
.until (eax == FALSE)
invoke FindClose,@hFindFile
.endif
popad
_Ret:
ret
_FindExe endp
_CopyMe proc _szDir
local @szBuffer[128]:byte
pushad
mov esi,_szDir
@@:
invoke GetDriveType,esi
.if eax == DRIVE_FIXED || DRIVE_REMOVABLE ;如果为可用驱动器
invoke lstrcpy,addr @szBuffer,esi
invoke _FindExe,addr @szBuffer
.endif
add esi,4
cmp byte ptr [esi],0
jnz @B
popad
ret
_CopyMe endp
_Browse proc uses ebx esi edi _lParam
local @szBuffer[1024]:byte
invoke GetLogicalDriveStrings,sizeof @szBuffer,addr @szBuffer
.if eax
invoke _CopyMe,addr @szBuffer
.endif
ret
_Browse endp
start:
call _Browse
invoke ExitProcess,NULL
end start
运行几分钟后就出错.说程序遇到问题.加SEH 后.程序运行到出错的地方后,CPU百分百,程序不做任何处理了
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课