发二个刚才写的小程序源码
上面的是处理快捷方式后的图 ,第一个源码资料文件我就不发了。
程序代码:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;去掉快捷方式里的查找目标等 ;复习映射内存文件的几个API ;by 153785587 ;原理:http://hi.baidu.com/kingcham/blog/item/253c132bed092824d52af145.html ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .386 .model flat,stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc ;include gdi32.inc ;图形 includelib user32.lib includelib kernel32.lib ;includelib gde32.lib include shell32.inc includelib shell32.lib include macro.asm ;ctxt("") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IDD_DIALOG1 equ 100 ;IDC_BUTTON1 equ 1000 IDC_EDIT1 equ 1001 ;IDC_BUTTON2 equ 1002 IDC_STATIC equ 1003 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LinkCheck equ 0000004Ch ;LinkGuid equ NoLink equ 00001091h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .data? hInstance dd ? ;模块句柄 hMain dd ? ;对话框句柄 hFile dd ? hMapFile dd ? lpMemory dd ? szDragQueryFileName db MAX_PATH dup (?) .const .code _CheckLink proc uses esi _lpLinkStart mov esi,_lpLinkStart .if DWORD ptr [esi]==LinkCheck add esi,14h mov DWORD ptr [esi],NoLink invoke SendDlgItemMessage,hMain,IDC_EDIT1,WM_SETTEXT,0,addr szDragQueryFileName .endif invoke UnmapViewOfFile,lpMemory invoke CloseHandle,hMapFile invoke CloseHandle,hFile ret _CheckLink endp ; ;_MapFile proc _lpFileName ; ; invoke CreateFile,_lpFileName,GENERIC_ALL,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL ; .if eax!=-1 ; mov hFile,eax ; invoke CreateFileMapping,hFile,NULL,PAGE_EXECUTE_READWRITE,NULL,NULL,NULL ; .if eax ; mov hMapFile,eax ; invoke MapViewOfFile,hMapFile,FILE_MAP_ALL_ACCESS,NULL,NULL,NULL ; .if eax ; mov lpMemory,eax ; ;invoke SendDlgItemMessage,hMain,IDC_EDIT1,WM_SETTEXT,0,addr szLinkError ; ;invoke MessageBox,NULL,CTXT("ok"),CTXT("Createfile"),0 ; invoke _CheckLink,lpMemory ; .else ; invoke MessageBox,NULL,CTXT("map"),CTXT("Createfile"),0 ; .endif ; .else ; invoke MessageBox,NULL,CTXT("Createmap"),CTXT("Createfile"),0 ; .endif ; .else ; invoke MessageBox,NULL,CTXT("Createfile"),CTXT("Createfile"),0 ; .endif ; ;ret ;_MapFile endp ; ;;对话框回调过程 _DlgProc proc uses esi edi ebx hDlg,uMsg,wParam,lParam .if uMsg==WM_INITDIALOG ;对话框初始化 push hDlg pop hMain ;invoke LoadIcon,hInstance,IDR_MAINFRAME ;invoke SendMessage,hDlg,WM_SETICON,ICON_BIG,eax invoke DragAcceptFiles,hDlg,TRUE ;为True时,hWnd所指向的窗体可以接受拖放的文件 ;当窗口接受到文件后,会收到 WM_DROPFILES 消息。wParam中给出拖动文件结构的句柄。 .elseif uMsg==WM_DROPFILES ;************************************************************* invoke DragQueryFile,wParam,0,addr szDragQueryFileName,sizeof szDragQueryFileName ;*************************************************************************************************** invoke CreateFile,addr szDragQueryFileName,GENERIC_ALL,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL .if eax!=-1 mov hFile,eax invoke CreateFileMapping,hFile,NULL,PAGE_EXECUTE_READWRITE,NULL,NULL,NULL .if eax mov hMapFile,eax invoke MapViewOfFile,hMapFile,FILE_MAP_ALL_ACCESS,NULL,NULL,NULL .if eax mov lpMemory,eax ;invoke SendDlgItemMessage,hMain,IDC_EDIT1,WM_SETTEXT,0,addr szLinkError ;invoke MessageBox,NULL,CTXT("ok"),CTXT("Createfile"),0 invoke _CheckLink,lpMemory .else invoke MessageBox,NULL,CTXT("map"),CTXT("Createfile"),0 .endif .else invoke MessageBox,NULL,CTXT("Createmap"),CTXT("Createfile"),0 .endif .else invoke MessageBox,NULL,CTXT("Createfile"),CTXT("Createfile"),0 .endif ;*************************************************************************************************** .elseif uMsg==WM_COMMAND mov eax,wParam .elseif uMsg==WM_CLOSE ; invoke UnmapViewOfFile,lpMemory ; invoke CloseHandle,hMapFile ; invoke CloseHandle,hFile invoke EndDialog,hDlg,FALSE .else mov eax,FALSE ret .endif mov eax,TRUE ret _DlgProc endp ;;对话框回调过程 start: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr _DlgProc,NULL invoke ExitProcess,NULL end start
程序代码:
;************************************************ ;指定进程不存在时重起系统 ;by 153785587 ;************************************************ .386 .model flat,stdcall option casemap:none ;************************************************ include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include advapi32.inc includelib advapi32.lib ;提权 include psapi.inc includelib psapi.lib;快照 include Shlwapi.inc includelib shlwapi.lib ;PathFileExists ;************************************************ include macro.asm ;ctxt("") ;************************************************ .data szPrivilegeName db 'SeDebugPrivilege',0 ;提升为这个权限 ;szExplorer db 'explorer.exe',0 szMutex db 'QQ153785587',0 ;互斥名称 ;szFmatTxt db '%d',0 szConfigFile db '\cfgfile.ini',0 ;配置文件 szSection db 'zerostudy',0 ;节名 szKeyName db '保护进程名称',0 szKeyValue db 'explorer.exe',0dh,0ah,';程序每一分钟检测上面的进程有没有运行,若没有则重启系统。BY 153785587',0 .data? hInstance dd ? ;模块句柄 hSanp dd ? ;快照句柄 stSanp PROCESSENTRY32 <?> ;快照的结构 ;hProcess dd ? ;进程句柄 hMutex dd ? ;互斥句柄 dwCheckProcess dd ? ;检测指定进程是否在运行 szBuffer db MAX_PATH dup (?) szFileBuffer db MAX_PATH dup (?) ;ini文件名 szReturnBuffer db MAX_PATH dup (?) ;读取ini的值 ;************************************************ .code ;************************************************ ;************************************************ ;检查程序是否已运行,若已运行则退出。 ;************************************************ _CheckChongFu proc invoke CreateMutex,NULL,FALSE,addr szMutex .if eax ;CreateMutex返回NULL的话表示创建失败 mov hMutex,eax ;指向互斥句柄 invoke GetLastError ;若有一个程序在运行那么用GetLastError得到的值会是ERROR_ALREADY_EXISTS .if eax==ERROR_ALREADY_EXISTS ; invoke MessageBox,NULL,CTXT("已有程序在运行!"),CTXT("Error"),0 invoke ReleaseMutex,hMutex invoke ExitProcess,NULL .endif invoke ReleaseMutex,hMutex ; .else ; invoke MessageBox,NULL,CTXT("创建Muter失败!"),CTXT("Error"),0 .endif ret _CheckChongFu endp ;************************************************ ;检查程序是否已运行,若已运行则退出。 ;************************************************ ;************************************************ ;检查INI文件是否存在 ;************************************************ _CheckPath proc invoke GetCurrentDirectory,MAX_PATH,addr szFileBuffer invoke lstrcat,addr szFileBuffer,addr szConfigFile ;当前目录下的ini文件的路径 invoke PathFileExists,addr szFileBuffer ;0表示不存在 1表示存在 .if eax!=1 invoke MessageBox,NULL,CTXT("INI文件不存在,是否创建?"),CTXT("ERROR"),MB_OKCANCEL .if eax==IDOK invoke WritePrivateProfileString,addr szSection,addr szKeyName,addr szKeyValue,addr szFileBuffer .if !eax invoke MessageBox,NULL,CTXT("不能建立文件程序退出,是否有可写权限?"),CTXT("ERROR"),MB_OK invoke ExitProcess,NULL .endif .else invoke ExitProcess,NULL .endif .endif invoke GetPrivateProfileString,addr szSection,addr szKeyName,addr szKeyValue,addr szReturnBuffer,sizeof szReturnBuffer,addr szFileBuffer ret _CheckPath endp ;************************************************ ;检查INI文件是否存在 ;************************************************ ;************************************************ ;提升权限 ;************************************************ _SeDebugPrivilege proc local @stTkp:TOKEN_PRIVILEGES,@stLuid:LUID local @hToKen;:DWORD invoke GetCurrentProcess ;GetCurrentProcess得到得到的称之为"伪句柄"只是一个标识,你可以发现,其实就是返回$FFFFFFFF ;每个进程得句柄都是一样得,只是实用于进程内部得使用. ;如果你想得到实际得句柄,在进程间进行通讯,必需要进行转化, ;调用DuplicateHandle,注意,得实句柄使用完成以后,你必须要调用CloseHandle去关闭. ;其实,你应该明白了为何"伪句柄"得存在,就是使用简单,不用关闭, ;不会造成内存泄漏. mov ecx,eax ;直接用eax会出现register value overwritten by INVOKE invoke OpenProcessToken,ecx,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr @hToKen ;.if !eax ;返回0则表示出错 ; invoke MessageBox,NULL,CTXT("获取访问令牌句柄失败!"),CTXT("出错"),0 ; ret ;.endif ;invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stTkp.Privileges[0].Luid invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stLuid ;.if !eax ; invoke MessageBox,NULL,CTXT("获取当前进程权限失败!"),CTXT("出错"),0 ; ret ;.endif ;这些函数用在NT以上的系统,也可以在之前判断本系统是否是NT以上的系统。 ;第一个参数表示所要查看的系统,本地系统直接用NULL ;第二个参数表示所要查看的特权信息的名称,定义在winnt.h中 ;第三个参数用来接收所返回的制定特权名称的信息。 mov @stTkp.PrivilegeCount,1 ;*********************************************** ;invoke LookupPrivilegeValue,NULL,addr szPrivilegeName, addr @stTkp.Privileges[0].Luid ;用这个,下面这个push可以不要。因为直接已把特权信息放到@stTkp.Privileges[0].Luid中。 PUSH @stLuid.LowPart POP @stTkp.Privileges[0].Luid.LowPart PUSH @stLuid.HighPart POP @stTkp.Privileges[0].Luid.HighPart ;*********************************************** MOV @stTkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges,@hToKen,FALSE, addr @stTkp,sizeof TOKEN_PRIVILEGES,NULL,NULL ;.if !eax ; invoke MessageBox,NULL,CTXT("提升访问令牌权限失败!"),CTXT("出错"),0 ; ret ;.endif invoke CloseHandle,@hToKen ;invoke MessageBox,NULL,CTXT("权限已提升"),CTXT("OK"),0 ret _SeDebugPrivilege endp ;************************************************ ;提升权限 ;************************************************ ;************************************************ ;进程列举 ;************************************************ _ProcessList proc mov dwCheckProcess,0 ;列举进程时选把它置0 mov stSanp.dwSize,sizeof stSanp ;使用结构之前,要先设置大小 invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL ;得到当前的系统进程快照 mov hSanp,eax ;快照句柄传给hSanp Process32First invoke Process32First,hSanp,addr stSanp ;首次从快照得到一个进程信息 .while eax invoke CharUpper,addr stSanp.szExeFile ;把程序名转为大写 invoke lstrcmp,addr szReturnBuffer,addr stSanp.szExeFile ;lstrcmp 两字符串比较。区分大小写,相等则返回0 .if !eax ;相等 inc dwCheckProcess ;找到则加1 .endif invoke Process32Next,hSanp,addr stSanp ;用Process32Next循环从快照取得进程信息,直到取完进程,然后返回flase 从而退出 .endw invoke CloseHandle,hSanp ;关闭快照句柄 ret _ProcessList endp ;************************************************ ;进程列举 ;************************************************ ;************************************************ start: invoke GetModuleHandle,NULL mov hInstance,eax call _CheckChongFu ;防止重复运行 call _CheckPath ;检测ini文件 call _SeDebugPrivilege ;提权 mov dwCheckProcess,0 ;初始化 invoke CharUpper,addr szReturnBuffer .while TRUE invoke Sleep,60000 ;1分钟 call _ProcessList ;列举进程 .if dwCheckProcess==0 ;说明没找到指定的进程 invoke ExitWindows,EWX_REBOOT,0 invoke ExitProcess,NULL .endif .endw invoke ExitProcess,NULL end start ;************************************************