Hex-Rays 函数签名与损坏的名称不匹配

逆向工程 艾达 手臂 六线谱 字符串
2021-06-30 03:09:12

从 demangled 名称,我知道一个函数将 anstd::string const&作为参数,但是当使用 Hex-Rays 的反编译器生成伪 c 代码时,它会自动检测参数为(int a1, int a2, int a3)

如何修复 Hex-Rays' 生成的函数签名?

IDA 图形视图的屏幕截图

int __fastcall EncodeUtil::getDecryptStr(int a1, int a2, int a3)
{
  int v3; // r7
  unsigned int i; // r5
  char v5; // r6
  int v7; // [sp+4h] [bp-1Ch]
  int v8; // [sp+8h] [bp-18h]

  v7 = a2;
  v8 = a3;
  v3 = a1;
  HttpUtility::URLDecode(&v7);
  for ( i = 0; i < *(_DWORD *)(v7 - 12); ++i )
  {
    sub_3B25D0(&v7);
    v5 = byte_41A7DD[i & 7];
    *(_BYTE *)(v7 + i) ^= v5;
    sub_3B25D0(&v7);
    if ( !*(_BYTE *)(v7 + i) )
    {
      sub_3B25D0(&v7);
      *(_BYTE *)(v7 + i) ^= v5;
    }
  }
  sub_3B2E20(v3, &v7);
  sub_3B1CCC(&v7);
  return v3;
}
1个回答

看起来十六进制射线错误地认为有三个参数而不是两个。如果你看一下函数的开始拆卸真实R1R2不被保存,仅R0是。您应该能够将函数签名更改为int __fastcall EncodeUtil::getDecryptStr(void* pString). 这样做的默认密钥是Y如果你有一个结构定义,std::string你可以void*用一个替换签名中的std::string*