C++ 函数地址在附加探查器库中的显示与主题代码库中的显示不同

2023-12-04

我用 C++ 编写了一个仪器,通过挂钩进入和退出调用来记录进入和退出函数。它按照预期与遗留代码库一起工作。然而,在挂钩我从 git 下载的项目时,我保存在主题代码的 extern 变量中的函数地址,它们在探查器库中的结果是不同的。这扰乱了挂钩函数和保存函数之间的函数指针比较。

Function address in subject code main file, breakpoint is inside the _penter hook function in the profiler code currently enter image description here

The same entry is showing a different address with a "_" preceding the function name, in the profiler code The same entry is showing a different address with a "_" preceding the function

我不知道它是如何更改地址的,想知道我是否做错了什么。

我这样做的方式是,我有一个函数指针的外部数组(及其名称),它是使用主题主文件(其中所有函数都可用)中的主题代码函数引用进行初始化的。在库的钩子函数(_penter)中,我得到了刚刚输入的函数的地址。因此,我将其与外部数组中的地址进行比较,如果匹配,则记录输入的函数。

PROFILE.H 的片段(分析器)

extern Signature FuncTable[3000]; 

PROFILE.CPP 的片段(分析器)

void _stdcall EnterFunc0(unsigned * pStack)
{
    void      * pCaller;
    pCaller = (void *)(pStack[0] - 5); // the instruction for calling _penter is 5 bytes long
    Signature * funct = FuncTable; //the table that has references to functions and their names
    funct = FuncTable;
    while (funct->function)
    {
        //const BYTE * func = (const BYTE *)funct->function;
        if ((void *)(pStack[0] - 5) == (void *)(funct->function))
        {
            int a = 0;
            linesBuffer = linesBuffer + "Entering " + funct->signature + ";";
            linesBuffer = linesBuffer + "\n";
            WriteToFile(false); //function buffers 100kb before writing
            break;
        }
        funct++;
    }
}
extern "C" __declspec(naked) void __cdecl _penter()
{
    _asm
    {
        pushad              // save all general purpose registers
            mov    eax, esp     // current stack pointer
            add    eax, 32      // stack pointer before pushad
            push   eax          // push pointer to return address as parameter to EnterFunc0

            call   EnterFunc0

            popad               // restore general purpose registers
            ret                 // start executing original function
    }
}

main.c 中的片段(主题代码主文件)

#include "../Profile/Profile.h"
Signature FuncTable[] = {
    { (int)TetrisView_ProcessPauseMenu, "TetrisView_ProcessPauseMenu" },
    { NULL }
};

我认为这是因为增量链接。当它打开时,您将获得一个增量链接表(ILT)。 ILT 包含一个跳转表。当一个函数被调用时,它是通过这个 ILT 来调用的。

In FuncTable,你会得到一个 ILT 中的地址,它不是实际函数的地址。但在_penter,它的返回地址将是实际的函数(这是放入pCaller).

关闭增量链接,就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 函数地址在附加探查器库中的显示与主题代码库中的显示不同 的相关文章

  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 通过 SocketCAN 进行 boost::asio

    我正在考虑利用升压阿西奥 http www boost org doc libs 1 49 0 doc html boost asio html从a读取数据套接字CAN http en wikipedia org wiki SocketCA
  • 使用 mono/nunit-console/4 在 Mac OS X 控制台上运行测试

    我安装了 Max OS X 10 11 1 上面装有 Xamarin 我编写了简单的测试类 只是为了测试在 Mac OS X 和 Ubuntu 上运行 Nunit 测试 该类实际上有一个返回字符串的方法 using System names
  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • 我如何理解这个 C 类型声明?

    double bar int double double double double 在查看讲座幻灯片时 我发现了留给学生的练习 用简单的英语来说 什么是类型bar在这个 C 声明中 Please帮助我解决这个问题 我什至不知道从哪里开始
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 在 Android 中哪里可以找到保存的图像?

    打扰一下 快速提问 我有这样的视频流例程 我接收数据包 将它们转换为 byte 然后转换为位图 然后将它们显示在屏幕上 dsocket receive packetReceived receive packet byte buff pack
  • 如何使向量的元素唯一? (删除不相邻的重复项)

    我有一个包含一些不相邻重复项的向量 作为一个简单的例子 请考虑 2 1 6 1 4 6 2 1 1 我正在尝试做这个vector通过删除不相邻的重复项并保持元素的顺序来保持唯一性 结果将是 2 1 6 4 我尝试的解决方案是 插入 std
  • 对贝塞尔曲线点进行动画处理

    我正在尝试对用 Paintcode 很棒的应用程序 顺便说一句 制作的贝塞尔曲线进行动画处理 并在 drawRect 方法中的自定义 UIView 中进行绘制 绘图工作正常 但我想为贝塞尔曲线中的单个点设置动画 这是我的非工作方法 void
  • 为什么 ng-content 选择器在 *ngFor 中不起作用

    这是 stackblitz 代码 如你看到的 div div ul number ul div div
  • 已分配值,从未使用过,但没有编译器消息

    整个程序采用 net Web 应用程序的 Web 形式 namespace WebApplication1 public partial class WebForm1 System Web UI Page protected void Pa
  • 从数据库中获取高于平均水平的学生

    我创建了一个视图 其中包含 student full name subject code result Jennifer Higgins CS1234 81 Jennifer Higgins CS1235 90 Kal Penn CS123
  • 致命错误:调用未定义的方法 mysqli::bind_param()

    我在这里挑不出毛病 你帮忙吗 这是我的错误 致命错误 调用未定义的方法 mysqli bind param 我不知道出了什么问题
  • R highcharts 多堆叠条形图

    我想绘制多个堆积条形图 但我不知道如何组合 r 代码 Closing Date Non Current Assets Current Assets Non Current Liabilities 2 2013 12 13637344 130
  • UITableView 从右到左对齐

    我正在为 iphone 3 0 开发一个阿拉伯语应用程序 我想知道是否有一种方法可以将 UITableViewCell 转换为从右到左 我希望一切都向相反的方向发展 有什么想法吗 创建您自己的 UITableViewCell 子类并不难 并
  • ConstraintLayout 对多个水平链的处理方式不同

    我正在尝试设置我认为应该是一个简单的布局ConstraintLayout我有一系列文本条目 其标签的大小可以根据语言的不同而变化 标签右侧有一个屏障 因此即使标签长度发生变化 文本条目也能保持对齐 我希望文本条目具有标称大小 在本示例中 顶
  • 如何在 Python Turtle 中导入图像?

    我想要的是获取一个图像来替换默认的海龟 就像这里所做的那样 http blog trinket io using images in turtle programs 这是我的代码 但我不知道为什么它不起作用 import turtle im
  • 单击通知不会启动活动

    我正在从服务创建通知 显示了通知 但是当我单击它时 没有任何反应 它应该打开一个活动 My code NotificationManager notificationManager NotificationManager getSystem
  • 使用 CORDA 流创建原子事务的最佳方法

    我有一个用例 我需要将数据发送给多个交易对手 但各方需要彼此保持匿名 从交易对手处收回背书后 我需要提交整个交易 整个事务的原子性需要保持 使用 Flows 实现这一目标的最佳方法是什么 为此 您需要使用机密身份 机密身份在状态中由Anon
  • Golang 中的货币格式使用来自 golang.org/x/text/currency 的currency.Symbol

    您好 我正在开发一个以货币格式格式化值的函数 我使用 golang org x text currency 来完成这项工作 但我得到的输出是逗号位置的点 没有千位分隔符 func produto Produto FormataPreco v
  • OSS 许可证插件在启动 OssLicensesMenuActivity 时崩溃

    每个人 我已经使用本教程包含了 Android OSS适用于 Android OSS 许可证的 Google API 进入我的项目 目标sdk版本是27 但我在开始时遇到一个问题Oss许可证菜单活动 我这样做如下 OssLicensesMe
  • 及时只显示一种颜色

    我正在开发油漆应用程序 问题是当我选择颜色和油漆 然后选择不同的颜色时 整个油漆颜色会更改为新颜色 任何人都可以告诉我为什么会发生这种情况以及如何解决这个问题吗 以及如何添加橡皮擦 imageview DrawView在这里 public
  • Switch 语句输出字符串错误

    我遇到了这个基本问题 其中 switch case 与字符串一起使用 Break 语句不在 case 之间使用 但为什么即使它与 case 字符串不匹配 它也会适用于所有 case 所以我很想知道为什么输出是3而不是1 public sta
  • OpenCV 中的形态重建

    在 OpenCV 中处理带有文本的图像时 我的打开操作不会产生正确的输出数据 该问题与本文中描述的问题非常相似 http www cpe eng cmu ac th wp content uploads CPE752 06part2 pdf
  • roadoi 中的 UseMethod("http_error") 错误

    我正在尝试roadoi从 R 访问 Unpaywall 但无论我尝试查询什么 我都会得到以下响应 UseMethod http error 中的错误 没有适用的方法 http error 应用于类 c simpleError error 健
  • C++ 函数地址在附加探查器库中的显示与主题代码库中的显示不同

    我用 C 编写了一个仪器 通过挂钩进入和退出调用来记录进入和退出函数 它按照预期与遗留代码库一起工作 然而 在挂钩我从 git 下载的项目时 我保存在主题代码的 extern 变量中的函数地址 它们在探查器库中的结果是不同的 这扰乱了挂钩函