【发布时间】: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