吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1396|回复: 16
收起左侧

[新手问题] 如图所示,X64dbg中的这个地方叫什么? 都有几种叫法?要专业叫法

[复制链接]
冥界3大法王 发表于 2025-11-2 09:38
image.png
如图所示,X64dbg中的这个地方叫什么? 都有几种叫法?要专业叫法!

看大家说的 和 自己想的能不能对得上号。。。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 冥界3大法王 发表于 2025-11-3 17:40
本帖最后由 冥界3大法王 于 2025-11-3 17:41 编辑
lies2014 发表于 2025-11-3 13:56
{comment@address} 和 {s:寄存器} 都是命令行,在 GUI 中使用的,而且不全面
如果想跟寄存器界面中一样 ...

后两个 DbgGetLabelAt、DbgGetModuleAt  这对应的Delphi实现都解决了。。。
而这个 DbgGetStringAt (Delphi工程里是没有的)

看了实现的注释还挺复杂的。。。

这是一个用于获取寄存器标签信息的C++函数,让我逐行解释:

// 函数定义:获取寄存器标签信息,参数为寄存器枚举值
QString RegistersView::getRegisterLabel(REGISTER_NAME register_selected)
{
    // 定义各种文本缓冲区
    char label_text[MAX_LABEL_SIZE] = "";   // 标签文本缓冲区
    char module_text[MAX_MODULE_SIZE] = ""; // 模块文本缓冲区  
    char string_text[MAX_STRING_SIZE] = ""; // 字符串文本缓冲区
    char status_text[MAX_STRING_SIZE] = ""; // 状态文本缓冲区

    // 获取寄存器数值并格式化为16进制字符串
    QString valueText = QString("%1").arg((* ((duint*) registerValue(&mRegDumpStruct, register_selected))), 
                                         mRegisterPlaces[register_selected].valuesize, 16, QChar('0')).toUpper();

    // 获取寄存器数值的副本
    duint register_value = (* ((duint*) registerValue(&mRegDumpStruct, register_selected)));
    QString newText = QString("");  // 初始化返回文本

    // 检查寄存器值对应的内存位置是否有各种信息
    bool hasString = DbgGetStringAt(register_value, string_text);  // 是否有可读字符串
    bool hasLabel = DbgGetLabelAt(register_value, SEG_DEFAULT, label_text);  // 是否有标签
    bool hasModule = DbgGetModuleAt(register_value, module_text);  // 是否在模块中

    // 检查是否是NTSTATUS状态码(仅对EAX/RAX寄存器且值在特定范围内)
    bool hasStatusCode = register_selected == REGISTER_NAME::CAX && 
                        (register_value & ArchValue(0xF0000000, 0xFFFFFFFFF0000000)) == 0xC0000000;
    // 如果是状态码,尝试格式化状态码描述
    hasStatusCode = hasStatusCode && DbgFunctions()->StringFormatInline(
                    QString().sprintf("{ntstatus@%X}", register_value).toUtf8().constData(), 
                    sizeof(status_text), status_text);

    // 优先级1:如果有可读字符串且该寄存器允许显示字符串
    if(hasString && !mONLYMODULEANDLABELDISPLAY.contains(register_selected))
    {
        newText = string_text;
    }
    // 优先级2:如果是NTSTATUS状态码
    else if(hasStatusCode)
    {
        auto colon = strchr(status_text, ':');  // 查找冒号位置
        if(colon)
            *colon = '\0';  // 截断冒号后的描述,只保留状态码名称
        newText = status_text;
    }
    // 优先级3:同时有模块名和标签
    else if(hasLabel && hasModule)
    {
        newText = "<" + QString(module_text) + "." + QString(label_text) + ">";
    }
    // 优先级4:只有模块名
    else if(hasModule)
    {
        newText = QString(module_text) + "." + valueText;
    }
    // 优先级5:只有标签
    else if(hasLabel)
    {
        newText = "<" + QString(label_text) + ">";
    }
    // 优先级6:如果以上都没有,尝试显示为字符(仅对某些寄存器)
    else if(!mONLYMODULEANDLABELDISPLAY.contains(register_selected))
    {
        // 检查是否可以显示为ASCII字符
        if(register_value == (register_value & 0xFF))
        {
            QChar c = QChar((char)register_value);
            if(c.isPrint())  // 如果是可打印字符
            {
                newText = QString("'%1'").arg((char)register_value);
            }
        }
        // 检查是否可以显示为UNICODE字符
        else if(register_value == (register_value & 0xFFF)) //UNICODE?
        {
            QChar c = QChar((wchar_t)register_value);
            if(c.isPrint())  // 如果是可打印字符
            {
                newText = "L'" + QString(c) + "'";
            }
        }
    }

    return std::move(newText);  // 返回结果文本
}

函数功能总结:
这个函数用于在调试器中显示寄存器的"智能"信息,按照以下优先级显示:

  1. 字符串内容(如果寄存器指向可读字符串)
  2. NTSTATUS状态码描述(仅对EAX/RAX)
  3. 模块名+标签组合
  4. 模块名+地址
  5. 标签名
  6. ASCII/Unicode字符表示(如果值是单个字符)
 楼主| 冥界3大法王 发表于 2025-11-3 10:05
lies2014 发表于 2025-11-2 20:28
你问的不严谨,只能按我的理解,x64dbg中那两个区域应该叫啥

第一个:Comments,官方翻译“注释”

@lies2014 没错,我问的的确不够严谨。
左侧的汇编指令处,上面无论是【调试器解析出来的符号、还是用户自定义的符号、用户的注释信息】
都通过Delphi编写X64dbg插件完美获得。

可是右上角寄存器上面的符号,现在懵逼了。。。
得到的有时算对,有时又不对(换个程序又对不上号了)
同样尝试输出 寄存器指向的内存地址处所指的字节数组。。。
关于从寄存器中获取字串信息,我们还是一步步来吧(用测试代码一步步完成)
先从各寄存器(EAX、EBX、ECX、EDX、EBP、ESI、EDI)指向的内存中读取0x20个字节,以00结束,并转为系统编码的字符串
esp这个寄存器特殊处理                      (先尝试直接读取。。。如有有效字符串则同样Memo1.lines.add(输出)并转为系统编码的字符串
                                          (没有,则【模仿在内存窗口中转到指定DWORD的方式】。。。。。并转为系统编码的字符串

不知调试器是如何分配这些的。。。
gangdaomeimei 发表于 2025-11-2 10:36
qq465881818 发表于 2025-11-2 11:00
左边的图有两个功能,一个功能是显示 寄存器的 值,只是简单的显示出字符串。另外一个功能是 右键点击  修改 当前的汇编指令。
右边的图也有两个功能,一个功能是显示寄存器的值,简单的显示字符串。另外一个功能 点击 修改寄存器的值。
两个功能都在源代码的RegistersView.h RegistersView.cpp 文件下
 楼主| 冥界3大法王 发表于 2025-11-2 11:35
本帖最后由 冥界3大法王 于 2025-11-2 11:45 编辑
统一叫它“注释”
你要是这么理解,绝对得不到下图。
image.png
并且用户标签 和 调试器标签的优先级,你说不清楚。
源代码的RegistersView.h RegistersView.cpp 文件下

image.png
image.png
后一句靠谱。。。前面没啥参考价值

image.png
寄存器上字符串信息摸不准。。。总是获取的与实际的总差点。。 估计该叫符号信息。
NalBong 发表于 2025-11-2 12:43
汇编语言啊 能看懂的很少了
m_h 发表于 2025-11-2 14:40
本帖最后由 m_h 于 2025-11-2 14:43 编辑

你要解析call windows api 传递的参数结构体 在调试中看到?
 楼主| 冥界3大法王 发表于 2025-11-2 16:09
m_h 发表于 2025-11-2 14:40
你要解析call windows api 传递的参数结构体 在调试中看到?

我地要寄存器处符号信息。
你地明白地哟?@m_h
gilliugen 发表于 2025-11-2 19:10
上面那个叫入口吧,右边这个叫暂存处,这个标记大概是浮点运算标吧
爱飞的猫 发表于 2025-11-2 20:11
尝试提供一些有用的信息。

例如第一个箭头是 OEP 入口给你标记一下,你也可以手动写注释覆盖。

右边的是尝试根据这个值去“推导”可能的含义。因为看起来像个指针,又指向了一个看起来像是文字的内存区域,就把内容显示出来。
lies2014 发表于 2025-11-2 20:28
你问的不严谨,只能按我的理解,x64dbg中那两个区域应该叫啥

第一个:Comments,官方翻译“注释”

2025-11-02_202003.jpg


第二个:Symbol Value,官方翻译“符号”

2025-11-02_202122.jpg

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-8-7 14:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表