为什么有一个只有一条指令的功能

逆向工程 艾达 编译器
2021-06-22 19:01:20

我反编译了一个程序,其中有一个函数,它只有一个有用的指令,即

xor eax, eax
retn

在一个额外的函数中使用 this 的目的是什么,而不是在调用的地方使用xor eax, eaxmov eax, 0

  • 笔记:
    1. 大多数时候直接调用call sub_41063A(函数的地址),有时加载它的地址mov esi, offset sub_41063A
    2. 它是一个 x68_64 架构
    3. 我不知道,用的是哪个编译器

编辑:

代码示例:(我将函数命名为“clearEAX”)

函数本身:

.text:000000000041063A
.text:000000000041063A clearEAX        proc near               ; CODE XREF: sub_40E4B4+37p
.text:000000000041063A                                         ; sub_40E528+DFp ...
.text:000000000041063A                 xor     eax, eax        ; Logical Exclusive OR
.text:000000000041063C                 retn                    ; Return Near from Procedure
.text:000000000041063C clearEAX        endp
.text:000000000041063C
.text:000000000041063D

它的地址被引用 (0x4113B2) 它在上下文中被直接调用:(0x4113CB)

.text:00000000004113AC                 push    rbp
.text:00000000004113AD                 mov     edx, offset unk_514200
.text:00000000004113B2                 mov     esi, offset clearEAX
.text:00000000004113B7                 push    rbx
.text:00000000004113B8                 mov     ebx, edi
.text:00000000004113BA                 sub     rsp, 28h        ; Integer Subtraction
.text:00000000004113BE                 mov     rdi, rsp
.text:00000000004113C1                 call    nullsub_3       ; Call Procedure
.text:00000000004113C6                 mov     edi, offset unk_514200
.text:00000000004113CB                 call    clearEAX        ; Call Procedure
.text:00000000004113D0                 mov     rax, cs:qword_514398
.text:00000000004113D7                 test    rax, rax        ; Logical Compare
.text:00000000004113DA                 jz      short loc_4113E0 ; Jump if Zero (ZF=1)
.text:00000000004113DC                 mov     edi, ebx
.text:00000000004113DE                 call    rax ; qword_514398 ; Indirect Call Near Procedure
.text:00000000004113E0

但是,我不认为上下文在这里很重要,因为上下文远非相似。这意味着它不是先移动地址然后调用它或类似的组合。

1个回答

很多时候,像这样的函数会被列在一个vtable. 这就是在像 一样的语言中C++,类对象可以从其他类对象继承函数和变量的地方。

如果class A,父类,实现了一个函数getCountclass B可以从这个类继承并改变那个函数的返回值。

很多时候,开发人员会在父类中实现一个泛型方法,期望派生类实现一个功能更多的主体。

tinyxmlC++ 库中可以看到这样的一个例子大多数类派生自一个主XmlNode类,该类实现了几种用于转换为正确类型的方法。在父级中,每个To_XXX函数只返回一个空指针。每个派生类都会覆盖这些方法之一以返回一个指向自身的真实指针。