IDA 技巧(69) 拆分表达式

admin 2024年11月8日15:20:34评论8 views字数 1388阅读4分37秒阅读模式

在使用反编译器时,有时您可能会在上下文菜单中看到名为拆分表达式的项目。

它的作用是什么,在哪些情况下有用呢?让我们来看两个可以应用的例子。

结构字段初始化

现代编译器执行许多优化以加快代码执行速度。其中之一是将两个或多个相邻的内存存储或加载合并为一个宽的操作。这通常发生在写入相邻结构字段时。

例如,当您反编译一个使用块的macOS程序,并使用Objective-C分析插件来分析函数中的支持代码时,您可能会观察到类似于以下的伪代码:

block.isa = _NSConcreteStackBlock;
*(_QWORD *)&block.flags = 3254779904LL;
block.invoke = sub_10000A159;
block.descriptor = &stru_10001E0E8;
block.lvar1 = self;

block变量使用了插件创建的结构,如下所示:

struct Block_layout_10000A088
void *isa;
int32_t flags;
int32_t reserved;
void (__cdecl *invoke)(Block_layout_10000A088 *block);
Block_descriptor_1 *descriptor;
_QWORD lvar1;

如您所见,编译器决定使用一个64位存储一次性初始化两个32位的flagsreserved字段。虽然技术上是正确的,但伪代码看起来有些难看,不易一目了然。要告诉反编译器这个写入应该被视为两个独立的操作,右键单击赋值并选择“拆分表达式”:

IDA 技巧(69) 拆分表达式

拆分表达式示例

一旦伪代码刷新,两个独立的赋值将显示出来:

block.isa = _NSConcreteStackBlock;
block.flags = 0xC2000000;
block.reserved = 0;
block.invoke = sub_10000A159;
block.descriptor = &stru_10001E0E8;
block.lvar1 = self;

新的32位常量可以,例如,通过自定义枚举转换为十六进制或一组标志。

这个例子相对无害,因为reserved字段被设置为0,所以常量实际上已经是32位;其他情况可能更复杂,当不同的独立值合并为一个大常量时。

如果需要,表达式可以进一步拆分(例如,当一个值用于初始化3个或更多字段时)。您也可以通过选择上下文菜单中的“取消拆分表达式”来恢复拆分。

32位程序中的64位变量

    在处理具有32位寄存器的处理器上的64位值时,编译器必须以32位片段处理数据。

    如果按原样翻译,这可能导致非常冗长的代码,因此我们的反编译器检测到常见模式,如64位数学运算、比较或数据操作,并自动创建由两个32位寄存器或内存位置组成的64位变量。虽然我们的启发式方法在大多数情况下效果良好,但可能会有误报,当两个实际上独立的32位变量合并为一个64位变量时。

    在这种情况下,您可以对涉及该变量的64位操作使用“拆分表达式”来拆分对并恢复正确的独立变量。

更多文章

立即关注【二进制磨剑】公众号

👉👉👉【IDA 技巧合集】👈👈👈
👉👉👉【Github 安全项目合集】👈👈👈
学习零基础学习 IDA 逆向
【课程完结!内容揭秘!】7 天打造 IDA 9.0 大师:从零基础到逆向精英
知识星球🪐

IDA 技巧(69) 拆分表达式

原文始发于微信公众号(二进制磨剑):IDA 技巧(69) 拆分表达式

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月8日15:20:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   IDA 技巧(69) 拆分表达式https://cn-sec.com/archives/3373537.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息