VFP作為比較早引進中國的數(shù)據(jù)庫軟件曾經(jīng)風靡全國,當時很多人學習電腦的必修課程就有VFP數(shù)據(jù)庫。VFP的全稱是Microsoft Visual FoxPro,目前最新的版本是9.0??上У氖前l(fā)行VFP的微軟公司已經(jīng)聲明不再發(fā)行新的VFP版本了,也就是說VFP到了9.0就是最新的也是最后的版本了。
既然VFP的數(shù)據(jù)庫功能已經(jīng)被很多人所了解,所以現(xiàn)在我就想談談VFP的非數(shù)據(jù)庫應用。
服務器對于每一個公司來說都是很重要的,因為里放著大量公司的數(shù)據(jù),如何保證服務器的安全不被外來程序所入侵就顯得很重要了。我們的處理方法就是在保證服務器正常的情況下先記錄著服務器運行的所有程序和進程,服務器正式上線后就是這份記錄為原本,發(fā)現(xiàn)與原本不同程序或者進程在服務器里運行就要自動提示,提示讓服務器管理員來進行核查。先看一下實例:
DECLARE integer LoadLibrary IN WIN32API string 載入指定的動態(tài)鏈接庫
DECLARE integer FreeLibrary IN WIN32API integer釋放指定的動態(tài)鏈接庫
DECLARE integer GetProcAddress IN WIN32API integer hModule, string procname
DECLARE integer GetProcessHeap IN WIN32API 獲取和調(diào)用過程的堆句柄
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 找創(chuàng)建者
DECLARE Integer RtlAdjustPrivilege IN ntdll.dll Integer Privilege,Integer Enable,Integer;
Client,Integer @WasEnabled 提升當前系統(tǒng)用戶的權(quán)限,因為權(quán)限不夠有API函數(shù)提取了進程
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)) 指定的堆上分配內(nèi)存,并且分配后的內(nèi)存不可移動。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\" )檢索指定的動態(tài)鏈接庫)中的輸出庫函數(shù)地址
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
上面的實例就是顯示本服務器正在運行的程序窗口和它的進程號,只要加上數(shù)據(jù)庫記錄就可以成為一個完整的服務器監(jiān)控程序了,由于篇幅的原因,我就僅做監(jiān)控這一部份的描述了。
其實上面的代碼也是一個殺毒軟件的雛形了,只要加上中斷進程的代碼就可以成為一個自己專用的殺毒軟件,也更能保證服務器的安全了,由些可見VFP非但沒有沒落,反而是有很大的前途,所以廣大的VFP愛好者不要灰心,把自己的VFP用好。
參考文獻
[1] VFP中的API應用大全
[2]楊文,黃文濤.《通用自動測試系統(tǒng)的軟件設計與實現(xiàn)》.《工業(yè)控制計算機》. 2012年第25卷第1期
[3]陳建華,苗放.《Windows線程、窗口與消息內(nèi)在機制研究》《微計算機信息》,2007年12期