翻译《The Old New Thing》- Stupid debugger tricks: Calling functions and methods

news2025/1/19 11:13:22

Stupid debugger tricks: Calling functions and methods - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20070427-00/?p=27083

Raymond Chen 2007年04月27日


一个比较笨的调试技巧:调用函数和方法

        在过去,如果你想在调试器中调用一个函数,你必须手动进行:保存寄存器,将参数推送到栈上(如果函数使用fastcallthiscall,则将参数放入寄存器),将ntdll!DbgBreakPoint函数的地址推送到栈上,将指令指针移动到你想要调用的函数的开始位置,然后按“g”键恢复执行。函数运行后返回到ntdll!DbgBreakPoint,调试器重新获得控制权,你可以查看结果。然后恢复寄存器(包括原始的指令指针)并继续调试。

        那一段只是快速回顾;我假设你已经知道了。

        现在,Windows符号调试引擎(ntsdcdbwindbg背后的调试引擎)可以自动化这个过程。

        假设你想调用这个函数:

int DoSomething(int i, int j);

         你可以让调试器做所有繁重的工作:

0:001> .call ABC!DoSomething(1,2)
线程已设置为调用,'g'将执行。
警告:这可能会产生严重的副作用,包括死锁和调试程序的损坏。
0:001> r
eax=7ffde000 ebx=00000001 ecx=00000001 edx=00000003 esi=00000004 edi=00000005
eip=10250132 esp=00a7ffbc ebp=00a7fff4 iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
ABC!DoSomething:
10250132 55               push    ebp
0:001> dd esp
00a7ffbc  00a7ffc8 00000001 00000002 ccfdebcc

        注意,调试器巧妙地将参数推送到栈上,并为你设置了eip寄存器。你只需要按“g”,DoSomething函数就会运行。一旦它返回,调试器将恢复原始状态。

        这种技术甚至适用于C++方法:

// 假设我们知道0x00131320是一个IStream指针
0:001> .dvalloc 1000
从00a80000开始分配了1000字节
0:001> .call ABC!CAlphaStream::Read(0x00131320, 0xa80000, 0x1000, 0)
线程已设置为调用,'g'将执行。
警告:这可能会产生严重的副作用,包括死锁和调试程序的损坏。

        注意,当调用非静态C++方法时,你必须将“this”参数作为显式的第一个参数传递。调试器知道使用哪种调用约定,并将寄存器放置在正确的位置。在这种情况下,它知道CAlphaStream::Read使用stdcall调用约定,因此所有参数都已推送到栈上。

        那么那个.dvalloc命令是做什么的?这是另一个调试器辅助函数,它在被调试进程的地址空间中分配一些内存。在这里,我们用它来分配一个我们想要读取的缓冲区。

        但是,如果你想调用一个接口上的方法,而你没有实现源代码怎么办?例如,你想从一个外部组件传递给你的流中读取。嗯,你可以玩一个小把戏。你可以假装调用一个你有源代码的函数,该函数具有相同的函数签名,然后将eip寄存器移动到所需的入口点。

// 假设我们知道0x00131320是一个IStream指针
0:000>  dp 131320 l1
00131320  77f6b5e8 // vtable
0:000> dps 77f6b5e8 l4
77f6b5e8  77fbff0e SHLWAPI!CFileStream::QueryInterface
77f6b5ec  77fb34ed SHLWAPI!CAssocW2k::AddRef
77f6b5f0  77f6b670 SHLWAPI!CFileStream::Release
77f6b5f4  77f77474 SHLWAPI!CFileStream::Read
0:000> .call SHLWAPI!CFileStream::Read(0x00131320, 0xa80000, 0x1000, 0)
                ^ 符号在'.call SHLWAPI!CFileStream::Read'中不是函数

        那个错误消息是调试器有点令人困惑的方式,意思是“我没有足够的信息来执行那个函数调用。”但没关系,因为我们有一个“足够接近”的函数,即CAlphaStream::Read

0:001> .call ABC!CAlphaStream::Read(0x00131320, 0xa80000, 0x1000, 0)
线程已设置为调用,'g'将执行。
警告:这可能会产生严重的副作用,包括死锁和调试程序的损坏。
0:000> r eip=SHLWAPI!CFileStream::Read
0:000> r
eax=00131320 ebx=0007d628 ecx=00130000 edx=0013239e esi=00000000 edi=00000003
eip=77f77474 esp=0007d384 ebp=0007d3b0 iopl=0         nv up ei pl zr na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
SHLWAPI!CFileStream::Read:
77f77474 8bff             mov     edi,edi

        哇哦!

        我们让ABC!CAlphaStream::Read为我们推送了所有参数,然后调用我们交换了那个函数,并将CFileStream::Read插入到它的位置。现在你可以按“g”来执行CFileStream::Read调用。

        这只是.call命令所能做的表面。将一些C++表达式求值等功能混合在一起,你就拥有了一个相当巧妙的“伪即时模式”表达式求值器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1682324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构师考试(二)

敏捷方法 CMMI代表Capability Maturity Model Integration,是一种用于评估和改进组织软件工程和系统工程的模型。CMMI提供一个框架,帮助组织评估其软件和系统工程的成熟度,该模型基于过程成熟度模型(CMM)和集成项目管理…

DE2-115串口通信

目录 一、 内容概要二、 Hello Nios-II2.1 Nios-II编程2.1.1 硬件Ⅰ 搭建环境Ⅱ 编写代码 2.1.2 软件2.1.3 烧录Ⅰ硬件Ⅱ 软件 2.2 verilog编程 三、 心得体会 一、 内容概要 分别用Verilog和Nios软件编程, 实现DE2-115开发板串口输出“Hello Nios-II”字符到笔记本电脑串口助…

利用宝塔面板搭建nodejs网站(不使用pm2)

利用宝塔面板搭建nodejs网站(不使用pm2) 1. 准备代码文件2. 将代码上传至云主机3. 云主机配置3.1 绑定域名3.2 利用面板配置node环境3.3 利用面板增加node项目 4. 打开端口 暂时只演示http的。https类似,需要添加证书。 1. 准备代码文件 清单…

SpringBoot环境隔离Profiles

前言 通常我们开发不可能只有一个生产环境,还会有其它的开发,测试,预发布环境等等。为了更好的管理每个环境的配置项,springboot也提供了对应的环境隔离的方法。 直接上干货 知识点 激活环境方法 1,在application…

伪头部校验

本章问题 UDP和TCP的伪首部只用于计算校验和,在UDP和TCP的报文中是不存在的,为什么要引入伪首部呢?为什么伪首部的要有这些字段?这里我们就先看一下TCP和UDP的首部格式。 TCP和UDP首部 源端口目的端口:是0-65535任…

CSP认证刷题笔记(3)最大矩形(13年CSP认证第三题)

文章目录 题目描述基本思路求解代码 题目描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1≤i≤n)个矩形的高度是 hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3,1,6,5,2,3。 请找出…

聚苯并咪唑(PBI)为超高性能工程塑料 未来应用前景较好

聚苯并咪唑(PBI)为超高性能工程塑料 未来应用前景较好 聚苯并咪唑(简称PBI),是一类以苯并咪唑基团作为结构重复单元的杂环聚合物。聚苯并咪唑不溶于水,溶于强极性溶剂,具有耐高温、耐腐蚀、抗辐…

学习C语言的重要性以及如何学好

配套视频:https://www.bilibili.com/video/BV1kw4m1Q7AV/?spm_id_from333.999.0.0 一、C语言在互联网领域重要的开源项目 https://github.com/mysql/mysql-server 数据库开源项目【互联网重型开源项目】 编程语言:C/C/ASM 部分汇编代码 开源项目核心…

Verilog基础语法——条件语句if-else与case

Verilog基础语法——条件语句case、if-else 写在前面一、if-else语句二、case语句2.1 case语句2.2 casez语句2.3 casex语句 写在后面 写在前面 在Verilog语法中,常用的条件语句有if-else语句和case语句,用于判断条件是否为真,并执行判断条件后…

使用docker安装doccano

使用docker安装doccano 1 介绍 数据标注的工具比较多,比较出名的有Doccano、Label Studio等。 Label Studio :图像标注、文本标注、音频标注、视频标注、时间序列标注,功能比较多。 Doccano:主要是针对文本的标注,…

平芯微PW4057H中文规格书

产品概述(百度翻译) PW4057H 是可以通过外部电阻编程的恒流/恒压充电的充电管理电路。该器件内部包括功率晶体管应用时不需要外部的电流检测电阻和阻流二极管。 PW4057H 只需要极少的外围元器件,并且符合 USB 总线技术规范,非常适…

英睿达硬盘数据恢复方法:从丢失到找回的详细指南

在数字化时代,硬盘作为我们存储重要数据的关键设备,承载着大量的个人、工作甚至商业信息。然而,无论是由于意外删除、格式化、病毒感染还是硬件故障,硬盘数据丢失的情况时有发生。英睿达硬盘作为市场上的知名品牌,其数…

后仿真中的必懂VCS仿真选项之 +ignorempcond

当多个输入同时改变时,VCS支持延迟注释。它忽略条件检查,并从适用的延迟中插入最小的延迟。 当多个输入同时改变时,它们会对特定的输出信号产生影响。 如果没有匹配的条件弧线从输入(切换)延伸到输出,那么VCS不会标注零延迟。 …

ITSM的服务台如何让工作更流畅

在现代企业的信息技术管理框架内,IT服务管理(IT Service Management, ITSM)体系扮演着至关重要的角色,而其中的服务台则是这一复杂体系的心脏地带。服务台不仅仅是解答技术疑问的一线窗口,更是企业IT运维效率与用户满意…

STM32_IIC通信

IIC通信 • I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线 • 两根通信线:SCL(串行时钟线)、SDA(串行数据线) • 同步,半双工 • 带数据应答 • 支持总线挂载多…

C++ 程序员常用的VScode的插件

vscode中好用的插件 Better CommentsBookmarksC/C ThemeChinese (Simplified) (简体中文) Language Pack for Visual Studio CodeclangdClang-FormatCodeLLDBCMakeCMake ToolsCode RunnerCode Spell CheckerCodeSnapColor Highlightvscode-mindmapDraw.io IntegrationError Len…

VirtualBox虚拟机串口通信

主机:Win11 VirtualBox: 7.0 两台Guest虚拟机: CentOS 现在希望两台CenOS虚拟机能通过串口通信。 设置前先关闭两台虚拟机。 设置方式就是在VirtualBox的设置里面设置串口,需要注意的是其中一台不勾选“连接至现有通道或套接字”,另外一…

分享我经常用的一个图片下载插件,不会写爬虫代码也能随意下载图片

更多精彩内容在公众号。 ImageAssistant(图片助手)是一款专为Chrome浏览器设计的扩展程序,它具备强大的网页图片处理功能。以下是关于ImageAssistant的一些主要特点和功能: 批量下载图片:ImageAssistant的核心功能之一…

什么是蜜罐,在当前网络安全形势下,蜜罐能提供哪些帮助

在当前的互联网时代,网络安全威胁日益严峻,攻击手段层出不穷。为了应对这些威胁,网络安全专家们不断探索新的防御手段,在过去的几年里,一种更加积极主动的网络安全方法正在兴起。蜜罐技术便是这样一种备受瞩目的主动防…

GPT大模型不再遥不可及:本地化部署让每个人都能拥有

本地化部署是GPT发展的一个趋势。 本地化部署指的是将大模型部署在用户自己的设备上,而不是依赖于云服务商提供的接口。本地化部署有以下几个优势: 数据完全私有化,降低数据丢失和泄露风险,对数据安全性和私密性有保障。 降低使…