逆向 JNI Native 库的一些障碍

逆向工程 安卓 雷达2 C 爪哇 共享对象
2021-06-23 04:05:24

我删除了我的最后一个问题(它仍然没有得到回答并且没有浪费任何努力),因为我回来并想重新阅读 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}

这就是静态函数的调用方式。我觉得这个函数引用了传递的类对象,因为它0x44sp字母上减去然后做一些事情。但是,这个引用实际上是如何工作的?我很无知。这是对应于它的 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指针、overr2r3,调用字符串函数的事实(这使得它们可能更明显int32_t

为什么radare没有分配r1给任何东西?并跳过arg2它可能也与JavaObject,但我无法通过研究自己真正找到任何东西。我真的很感激任何帮助,我非常希望将老板战斗音乐隐藏在一些加密的 zip 文件后面

如果它有助于理解,这里是.so文件https://files.catbox.moe/foss7s.so

0个回答
没有发现任何回复~