0

背景:我正在反转属于某个类的 Obj-C 实例方法。这是类的接口

@interface myClass : NSObject
    { 
            // aStructure contains a lot of function pointers

         struct aStructure **_myStruct;     // ivar offset: 0x14  
         int                             _integer;             // ivar offset: 0x20
    }

   - (void)aMethod;

@end

问题:

这是一个aMethod反汇编的片段

[0x0]      mov   edi,    [ebp+arg_0]     ## put self into edi
[0x2]      mov   edx,   [edi+20h]        ## put  self._integer into edi
[0x3]      cmp   edx,   1
[0x4]      jl       end_of_method       ## if (self._integer < 1) return;
[0x5]      lea     eax,   [edx-0Ch]       ## put &self._myStruct into eax
[0x6]      cmp   eax,   3
[0x7]      ja      end_of_method       ## if (&self._myStruct > 3) return;
// other stuff

第 6 行显示了内存地址 ( &self._myStruct) 与3.

问题:为什么要将内存地址与 int 进行比较?这对我来说没有多大意义,因为内存地址将始终 > 3,因此在这种情况下该方法将始终退出。

4

2 回答 2

3

lea eax, [edx-0Ch]只是意味着eax = edx - 12。该指令被称为“加载有效地址”并不意味着它是唯一可以使用的东西 -当该指令是更短/更快的计算方式时,编译器通常会输出lea而不是add/ sub/ 。mul

整个片段检查是否_integer介于 1 和 15 之间。它存储_integer - 12在 中eax,大概是因为它将在稍后的方法中使用。

于 2012-08-24T21:32:43.510 回答
2

self._integer被加载到edx第 2 行。它一直存在到第 5 行。

在第 5 行,您分配( ) 和 -0xCeax的总和。因此,您最终在第 6 行将 -0xC 与 3 进行比较。在任何地方都没有地址比较,除非呈现的反汇编不完整或不正确。edxself._integerself._integer

lea指令最初用于地址算术,可用于其他目的,就像我们在这里看到的一样。

于 2012-08-24T21:32:33.847 回答