时间:2022-06-27 12:54:55
VFP作为比较早引进中国的数据库软件曾经风靡全国,当时很多人学习电脑的必修课程就有VFP数据库。VFP的全称是Microsoft Visual FoxPro,目前最新的版本是9.0。可惜的是发行VFP的微软公司已经声明不再发行新的VFP版本了,也就是说VFP到了9.0就是最新的也是最后的版本了。
既然VFP的数据库功能已经被很多人所了解,所以现在我就想谈谈VFP的非数据库应用。
服务器对于每一个公司来说都是很重要的,因为里放着大量公司的数据,如何保证服务器的安全不被外来程序所入侵就显得很重要了。我们的处理方法就是在保证服务器正常的情况下先记录着服务器运行的所有程序和进程,服务器正式上线后就是这份记录为原本,发现与原本不同程序或者进程在服务器里运行就要自动提示,提示让服务器管理员来进行核查。先看一下实例:
DECLARE integer LoadLibrary IN WIN32API string &&载入指定的动态链接库
DECLARE integer FreeLibrary IN WIN32API integer&&释放指定的动态链接库
DECLARE integer GetProcAddress IN WIN32API integer hModule, string procname
DECLARE integer GetProcessHeap IN WIN32API &&获取和调用过程的堆句柄
DECLARE integer HeapAlloc IN WIN32API integer hHeap, integer dwFlags, integer dwBytes
DECLARE integer HeapFree IN WIN32API integer hHeap&&, integer dwFlags, integer lpMem
DECLARE integer GetWindowText IN WIN32API integer,string @,integer &&获得窗口名
DECLARE integer EnumChildWindows IN WIN32API integer hWnd, integer lpEnumProc, integer lParam
DECLARE INTEGER GetWindowThreadProcessId IN user32 INTEGER hWnd,INTEGER @lpdwProcId &&找创建者
DECLARE Integer RtlAdjustPrivilege IN ntdll.dll Integer Privilege,Integer Enable,Integer;
Client,Integer @WasEnabled &&提升当前系统用户的权限,因为权限不够有API函数提取了进程
SE_DEBUG_PRIVILEGE = 20
?RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, 1, 0, 0)
LOCAL cCmd,hProcHeap,cCmdnAddr,hModule,nAddr
CREATE cursor WindHwnds (hWnd i,窗口名C(100),返回值N(10),进程号N(10))
cCmd=STRCONV ("INSERT INTO WindHwnds (hWnd) VALUES (%d)"+0h00,5)
hProcHeap = GetProcessHeap( )
cCmdnAddr = HeapAlloc(hProcHeap, 0,LEN(cCmd)) &&指定的堆上分配内存,并且分配后的内存不可移动。SYS(2600,cCmdnAddr,LEN(cCmd),cCmd) hModule=LoadLibrary("msvcrt")
nAddr=GetProcAddress(hModule,"swprintf")
CallDllCode1=0hB8+BINTOC(nAddr,"4rs")+0hFFD0 FreeLibrary(hModule)
hModule=LoadLibrary("oleaut32")
nAddr=GetProcAddress (hModule,"SysAllocString" )&&检索指定的动态链接库)中的输出库函数地址
CallDllCode2=0hB8+BINTOC(nAddr,"4rs")+0hFFD0 nAddr=GetProcAddress(hModule,"SysFreeString")
CallDllCode3=0hB8+BINTOC(nAddr,"4rs")+0hFFD0 FreeLibrary(hModule)
sCode=0h558BEC81ECD00700008B450850B8+BINTOC(cCmdnAddr,"4rs")
sCode=sCode+0h508D45A050+CallDllCode1
sCode=sCode+0h83C40C8D45A050 +CallDllCode2
sCode=sCode+0h8945F050B8+BINTOC(SYS (3095,_vfp),"4rs")
sCode=sCode+0h508B000584000000FF1083F800+CallDllCode3 sCode=sCode+0hB8010000008BE55DC20800 AdrCode=HeapAlloc(hProcHeap,0,LEN(sCode)) SYS(2600,AdrCode,LEN(sCode),sCode)
EnumChildWindows(0,AdrCode,0)&&枚举一个父窗口的所有子窗口
HeapFree(hProcHeap) &&作用与HeapAlloc相反GO TOP
DO WHILE !EOF( )
nBufsize = 2048
cBuffer = REPLICATE(CHR(0), nBufsize)
nBufsize=GetWindowText(windhwnds.hwnd,@cBuffer,nBufsize)
lpdwProcId=0
AA99=RECNO( )
UPDATE windhwnds SET窗口名= CHRTRAN(cBuffer,CHR(0),SPACE(0)),返回值;
=GetWindowThreadProcessId (windhwnds.hwnd,@lpdwProcId),进程号=lpdwProcId WHERE AA99=RECNO( )
GO AA99
SKIP
ENDDO
Brow width 15
Return
上面的实例就是显示本服务器正在运行的程序窗口和它的进程号,只要加上数据库记录就可以成为一个完整的服务器监控程序了,由于篇幅的原因,我就仅做监控这一部份的描述了。
其实上面的代码也是一个杀毒软件的雏形了,只要加上中断进程的代码就可以成为一个自己专用的杀毒软件,也更能保证服务器的安全了,由些可见VFP非但没有没落,反而是有很大的前途,所以广大的VFP爱好者不要灰心,把自己的VFP用好。
参考文献
[1] VFP中的API应用大全
[2]杨文,黄文涛.《通用自动测试系统的软件设计与实现》.《工业控制计算机》. 2012年第25卷第1期
[3]陈建华,苗放.《Windows线程、窗口与消息内在机制研究》《微计算机信息》,2007年12期