`
kh477kh
  • 浏览: 36189 次
社区版块
存档分类
最新评论

Windows消息拦截

 
阅读更多

Windows消息拦截
2010年02月06日
   拦截应用程序的菜单项时SoftIce提供了如下方式:
  :bmsg hMenu wm_command
  :g
  :bc*
  :bpx k23thk1632prolog
  :g
  :bc*
  :g ret
  一般都会来到如下程序处:
  XXXX:CALL [KERNEL32!K32Thk1632Prolog]
  XXXX:CALL [...]VC编写的程序跟踪都可找到其菜单处理的入口点,在98下跟踪路径为:
  0167:5f401BD1-->0167:5F401BFF-->0167:5F401C6D CALL [EAX+40]
  在SoftIce中用":d eax+40"就可看到我们关心的菜单处理程序的入口地址。
  但是问题也就由此而来:
  1)在2K、XP中SoftIce的":HWND 应用程序句柄"不好使了!
  2)在IDA、OllyDbg中使用断点设置时我们要事先知道并通过Resscope、UltraEdit在可执行程序中寻找相关信息才可找到程序入口点。过程烦琐!!!有时根本找不到我们要的东西,程序也没加壳!有点丢人~!~
  3)IDA、OllyDbg能否像98下SoftIce那样进行动态跟踪呢,何况他们提供了大量的可参考信息。在静态基础上有动态调试可更好的理解所分析的程序的思路。
  4)在没有经验时用IDA、OllyDbg跟踪消息处理会陷入"无限消息循环"之中而无法到 我们关心的位置处!!
  5)在我们找寻拦截断点时是否有规律可循呢?
  现在我们一步一步来看如何解决上述5难题,给后来者提供一个可参考的路标,让他们顺利进入解密行列或逆向分析行列中来!至于为什么~!~这就不说了
  进入正题!
  例:从上述5点疑问我们假设一命题叙述如下
  假设:在一菜单中接收鼠标按键响应之后显示一模态模板,此模板上有按钮及其它一些可供选择的操作。
  实现方式:在一主进程中只接收鼠标按键响应,将模板显示、可供选择的其它操作的具体代码放到以动态链接库中。如下图所示:
  |        菜单按钮响应     |               |     {...~!~CreakMe} |
  XXXX.EXE                                  YYYY.DLL          
  1.  选择一个菜单响应、具体实现代码都在主进程中的菜单项。如文件的打开或保存文件之类的,利用AFX_MSGMAP_ENTRY(消息入口)结构数组在可执行程序中找到此消息相对应的执行函数的指针。
  具体做法为:
  菜单响应时消息类型为WM_COMMAND,16进制为0111H。其值的获得参 看《MADN Library Visual Studio 6.0》中WM_COMMAND的QuickInfo所指的Winuser.h。
  可看到WM_COMMAND的常量定义或使用SoftIce的"WMSG WM_COMMAND"查看其定义的值(这管保好使~!~)。
  2.  利用资源探测器Resscope查到这个菜单项ID,将其转换为16进制(可利用Resscope将所有菜单项ID都列出并制作成Excel表格,为什么? ~!~好好想想)
  3.  利用AFXWIN.H中的AFX_MSGMAP_ENTRY结构数组制作菜单、按钮的WM_COMMAND消息响应函数地址入口表。为了方便查询:)
  叙述如下:
  struct AFX_MSGMAP_ENTRY
  {
  UINT nMessage;   // 存储类型为"DWORD型";含义: 消息类型
  UINT nCode;      // 存储类型为"DWORD型";含义: 控制代码或WM_NOTIFY代码
  UINT nID;        // 存储类型为"DWORD型";含义: 控制ID
  UINT nLastID;    // 存储类型为"DWORD型";含义: 消息入口所用控制ID值域
  // 中的某个值,即感兴趣的菜单项ID值
  UINT nSig;       // 存储类型为"DWORD型";含义: 消息动作标识
  AFX_PMSG pfn;    // 存储类型为"DWORD型";含义: 消息响应函数的入口地址
  // (实际是一个和该消息对应的响应函数的指针)
  };
  设:资源为"打开工程"菜单项ID为32211(7DD3H),响应WM_COMMAND消息,消息响应入口在
  004508A0处。则在.rdata分段中存储格式为:
  XXXXH:  11010000     00000000     D37D0000    D37D0000  0C000000    A0084500
  --------     --------     --------    --------  --------    --------
  nMessage       nCode        nID        nLastID    nSig     AFX_PMSG pfn
  0111H WM_COMMAND     00H        7DD3H        7DD3H     0CH       004508A0H
  |             |
  ---------------
  #define ID_PROJECT_OPEN 32211(7DD3H)
  利用2中的Excel表格制作消息响应函数地址入口表。例如:
  ResourceConst        Sid       NumID    .rDataAddr     nMessage   nCode    nID     nSig   AFX_PMSG pfn  
  3221,"打开工程&O..  ID_PROJE   7DD3H     XXXXXXXXH     0111H       00H    7DD3H    7DD3H   004508A0H    
  (Ctrl+O)"           CT_OPEN                                                                           
  .
  .
  .
  4.  在OllyDbg或IDA中载入要分析的程序并在已知响应函数入口地址点设置断点,运行载入程序。
  在载入程序中进行相应操作后来到前面设置的断点上,查看[ESP]中的值或"运行直到返回"都可看到调用此响应函数后的上一级函数地址。其调用语句为XXXX: JMP SHORT ZZZZ,在往上三个字节处的一条指令为XXXX-3:  CALL DWORD ptr ss:[ebp+14];或者为CALL [ebp+14]。则XXXX-3为我们要设置的跟入YYYY.DLL的断点。
  5.  重新装入要分析的程序,若此程序需打开相应工程文件才能提供执行3中有空缺项的菜单项(实现函数在YYYY.DLL)时,可重复执行G:XXXX-3。具体如下:
  1o 用OllyDbg、IDA重新载入要分析的程序
  2o G:XXXX-3
  3o 在要分析的程序中打开工程文件
  4o 在OllyDbg、IDA中用G:XXXX-3
  5o 完成3中的打开工程文件动作
  6o 在OllyDbg、IDA中用G:XXXX-3
  7o 在要分析的程序中点选3.列表中有空缺项的菜单项。来到我们要跟踪进入YYYY.DLL的断点处
  6.  在OllyDbg、IDA中用"D ss:[ebp+4]"查看时若显示为:100AA260,则调用YYYY.DLL中的函数入口地址及相应DLL名完全查出填入3.列表中,以供进一步分析使用
  小结:总体思想为以已知某一路线后,以它为基准点向未知点进行拓展。程序是固定的一个,不管是什么语言编写其消息响应路线相对于这个程序是不变的。所谓水涨船高既是此道理~!~怎么有点像 AutoCAD画图使用基准点后,以基准点为中心狂画参考线呀!!!呵呵,又想到一点有时我们也要机动灵活别闹出刻舟求剑的笑话就行!嘿嘿
  郁闷ing~!~呵呵,有些时候一些知识点是相通的,可能有交叉点的存在。只是我们没有看到罢了~~~
  参考文件: WINUSER.H
  AFX_WIN.H
  WINNT.H(中有PE文件格式声明)
  附:SoftIce拦截过程
  在98下对菜单用Mouse Hook查看其句柄,若为0578则在SoftIce中用:hwnd 0578以再次确认其正确性
  :hwnd 0578
  Window Handle    hQueue  SZ   QOwner       Class Name         Window Procedure
  0578(1)         0F37   32    XXXX     _Microsoft Word f      136F:00000878
  :bmsg 0578 wm_command
  :g              ;点选已知菜单项,发生中断
  Break due to BMSG 0578 WM_COMMAND (ET=8.18 seconds)
  hWnd=0578 wParam=7DB7 lParam=00000000 msg=0111 WM_COMMAND
  ****
  :bc*
  :g 0167:4508A0  ;到已知消息入口点
  :g ret          ;或按F12键到上一级调用函数的返回点
  ;此处为      0167:5F4023D5 CALL [EBP+14]
  ;            0167:5F4023D8 JMP XXXXXXXX <--调用返回点
  ;则断点可使用0167:[5F4023D8-3]即: 0167:5F4023D5
  :g
  :cls
  :hwnd 0578
  Window Handle    hQueue  SZ   QOwner       Class Name         Window Procedure
  0578(1)         0F37   32    XXXX     _Microsoft Word f      136F:00000878
  :bmsg 0578 wm_command
  :g              ;点选未知菜单项,发生中断
  Break due to BMSG 0578 WM_COMMAND (ET=8.18 seconds)
  hWnd=0578 wParam=7D79 lParam=00000000 msg=0111 WM_COMMAND
  ****
  :bc*
  :g 0167:5F4023D5
  Break due to G (ET=260.97 microseconds)
  :d ebp+14
  016F:01B0F814   60 A2 0A 10 ...;可看到入口地址为0167:100AA260
  ** ** ** **
  :按F8进入则可看到以7D79为ID的WM_COMMAND消息响应函数入口地址为:
  0167:100AA260,调用的.DLL文件名为QQQQ!.text+000A925F中QQQQ.DLL,
  此函数在QQQQ的相对位置为000A925FH处。
  *****************************************************************************************
  连贯操作时为:
  :hwnd 0578
  :bmsg 0578 wm_command
  :g     ;点选已知菜单项
  :bc*
  :g 0167:4508A0
  :g ret ;F12
  0167:5F4023D5  CALL [EBP+14]
  0167:5F4023D8  JMP XXXXXXXX;调用后返回点,则断点为 0167:5F4023D5。记录之~!~
  :g
  :cls
  :hwnd 0578
  :bmsg 0578 wm_command
  :g     ;点选未知菜单项
  :bc*
  :g 0167:574023D5
  :d ebp+14
  0167:01B0F814  60 A2 0A 10 ...;入口地址 0167:100AA260
  ** ** ** **
  :F8调用.DLL文件名为QQQQ!.text+000A925F中QQQQ.DLL,此函数在QQQQ中的相对位置为
  !.text+000A925FH处。
分享到:
评论

相关推荐

    WINDOWS API拦截技术

    WINDOWS API拦截技术是指在Windows操作系统中,通过拦截Windows API调用来实现对系统或其他软件的控制或修改。这种技术广泛应用于屏幕取词、内码转化、屏幕翻译、中文平台等领域。 WINDOWS API拦截技术的主要目的...

    拦截Windows窗口大小改变消息.zip拦截窗口最大化,最小化事件

    标题和描述中提到的"拦截Windows窗口大小改变消息"以及"拦截窗口最大化,最小化事件",主要涉及Windows API中的消息机制。在Windows编程中,窗口与用户交互时会产生各种消息,如WM_SIZE(窗口大小改变),WM_...

    C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值

    C# 重写WndProc 拦截发送系统消息 + windows 消息常量值 C# 中的WndProc 函数是Windows 消息处理函数的入口点,它可以拦截和处理所有的Windows 消息。WndProc 函数的原型定义为:`protected override void WndProc...

    消息钩子 拦截WINDOWS消息! 原代

    Declare FUNCTION UnSetupHook Lib "这里填我的DLL在你机子上的全路径" ALIAS "UnSetupHook"(BYVAL hHook AS LONG)AS LONG Declare FUNCTION SetupHook Lib "这里填我的DLL在你机子上的全路径" ALIAS "SetupHook"...

    基于Windows的网络数据包拦截技术

    基于Windows的网络数据包拦截技术,宝贵的参考资源

    srs_29763 超迷你windows封包拦截工具

    "srs_29763 超迷你windows封包拦截工具" 指的是一款专为Windows操作系统设计的小巧且功能强大的网络封包拦截软件。"超迷你"暗示了该工具体积小巧,占用系统资源少,易于安装和使用。"封包拦截"是其核心功能,意味着...

    MFC拦截消息方法PreTranslateMessage

    MFC拦截消息方法PreTranslateMessage MFC(Microsoft Foundation Classes)是微软公司推出的一个基于C++的应用程序框架,用于开发Windows桌面应用程序。MFC提供了一些机制来拦截和处理Windows消息,其中一种重要的...

    WCF消息拦截示例代码

    **WCF消息拦截示例代码**是针对Windows Communication Foundation(WCF)服务的一种技术实现,它允许我们在消息发送和接收时进行自定义处理。在WCF中,这种功能通常是通过实现`IDispatchMessageInspector`(服务端)...

    c# winform 鼠标、键盘消息拦截

    在C# WinForm应用开发中,有时我们需要对用户的键盘和鼠标事件进行特殊的处理,比如拦截、过滤或修改这些消息。本文将深入探讨如何在VS2013环境下使用C# WinForm来实现这一功能。 首先,`PreFilterMessage`方法是...

    易语言拦截窗口最大最小化消息

    在IT领域,编程技术是核心之一,而"易语言拦截窗口最大最小化消息"这个主题则涉及到了Windows操作系统中的窗口消息处理和用户界面交互。易语言是中国本土开发的一种编程语言,其特点是语法简洁,易于学习,特别适合...

    vc屏蔽关闭按钮消息.拦截窗口关闭消息

    总的来说,拦截和屏蔽窗口关闭消息是Windows编程中的一个重要技巧,它可以在特定场景下防止用户意外关闭程序,或者在关闭前执行必要的保存、清理等操作。在VC++中,通过重载窗口过程或设置新的窗口过程,我们可以...

    C# Winform中使用SendMessage消息发送拦截

    如果希望拦截消息,只需不调用`base.WndProc`即可阻止消息的默认处理。 结合`SendMessage`和`WndProc`,我们可以创建一些高级功能,比如拦截特定消息,或者在不修改控件源代码的情况下扩展其功能。例如,如果你想要...

    易语言子类消息拦截模块

    易语言子类消息拦截模块是一种在编程中用于控制和处理窗口消息的技术,主要应用于Windows操作系统。易语言,作为中国本土的编程语言,以其简洁的语法和丰富的库支持,深受初级和中级程序员的喜爱。子类消息拦截是...

    Windows系统API函数拦截技术研究

    Windows系统API函数拦截技术研究

    Windows API拦截教程

    例如,WH_CALLWNDPROC钩子可以拦截窗口过程消息,WH_GETMESSAGE可以拦截消息队列中的消息。通过设置全局或局部钩子,可以对整个系统或特定线程的API调用进行拦截。 2. **动态链接库(DLL)注入**:通过将自定义的...

    截获外部窗口任意消息模块源码

    总的来说,这个资源提供了一个学习和实践Windows消息拦截技术的机会,特别是对于那些使用易语言的开发者。通过理解和应用这个源码,开发者可以增强对Windows API的理解,提高他们的编程技能,同时也能掌握一种监控和...

    WCF通过消息拦截进行身份验证

    本文将深入探讨如何利用WCF的消息拦截机制实现自定义的身份验证。这种技术允许开发者在消息传递过程中添加额外的安全层,以满足特定的安全需求。 **WCF身份验证基础** 在WCF中,身份验证主要通过绑定和行为来实现...

    用BCB拦截Windows消息.docx

    【BCB拦截Windows消息】是C++Builder (BCB)编程中的一个重要技术,它允许开发者扩展VCL(Visual Component Library)的功能,实现VCL没有直接提供的特性。在VCL中,BCB通过允许程序员自定义消息处理来克服其内置组件...

    拦截WindowsAPI接口程序

    API钩子APIHOOK 2.0 源代码 拦截Windows API接口程序源代码

Global site tag (gtag.js) - Google Analytics