Windows 消息拦截之深入篇
在叙述深入篇时,我们先假设“拦截Windows消息”你已看过。如果没看的话,建议最好先看看!
打个比喻,相当于我们在破解道路中小孩子学步需要一定的依靠一样(一种参考)!那么我们什么时候
不在需要依靠了呢?
此篇既是解决上述问题的提出!!!
我们先用具有Ring 0层权限的SoftIce开始一步一步展开说明如何解决不依赖具体的如Vc、Vb、Delphi
等的消息拦截过程。换句话说,不论什么程序拿到手之后我们不再去研究它的消息映射实现方法。而将
精力集中于主要程序的破解过程(实现过程)。至于加密也好、不加密也好至少我们可以看到一个我们
所关心的功能的实现过程。从而使我们的编程经验不断提高,牛顿说过“我只不过是站在巨人的肩膀上”
那么我们如何站到这个巨人的肩膀上呢?
好了,自此篇开始时我已将我们遇到的问题提出了!
切入正题!!!
说明:为了更好的理解此篇的内容,我先用具有Ring 0 层的SoftIce开始讲解Vc编译的程序拦截消息
的过程。之后将会引申到其它程序(Vb、Delphi等)的消息拦截过程,以及由此产生的一种通用方法的来
源。
SoftIce中截获消息是利用加载程序后,利用具有系统级中断权力来找到所关心的消息处理函数。
如下所示: >_____________>
原理 K32thk1632Prolog | |
菜单处理程序 ------> 第一返回点
K32thk1632Epilog <---------------<
第一次返回后往上的调用语句既是此函数的调用地址。即此消息的处理函数。大多数新人在
跟到菜单处理程序入口时都会徘徊、彷徨担心找不到正确的处理函数。其实大可不必担心,用SoftIce时
因其具有系统级中断能力并提供了F12--运行直到返回功能。换句话说当我们来到菜单处理程序程序入口
处时只需按F12运行。当系统找到处理函数时,即:一步一步进行压栈直到栈顶时遇到第一条RET语句时中断
,让我们看看系统是如何做的:
1. 2. 3. 4. 菜单处理程序.
. . . . .
. . . . .
. . . . .
call 2. call 3. call 4. call 菜单处理程序 call XXXX
. . . . .
. . . . .
RET RET RET RET RET
第一条返回语句
于是我们很轻松的能找到所关心的消息处理函数处(没想到这么Easy!我都曾经郁闷过!吃不好
睡不好!!!)。可是在没有系统级中断权力时,其它一些应用级调试级工具又是如何做到这一点的呢?
首先,这些应用级调试工具会先搭建一虚拟机以便模拟运行这些需要调试的二进制程序。
其次,它们都能提供一个基本的功能,即字符串的参考功能。当处理程序需要用到这些字符
串时,应用级调试工具在我们设定的(在虚拟机中)中断处来到消息处理函数内部。
之后,我们依次返回就可找到消息处理函数的入口点。
于是,我们明白了。即使在XP下针对一些调试软件如SoftIce等工作在系统Ring 0级作一定
防范时,我们也照样可以分析感兴趣的软件。只不过换了一种方式而已。而分析过程并没有因工作在
Ring 0还是Ring 3而改变。
附:SoftIce跟踪消息处理时的路径(不用任何工具,只用SoftIce的bmsg和F12来拦截消息处
理函数),目的在于引申至应用调试级程序的拦截方式。
:BMSG XXXX WM_COMMAND DO "BC *" 或BMSG XXXX WM_LBUTTONUP DO "BC *"
:G ;在破解程序中随便点击一个菜单选项(当然必须是完成一定功能的选项),发生
;中断
KERNEL.Alloc
:F12
USER!MSGTHKCONNECTIONDATALS+0FA3
:F12
USER!BEAR498+016F
:F12
USER!GETUSERLOCALOBJTYPE+0607
:F12
USER!ENABLEWINDOW+0012
:F12
KERNEL.Alloc
:F12
MFC42!.text+69846;说明此程序是Vc编写的,发行版本为Release.如是调试版本为
;MFC42D!.text+XXXXX
:F12
MFC42!.text+887A
:F12
MFC42!.text+1057
:F12
MFC42!.text+0CE4
:F12
MyProg!.text+000713BE
:F12
MFC42!.text+0C6D
:F12
MFC42!.text+0BF6
:F12
MFC42!.text+0BB5
:F12
消息处理起点 KERNEL32!_FREQASM+2637 //----------------------
:F12 |
KERNEL32!.text+0001B732 //***************** |
:F12 * |
KERNEL32!.text_FREQASM+09B6 * |
:F12 * |
USER!MSGTHKCONNECTIONDATALS+1003 * |
:F12 * |
USER!BEAR498+016F * |
:F12 * |
USER!GETUSERLOCALOBJTYPE+0680 * |
:F12 * |
USER!ENABLEWINDOW+0012 * |
:F12 * |
KERNEL.Alloc * |
:F12 * |
MFC42!.text+0005C786 * |
:F12 * |
MyProg!.text+000440E4 //第一返回点 * |
//(处理函数) * |
:F12 * |
MFC42!.text+13D5 //系统处理消息路径 * |
:F12 * |
MFC42!.text+12A9 //系统处理消息路径 * |
:F12 * |
MFC42!.text+1BF3 //系统处理消息路径 * |
:F12 * |
MFC42!.text+FDBF //系统处理消息路径 * |
:F12 * |
MyProg!.text+00070D9D //系统处理消息路径 * |
:F12 * |
MFC42!.text+1973 //系统处理消息路径 * |
:F12 * |
MFC42!.text+19D2 //系统处理消息路径 * |
:F12 * |
MFC42!.text+6A924 //系统处理消息路径 * |
:F12 * |
MFC42!.text+0DC6 //系统处理消息路径 * |
:F12 * |
MFC42!.text+0CE4 //系统处理消息路径 * |
:F12 * |
MyProg!.text+713BE //系统处理消息路径 * |
:F12 * |
MFC42!.text+0C6D //系统处理消息路径 * |
:F12 * |
MFC42!.text+0BF6 //系统处理消息路径 * |
:F12 * |
MFC42!.text+0BB5 //系统处理消息路径 * |
:F12 * |
消息处理终点 KERNEL32!_FREQASM+2637 //-----------------*---
KERNEL32!.text+1B732 //********************