我对Windows API拦截技术经典之作Matt Pietrek的<<Windows 95 System Programming Secret>>第十章的研究

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

拜读了<<程序员>>杂志 2001年2月号,“编写Win32 API钩子”文章后,对文中提及的如何将DLL插入到其它进程地址空间中所总结的5种方法,产生了极大兴趣,尤其对作者认为最好的但也是最复杂的第五种方法。通过研究发现这第五种方法,即:使用CreateProcess, WaitForDebugEvent,WriteProcessMemory, LoadLibrary等函数将DLL注入到被监控程序空间中,正是Matt Pietrek的<<Windows 95 System Programming Secret>>第十章中所使用的方法。通读该书第十章,不禁要为Matt Pietrek所阐述技术的独到精辟喝彩。虽然该书已经很老,但其附带软盘中的EXE执行程序及DLL在Windows 98, Windows NT4.0下依然可以正常运转。美中不足之处是书中例子代码全部由C程序及汇编文件构成。在VC++6.0下编译通不过,原因是其中一个汇编文件ASMRETRN.asm 在VC++6.0下不知如何编译,为解决这个问题我先后尝试了以下方法:

1) 使用汇编编译器MASM611
将ASMRETRN.asm单独编译成.obj文件后再和其它文件链接。虽然可以解决问题,但总觉得到不方便,所以我尝试将ASMRETRN.asm文件改写成C++文件(其它文件已全部改成C++文件) 。
2) 将ASMRETRN.asm文件改写成C++文件
我使用 _asm关键字修饰 ASMRETRN.asm文件中的汇编语句如下:


void AsmCommonReturnPoint(void)
{
_asm SUB ESP,4   ; Make space for return address
_asm PUSHAD
… …
}


并将ASMRETRN.asm改为ASMRETRN.cpp,然后编译,虽然编译成功,但运行失败。
经过Debug并跟踪汇编代码后,发现C++编译器在每个函数的开头及结尾处都加入了用于保护恢复寄存器的前导和后缀代码。由于这些额外的代码,使得原来精确控制堆栈的汇编程序不再精确,所以程序运行失败。我想也许这也是Matt Pietrek没有将全部程序用C实现的原因。参见原文,Matt Pietrek在文章中说“在我动手编写APISPY32时,我想全用C。不巧,为了在被拦截的函数返回时对我们玩的堆栈进行很好的控制,我无法编写一个清晰的C程序。… …”。 虽然改写遇到了困难,但我没有因此而停止。经过不懈努力我发现了解决这一困难的方法:使用 _declspec(naked)宣言。_declspec(naked) 是微软对C语言的扩充。可以抑制编译器为函数产生前导和后缀代码(the compiler generates code without prolog and epilog code.) 通过如下改写:


_declspec(naked) void AsmCommonReturnPoint(void)
{
_asm SUB  ESP,4   ; Make space for return address
_asm PUSHAD
… …
}


ASMRETRN.asm在精确保持原有功能的前提下改为了ASMRETRN.cpp文件,并且运行成功。至此我已将原程序全部移植到VC++60环境下。

进一步测试,我发现当跟踪的目标程序是Debug版时程序运行正常。但跟踪的目标程序是release版时, 我们的跟踪程序不能拦截目标程序的Windows API函数调用,这是一个严重的BUG!经过多次调试,我终于发现了原因所在。原来在某些release版程序中,存放函数导入表(IAT) 的“.idata”节和其它节进行了合并,并且存放合并后数据的页的页属性为不可写。所以当我们试图改写IAT中函数地址到我们自己的stub函数时,发生页面访问错误。知道了原因,修改就相对容易了。只需将存放函数导入表(IAT) 的“.idata”节所在页的页属性强制改为可写,在替换完IAT表中函数地址后再将页属性还原。 OK,现在可以跟踪release版目标程序了。

现在来进行多平台测试。Window 9x,windows ME, Window NT40运行正常, 但Windows 2000下运行失败。原因是DLL不能被注入到目标程序中。为什么?好象是注入DLL时的有关LoadLibrary() 的一段机器码出了问题,现在该问题正在研究中。希望对Windows API拦截技术,尤其是对Matt Pietrek的<<Windows 95 System Programming Secret>>第十章中所使用的技术有所了解的高手,能够给我提供一些线索指导,这也是我写这篇文章的目的之一。
在此,先对能为我提供帮助的所有朋友,大师,高手表示感谢。同时也希望能和更多的网友切磋技艺,互通有无。


我的M-mail: hanjin@pecan.com.cn 欢迎来信。

Matt_Pietrek's_PE_Tutorial 很详细的一个PE格式文件说明,喜欢逆向分析的朋友可以看看, 立即下载

相关推荐

PEDUMP - Matt Pietrek

PEDUMP - Win32/Win64 EXE/OBJ/LIB/DBG file dumper - 2001 Matt Pietrek PE 文件分析器,包含两个版本的源代码. 本文件来自网上.

逆向与破解-windows异常处理机制

以前看到过的很棒的一个讲解SEH的,非常的详细和简单易懂,不需要特别纠结具体的结构和处理的方法,初期对过程有一定的掌握就可以。以下为原文 深入解析结构化异常处理(SEH) - by Matt Pietrek 尽管以前写过一篇SEH相关的文章《关于SEH的简单总结》, 但那真的只是皮毛,一直对Windows异常处理的原理似懂非懂, 看了下面的文章 ,一切都豁然开朗.1997年文章,Window...

iamsongyu的博客 2920

PEDUMP - Win32/Win64 EXE/OBJ/LIB/DBG file dumper - 2001 Matt Pietrek

PEDUMP - Win32/Win64 EXE/OBJ/LIB/DBG file dumper - 2001 Matt Pietrek 支持win64文件.

深入解析结构化异常处理(SEH) - by Matt Pietrek

深入解析结构化异常处理(SEH) - by Matt Pietrek

dvlinker的技术专栏 5万+

Matt Pietrek访谈,谈他对.NET的看法及Numega工作情况(英文)

 What do you think about possibility of porting .NET Framework to non-Windows platform? It is technically possible now? Or there are issues must be solved for this? Do you think well see such p

cccc2002的专栏 902

Matt Pietrek 讲解SEH的巨牛文章,留下来慢慢研究

A Crash Course on the Depths of Win32 Structured Exception Handling Matt Pietrek 著 董岩 译原文:http://www.microsoft.com/msj/0197/exception/exception.aspx 在Win32操作系统提供的所有功能中,使用最广泛而又没有公开的恐怕要数结构化异常处理(Struct...

weixin_34414650的博客 327

Windows XP下的向量异常处理

Windows XP下的向量异常处理   作者:Hume/冷雨飘心·发布日期:2002-8-9· 原作名称: Vectored

xyblack技术地带 589

中断和异常

中断和异常 本文是MattPietrek在1997年月10月的MSJ杂志UnderTheHood专栏上发表的文章。中断和异常在DOS时代是整个系统的灵魂,但Windows已将其隐藏到了系统深处。MattPietrek详细剖析了Windows下的中断和异常及其处理机制以及内核模式与用户模式代码之间调用的问题。作者还提供了一个比较有意思的实验程序。 注:附...

weixin_34319111的博客 490

窥探PE文件内幕:Win32 PE 文件格式之旅1

<br />Matt Pietrek <br />1994 年3月 <br />Matt PietrekWindows Internals (Addison-Wesley, 1993)的作者。他就职于Nu-Mega 技术有限公司,可通过CompuServe: 71774,362联系到他。 <br />这篇文章出自1994年3月发行的Microsoft系统期刊。版权所有﹫1994 Miller Freeman, Inc.保留所有权利。未经Miller Freeman同意,这篇文章的任何部分不得以任何形式被

zhangxinrun的专栏 1384

Matt Pietrek先生的《深入探索PE文件结构》

<br />网址:http://www.360doc.com/content/10/0113/14/59579_13431451.shtml<br /> <br />译者是姜庆东先生

百里鹤的专栏 3066

书-windows

1. Windows Internals /Matt Pietrek /Addison Wesley 2. Undocumented Windows /Andrew Schulman, David Maxey, Matt Pietrek /Addison Wesley 3. Windows 95 System Programming Secrets /Matt Pietrek /IDG Boo

懒骨头 777

Windows程序调试----第三部分 调试技术----第8章基本调试技术

第三部分调试技术 第8章基本调试技术     本章回答了很多Windows下调试程序的常见问题,主要是基本的调试技术。所以它看起来可能有点像Windows调试常见问题解答,其中很多是我在调试新闻组里见到的问题。 8.1普通调试技术 我应该采取什么步骤使得我调试代码的能力最大?     请釆取以下步骤:     •重定位你的程序的可执行代码以防止虚拟地址空间冲突。关于虚拟地址空间冲突和重

tiewen的专栏 3118

PEDUMP 即PE文件解读的源程序, 可以获取所有的PE文件内容

PEDUMP 即PE文件解读的源程序, 可以获取所有的PE文件内容

Matt Pietrek

http://www.glamenv-septzen.net/view/768  Matt Pietrek氏MSJ私家版PDF Matt Pietrek氏のMicrosoft System Journalの記事で、個人的にPDFに変換した記事:  Jan 1997, SEH(構造化例外処理)のコンパイラレベル・OSレベルでの内部動作紹介 http://w

thtfpcuser的专栏 1094

对于结构化异常处理(SEH)的进一步探索

写本文的起因 Matt Pietrek 关于结构化异常处理的文章 A Crash Course on the Depths of Win32 Structured Exception Handling 是一篇很棒的文章(在本文末的“相关文章”中有我整理过的中文版文章链接),对于我了解 Win32 下的这种异常处理机制帮助很大。在仔细读完整篇文章、跟踪过相关代码的执行流程后,仍有意犹未尽的感觉。本文

Victor 的专栏 1744

启用PAE机制下虚拟地址到物理地址的转换

启用PAE机制下虚拟地址到物理地址的转换最近突然想起用softice手工计算一下虚拟地址到物理地址的转换,理论的东西如段表、页表等还是好理解的,但真正实际操作就碰到了大问题,特别是分页机制,根本不是从cr3到页目录表到页表再到物理地址这么简单,后来读了一下《Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual》(Volume

cuagain的专栏 942

顺序表(Sequential List)详解:从数组到 C 语言实现

顺序表是用连续存储单元依次存储数据元素的线性结构,数组则是其最常见的实现方式,两者本质相同、仅视角不同——数组关注物理存储,顺序表关注逻辑关系。顺序表支持随机访问 $O(1)$,但插入删除需移动元素,效率为 $O(n)$。本文用 C 语言静态数组完整实现了顺序表的初始化、增删改查操作,帮助初学者在不涉及指针的前提下理解其核心原理,为后续学习动态顺序表打下基础。

Guangyu536的博客 285
下一篇: 如何理解C run-time library (C运行时库)
han012
博客等级 码龄25年 4粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值