国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 編程設計 > 正文

調用未公開的API函數的方法

2020-07-14 13:42:25
字體:
來源:轉載
供稿:網友
Windows SDK開發包中并未提供所有的API函數,在本文中我將討論如何調用這種未公開的API函數。

事實上所有未公開的API函數都和其它的API函數一樣包含在系統的動態鏈接庫中,調用這些函數的方法是取得它們的指針,然后通過指針來進行操作。而取得函數地址,是通過GetProcAddress這個API函數實現的:

FARPROC WINAPI GetProcAddress(
HMODULE hModule, // DLL模塊句柄
LPCSTR lpProcName // 函數名稱
);


當然,在取得地址之前,需要用LoadLibrary獲得模塊的句柄。還有,為了書寫方便,最好用typedef將函數指針定義為一種類型。

下面我將通過兩個例子來演示如何調用這些未公開的API函數。

一、有名稱的函數

這種函數在DLL中擁有自己的函數名稱,但是在SDK包中并沒有提供聲明,其中最有代表性的是RegisterServiceProcess函數:

DWORD WINAPI RegisterServiceProcess(
DWORD dwProcessId, // 進程ID
DWORD dwType // 注冊種類,1表示注冊
);


這個函數的功能是在Win98下將進程注冊為系統服務進程,很多木馬程序的隱藏就是用這個函數實現的。調用它的示例代碼如下:

typedef DWORD (WINAPI * REGISTER)( DWORD, DWORD );
HMODULE hModule;
REGISTER RegisterServiceProcess;
hModule = LoadLibrary( "kernel32.dll" );
if ( hModule != NULL )
{
RegisterServiceProcess = (REGISTER)GetProcAddress( hModule, "RegisterServiceProcess" );
RegisterServiceProcess( GetCurrentProcessId(), 1 );
FreeLibrary( hModule );
}


二、無名稱的函數

有的函數在DLL中并沒有函數名稱,這又如何調用呢?事實上所有的API函數無論有無名稱,都會有一個ID,來在DLL中標識自己。比如函數RunFileDlg,它的ID是61,功能是顯示系統“運行”對話框。下圖所列的是我開發的進程管理軟件July中所調用的“運行”對話框:

 

事實上調用這種函數的方法和前一種非常相似,唯一不同的只是把GetProcAddress的lpProcName參數使用MAKEINTRESOURCE宏將函數的ID轉換一下即可。示例代碼如下:

typedef void (WINAPI* RUN)( HWND, HICON, LPCSTR, LPCSTR, LPCSTR, UINT );
HMODULE hShell32;
RUN RunFileDlg;
hShell32 = LoadLibrary( "shell32.dll" );
RunFileDlg = (RUN)GetProcAddress( hShell32, MAKEINTRESOURCE( 61 ) );
RunFileDlg( hParent, hIcon, NULL, NULL, NULL, 0 );
FreeLibrary( hShell32 );


未公開的API函數的調用方法就介紹到這里了。事實上還有很多這樣的函數,關于這些函數的介紹及使用方法,請下載我的“未公開的Windows API函數”文檔。
附件:/do/uploads/soft/api.rar

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武穴市| 八宿县| 华蓥市| 进贤县| 马山县| 六安市| 远安县| 界首市| 天津市| 三亚市| 稷山县| 扬州市| 中方县| 比如县| 尤溪县| 南宁市| 腾冲县| 宾阳县| 壶关县| 饶阳县| 和政县| 陕西省| 颍上县| 韶山市| 华阴市| 噶尔县| 孟连| 沽源县| 宜昌市| 三门县| 会昌县| 施甸县| 吉安县| 灌云县| 汪清县| 和静县| 灌南县| 罗源县| 满城县| 湘乡市| 龙江县|