我删除了我的最后一个问题(它仍然没有得到回答并且没有浪费任何努力),因为我回来并想重新阅读 JNI 文档,发现我误解了一些内容。事情现在更清楚了
虽然我仍然无法理解 JavaObject 是如何传递的?通过radare2看,
410: sym.Java_com_asobimo_common_jni_NativeResource_getZipedFile (int16_t arg1, int16_t arg3, int16_t arg4);
; var int16_t var_0h @ sp+0x0
; var int16_t var_ch @ sp+0xc
; var int16_t var_14h @ sp+0x14
; var int16_t var_18h @ sp+0x18
; var int16_t var_1ch @ sp+0x1c
; var int16_t var_34h @ sp+0x34
; var int16_t var_40h @ sp+0x40
; arg int16_t arg1 @ r0
; arg int16_t arg3 @ r2
; arg int16_t arg4 @ r3
; DATA XREF from aav.0x0000c664 @ +0x64
0x0000c974 ~ f0b5 push {r4, r5, r6, r7, lr}
这就是静态函数的调用方式。我觉得这个函数引用了传递的类对象,因为它0x44从sp字母上减去然后做一些事情。但是,这个引用实际上是如何工作的?我很无知。这是对应于它的 Java 类的样子:-
package com.asobimo.common.jni;
public final class NativeResource {
static {
System.loadLibrary("NativeResource");
}
public static native void deleteFile(String paramString);
public static native byte[] getFile(String paramString);
public static native byte[] getZipedFile(String paramString1, String paramString2);
public static native boolean isZipedNormality(String paramString);
public static native void saveFile(String paramString, byte[] paramArrayOfbyte, int paramInt);
}
此外,这并不是一个真正需要回答的事情(而且它有点偏离它的焦点,对不起)但是radare如何识别参数的大小?很明显,var int16_t var_40_h @ sp+0x40作为一个引用(即使 sp 被 减去0x40)以及使用r0指针、overr2和r3,调用字符串函数的事实(这使得它们可能更明显int32_t)
为什么radare没有分配r1给任何东西?并跳过arg2?它可能也与JavaObject,但我无法通过研究自己真正找到任何东西。我真的很感激任何帮助,我非常希望将老板战斗音乐隐藏在一些加密的 zip 文件后面
如果它有助于理解,这里是.so文件https://files.catbox.moe/foss7s.so