【问题标题】:What does IDA mean by this?IDA 是什么意思?
【发布时间】:2021-11-29 14:07:00
【问题描述】:

我已经用 IDA 反编译了 JNI 函数代码。一个加密的密钥通过 java 函数发送到第二个参数,然后这里发生了一些事情,它被用作 HMAC 密钥,但是 IDA 奇怪地反编译了代码,因为这个算法是完全无法理解的。

{
  jbyteArray signature_byteArray; // r5
  JNIEnv env2; // r0
  int data_len2; // r0
  char *data_bytes; // r9
  jbyteArray data_bytes2; // r1
  int data_len; // r10
  int encoded_key_len; // r0
  uint8_t **key; // r4
  uint8_t **key_sha1; // r0
  __int64 v16; // d17
  int signature_hmacResult; // r0
  __int64 v18; // d17
  int v20[2]; // [sp+8h] [bp-F0h] BYREF
  jbyte buffer; // [sp+13h] [bp-E5h] BYREF
  __int64 v22; // [sp+14h] [bp-E4h]
  __int64 v23; // [sp+1Ch] [bp-DCh]
  int v24; // [sp+24h] [bp-D4h]
  char sha1nfo[176]; // [sp+28h] [bp-D0h] BYREF
 
  signature_byteArray = 0;
  if ( data_bytes_argument && encoded_key_bytes )
  {
    env2 = *env;
    v20[0] = thiz;
    data_len2 = (env2->GetArrayLength)(env, data_bytes_argument);
    v20[1] = v20;
    data_bytes = v20 - ((data_len2 + 7) & 0xFFFFFFF8);
    data_bytes2 = data_bytes_argument;
    data_len = data_len2;
    signature_byteArray = 0;
    ((*env)->GetByteArrayRegion)(env, data_bytes2, 0, data_len2, data_bytes);
    encoded_key_len = ((*env)->GetArrayLength)(env, encoded_key_bytes);
    if ( encoded_key_len < 1 || (encoded_key_len & 0xF) != 0 )
    {
      byte_AA20[0] = 0;
      dword_B224 = 71;
    }
    else
    {
      key = (v20 - ((encoded_key_len + 7) & 0xFFFFFFF8));
      signature_byteArray = 0;
      if ( j__a(env, v20[0], &unk_A994) )
      {
        j_sha1_init(sha1nfo);
        j_sha1_write(sha1nfo, key, 20);
        key_sha1 = j_sha1_result(sha1nfo);
        v16 = *(key_sha1 + 1);
        *key = *key_sha1;
        *(key + 1) = v16;
        key[4] = key_sha1[4];
        j_sha1_initHmac(sha1nfo, key, 20);
        j_sha1_write(sha1nfo, data_bytes, data_len);
        buffer = 0x22;
        signature_hmacResult = j_sha1_resultHmac(sha1nfo);
        v18 = *(signature_hmacResult + 8);
        v22 = *signature_hmacResult;
        v23 = v18;
        v24 = *(signature_hmacResult + 16);
        signature_byteArray = ((*env)->NewByteArray)(env, 0x15);
        ((*env)->SetByteArrayRegion)(env, signature_byteArray, 0, 0x15, &buffer);
      }
    }
  }
  return signature_byteArray;
}

你能解释一下这些行中发生了什么吗:

key = (v20 - ((encoded_key_len + 7) & 0xFFFFFFF8));

v16 = *(key_sha1 + 1);
*key = *key_sha1;
*(key + 1) = v16;
key[4] = key_sha1[4];

【问题讨论】:

  • 您熟悉 C 风格的结构在内存中的布局方式吗?
  • 这看起来并不比任何其他反编译器输出更难理解。事实上,它比我见过的要好。
  • @Dai no 我不熟悉这个

标签: c java-native-interface disassembly decompiling ida


【解决方案1】:

表达式:

(encoded_key_len + 7) & 0xFFFFFFF8

返回大于 encoded_key_len 的第一个值,它是 8 的倍数并且:

key = (v20 - ((encoded_key_len + 7) & 0xFFFFFFF8));

实际上在堆栈上分配了一些内存。是这样的:

unsigned char key[(encoded_key_len + 7) & 0xFFFFFFF8];

顺便说一句,当您使用 IDA 时,请尝试将自动创建的参数/变量名称重命名为逻辑正确且有意义的名称。这样,您可以更好地分析反编译的代码。例如在上面的代码中,您可以将data_bytes_argument 更改为data_arr,这样更有意义。

【讨论】:

  • ida 自动将 unsigned char * key 转换为 unsigned __int8 * key,这不会以任何方式影响库中的代码以供使用,此变量必须是 uint8_t * key 类型才能在 @987654327 中使用@
猜你喜欢
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 2017-06-11
  • 2018-03-05
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多