IDA反编译JNI代码疑问:指定位运算、内存赋值操作逻辑解析
代码逻辑解释
1. key = (v20 - ((encoded_key_len + 7) & 0xFFFFFFF8)); 运行逻辑
这行是ARM架构下栈内存对齐分配的常规实现,作用是为传入的加密密钥在栈上开辟符合对齐要求的存储空间,逐部分拆解:
- 位运算
(encoded_key_len + 7) & 0xFFFFFFF8是标准的向上8字节对齐计算逻辑:- 加7的作用是当原密钥长度不是8的倍数时,自动向上进位到下一个8的倍数边界
- 和
0xFFFFFFF8做与运算的作用是抹掉数值的低3位,确保最终结果一定是8的整数倍,得到的是大于等于原密钥长度的最小8对齐值
- v20是栈上的基准地址指针,因为栈的内存增长方向是从高地址向低地址,所以用基准地址减去对齐后的长度,就能得到可存放密钥的栈空间起始地址,赋值给
key指针供后续读写。
2. 四行内存操作的运行逻辑
v16 = *(key_sha1 + 1); *key = *key_sha1; *(key + 1) = v16; key[4] = key_sha1[4];
这部分是将SHA1运算的输出结果拷贝到key指向的空间,作为后续HMAC运算的密钥,拆解逻辑:
j_sha1_result返回的key_sha1是指向20字节SHA1运算结果的指针(SHA1算法固定输出20字节),这里的类型标注是IDA反编译的误差,实际是按字节数组处理- 因为是ARM64架构下用64位寄存器做优化拷贝,所以没有生成标准memcpy代码,反编译后呈现该形态:
*(key_sha1 +1)取SHA1结果偏移8字节位置的8字节数据,存入64位寄存器v16*key = *key_sha1将SHA1结果前8字节拷贝到key指向的起始位置*(key+1) = v16将暂存在v16的8字节数据拷贝到key偏移8字节的位置,前三步完成前16字节的拷贝- 最后
key[4] = key_sha1[4]的索引是按4字节为单位计算,作用是将SHA1结果最后4字节拷贝到key偏移16字节的位置
- 四行代码整体就是完整拷贝20字节的SHA1结果到
key指向的空间,为后续HMAC初始化提供密钥。
内容的提问来源于stack exchange,提问作者discared
相关产品推荐
相关产品推荐

