调用未公开的API函数的方法

所属分类: 软件教程 / 编程开发 阅读数: 1312
收藏 0 赞 0 分享
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

更多精彩内容其他人还在看

Authorware怎么插入擦除图标?

Authorware怎么插入擦除图标?Authorware中制作课件很简单,想要插入擦除图标,该怎么制作呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

Authorware课件怎么绘制圆角矩形?

Authorware课件怎么绘制圆角矩形?Authorware制作课件的时候,想要绘制圆角矩形,该怎么绘制呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL Workbench8.0中文汉化安装破解详细教程(附汉化补丁下载)

Mysql workbench8.0中文版是一款Mysql官方推出的数据库设计建模工具,可以用Mysql workbench中文版设计和创建新的数据库图示,建立数据库文档,下面带来的是Mysql workbench8.0官方64位汉化安装步骤,大家参考下
收藏 0 赞 0 分享

vs2013同名变量或函数高亮显示怎么设置?

vs2013同名变量或函数高亮显示怎么设置?vs2013代码可以添加高亮,想要让同名变量或函数高亮显示,该怎么设置呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

VS2017怎么激活?Visual Studio 2017中文正式版激活破解详细教程(附key密钥)

visual studio 2017是一款微软的vs系列集成开发环境,启动速度比Visual Studio 2015快3倍,但默认只有30天的试用期,那么vs2017怎么激活呢?下面就整理了vs2017注册激活步骤,大家参考下
收藏 0 赞 0 分享

VisualStudio怎么区分三种项目工程?

VisualStudio怎么区分三种项目工程?VisualStudio经常创建三种项目工程,分别是MFC应用程序、Win32控制台程序、Win32项目,该怎么区分恩?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

VisualStudio怎么判断数据是否DBNull?

VisualStudio怎么判断数据是否DBNull?VS2015中插入的数据想要判断是否DBNull,该怎么判断呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

UltraEdit方案和工作区怎么备份?

UltraEdit方案和工作区怎么备份?UltraEdit经常用于编程开发,想要备份方案和工作区,该怎么设置呢?下面我们就来看看详细的教程,需要的朋友可以参考下
收藏 0 赞 0 分享

VS2017怎么新建空项目?

VS2017怎么新建空项目?VS2017中想要创建空项目,该怎么创建呢?下面我们就来看看VS2017创建空项目的教程,很简单,需要的朋友可以参考下
收藏 0 赞 0 分享

VB6.0怎么调出被关闭的工具窗口?

VB6.0怎么调出被关闭的工具窗口?VB6.0中的窗口关闭了,想要重新打开,该怎么打开呢?下面我们就来看看VB6.0打开窗口的教程,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多