browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

如何调用未公开的API函数

Posted by on 2003 年 09 月 13 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

Windows SDK开发包中并未提供所有的API函数,在本文中我将讨论如何调用这种未公开的API函数。

事实上所有未公开的API函数都和其它的API函数一样包含在系统的动态链接库中,调用这些函数的方法是取得它们的指针,然后通过指针来进行操作。而取得函数地址,是通过GetProcAddress这个API函数实现的:

1
2
3
4
FARPROC WINAPI GetProcAddress(
    HMODULE hModule,  // DLL模块句柄
    LPCSTR lpProcName // 函数名称
);

当然,在取得地址之前,需要用LoadLibrary获得模块的句柄。还有,为了书写方便,最好用typedef将函数指针定义为一种类型。

下面我将通过两个例子来演示如何调用这些未公开的API函数。

一、有名称的函数

这种函数在DLL中拥有自己的函数名称,但是在SDK包中并没有提供声明,其中最有代表性的是RegisterServiceProcess函数:

1
2
3
4
DWORD WINAPI RegisterServiceProcess(
    DWORD dwProcessId, // 进程ID
    DWORD dwType       // 注册种类,1表示注册
);

这个函数的功能是在Win98下将进程注册为系统服务进程,很多木马程序的隐藏就是用这个函数实现的。调用它的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
typedef DWORD (WINAPI * REGISTER)(DWORD, DWORD);
 
HMODULE hModule;
REGISTER RegisterServiceProcess;
 
hModule = LoadLibrary(_T("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转换一下即可。示例代码如下:

1
2
3
4
5
6
7
8
9
typedef void (WINAPI * RUN)(HWND, HICON, LPCSTR, LPCSTR, LPCSTR, UINT);
 
HMODULE hShell32;
RUN RunFileDlg;
 
hShell32 = LoadLibrary(_T("shell32.dll"));
RunFileDlg = (RUN)GetProcAddress(hShell32, MAKEINTRESOURCEA(61));
RunFileDlg(hParent, hIcon, NULL, NULL, NULL, 0);
FreeLibrary(hShell32);

未公开的API函数的调用方法就介绍到这里了。事实上还有很多这样的函数,关于这些函数的介绍及使用方法,请下载我的“未公开的Windows API函数”文档。

附件:api.zip

订阅本站

2 Comments

  • At 2007.10.26 14:59, said:

    马哥,怎么下不了呀!
    下载我的“未公开的Windows API函数”文档

    • At 2007.10.26 15:11, 李马 said:

      To 我:
      链接已修复,请重新下载。

      (Required)
      (Required, will not be published)