文档章节

如何调用未公开的API函数[转]

rise-worlds
 rise-worlds
发布于 2016/06/20 13:14
字数 615
阅读 3
收藏 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函数”文档

本文转载自:http://www.cnblogs.com/flying_bat/archive/2007/11/07/951868.html

rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
再议.Net中null的使用规范

在上一文中,论述两个.Net Framework对null应用不够合理的例子。大家评论中,给出了不少指导性意见,这里也对.Net中null的使用规范作一下总结。 1. Empty代表瓶子是空的,null代表瓶子都没有...

老朱教授
2017/10/08
0
0
[架构设计]反向(或者后向)插件系统设计

反向(或者后向)插件系统与正向(或者前向)插件系统是一对概念相对的设计模式。正向插件系统是指系统架构的时候预先定义好一系列用于某种特定目的的函数族,然后通过共享库的形式封装不同的...

梁欢
2014/06/25
0
0
SQL Server 连接基础知识

SQL Server 连接基础知识 摘要:SQL Server 2000 客户端通过由 API、对象库和协议组成的堆栈连接到 SQL Server。Ken Henderson 将逐一介绍该堆栈的每个组成部分,并说明它们如何工作以及如何...

日久不生情
2017/11/21
0
0
dva应用中reducers和effects的单元测试实战

前言 为了确保软件质量,保证函数逻辑的正确性,我们一般会进行单元测试。本文主要讲述了在基于dva框架的应用中,我们是如何对model中的和进行单元测试的,以及背后的一点原理。 dva框架 这是...

Lingzhi
03/25
0
0
连接 COM 与.NET 的桥梁(二) COM 服务器的 P/Invoke 方式

转载:VC知识库 http://www.vckbase.com/document/viewdoc/?id=1622 连接 COM 与.NET 的桥梁(二) COM 服务器的 P/Invoke 方式 作者:caeser2 下载源代码 一、COM 服务器 --> COM 客户端 这是...

长征2号
2017/10/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker中部署的应用,获取含有中文字符的验证码图片时无法正常显示

使用docker过程中遇过的最诡异的问题,服务在本地环境中,通过在IDEA里面运行,或者使用java -jar ***.war运行,获取验证码图片都没有问题,但是运行在docker中,图片正常返回,但是上面的汉...

莫在全
20分钟前
1
0
postgres+socket.io+nodejs实时地图应用实践

nodejs一直以异步io著称,其语言特性尤其擅长于在realtime应用中,如聊天室等。在进行实时应用开发时,必不可少的需要用到 socket.io库,可以说,nodejs+socket.io在实时应用中具有较好的表现...

dragon_tech
26分钟前
2
0
Java开发面试题汇总

目前流行的开发技术、常见的面试问题以及问题的答案都已经写的特别清楚了,今天我在之前的基础上,再基于个人的经验继续精选一些面试题给大家阅读参考。 1,Java的反射 Java 反射机制是在运行...

花漾年华
30分钟前
4
0
聊聊flink jdbc的ParameterValuesProvider

序 本文主要研究一下flink jdbc的ParameterValuesProvider ParameterValuesProvider flink-jdbc_2.11-1.8.0-sources.jar!/org/apache/flink/api/java/io/jdbc/split/ParameterValuesProvide......

go4it
30分钟前
1
0
UserInputControls用户输入控制

enum UserInputControls { kGovernedByOrthoMode = 0x0001,//正交模式管理 kNullResponseAccepted = 0x0002,//允许输入空 kDontEchoCancelForCtrlC = 0x0004,//ctrl C 模式不能重复......

一个小妞
52分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部