IDA - ObjC - _BYTE 和 dword_0 的含义?

逆向工程 艾达 手臂 ios
2021-06-25 20:46:16

这是我第一次反汇编/逆向工程的经验,我有点难以跟上。作为参考,我试图揭示我所在行业中一个相当不错的图书馆的内部运作方式。以下方法接受一个字符串并返回一些由 表示的内容long long

signed __int64 __cdecl +[Lib generateLongLongValue:](Lib_meta *self, SEL a2, id a3)
{
  void *v3; // x0
  void *v4; // x19
  char *v5; // x0
  char *v6; // x20
  unsigned __int64 v7; // x25
  signed __int64 v8; // x22
  signed __int64 v9; // x26
  int v10; // w0
  signed __int64 v11; // x8
  signed __int64 v12; // x23
  int v13; // w0
  __int16 v14; // w24
  __int16 i; // w23
  __int16 v16; // w0
  bool v17; // w9
  signed __int64 v18; // x20

  v3 = (void *)objc_retain(a3, a2);
  v4 = v3;
  v5 = (char *)objc_msgSend(v3, "length");
  v6 = v5;
  v7 = (unsigned __int64)(v5 - 1);
  if ( v5 == (_BYTE *)&dword_0 + 1 )
  {
LABEL_25:
    v18 = -1LL;
    goto LABEL_26;
  }
  ...
}

转换成标准的 Objective-C,这看起来像这样(我认为):

+ (NSInteger)generateLongLongValue:(NSString*)string
{
    NSInteger v18;

    if (string.length - 1 == (_BYTE *)&dword_0 + 1) {
        v18 = -1LL;
        goto LABEL_26;
    }

    ...
}

我真的不知道(_BYTE *)&dword_0 + 1这里应该是什么意思。有人可以提供某种解释,或提供我可以查看的资源以便我自己理解吗?

干杯

1个回答

我怀疑您在分析过程中得到了误报,并且常量(0 或 1)被错误地转换为偏移量(可能是因为在您的数据库中 0 是有效地址)。反编译器使用来自反汇编的信息,因此在这种情况下可能需要清理反汇编:

按Tab就行,&dword_0如果offset dword_0反汇编中有一个或类似的,按O删除它,然后Tab回到伪代码,按F5刷新。