如何调用未公开的API函数[转]
2016-06-20 00:00
309 查看
Windows SDK开发包中并未提供所有的API函数,在本文中我将讨论如何调用这种未公开的API函数。
事实上所有未公开的API函数都和其它的API函数一样包含在系统的动态链接库中,调用这些函数的方法是取得它们的指针,然后通过指针来进行操作。而取得函数地址,是通过GetProcAddress这个API函数实现的:
当然,在取得地址之前,需要用LoadLibrary获得模块的句柄。还有,为了书写方便,最好用typedef将函数指针定义为一种类型。
下面我将通过两个例子来演示如何调用这些未公开的API函数。
一、有名称的函数
这种函数在DLL中拥有自己的函数名称,但是在SDK包中并没有提供声明,其中最有代表性的是RegisterServiceProcess函数:
这个函数的功能是在Win98下将进程注册为系统服务进程,很多木马程序的隐藏就是用这个函数实现的。调用它的示例代码如下:
二、无名称的函数
有的函数在DLL中并没有函数名称,这又如何调用呢?事实上所有的API函数无论有无名称,都会有一个ID,来在DLL中标识自己。比如函数RunFileDlg,它的ID是61,功能是显示系统“运行”对话框。下图所列的是我开发的进程管理软件July中所调用的“运行”对话框:
事实上调用这种函数的方法和前一种非常相似,唯一不同的只是把GetProcAddress的lpProcName参数使用MAKEINTRESOURCE宏将函数的ID转换一下即可。示例代码如下:
未公开的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函数”文档。
相关文章推荐
- 如何调用未公开的API函数[转]
- 用DirectX Audio和DirectShow播放声音和音乐(4)
- Nebula3学习笔记(7): 脚本系统
- 立法禁食猫狗肉属本末倒置
- RelativeLayout 深入理解
- AVP主动防御之隐藏进程
- D3D中的光照(3)
- hypervisor与VMware共存方法
- 终于弄到个百度Hi的邀请
- Lua脚本语法说明(修订)
- 多线程 C#解决方案小结
- 这样软件开发人才级别的划分你同意吗(ZT)
- WQL Analyzer V1.1(WMI查询分析器)
- 如何调用未公开的API函数[转]
- 何编写网络监视器
- 25种成为百万富翁的方法
- 易中天与单田芳的区别在哪儿
- 用DirectX Audio和DirectShow播放声音和音乐(4)
- 不要让捐款变了味
- 【ZT】中西医的区别