调用未公开的API函数的方法
程序员文章站
2022-06-19 22:26:15
调用未公开的API函数的方法...
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函数”文档。
附件:
事实上所有未公开的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函数”文档。
附件: