首页
社区
课程
招聘
[求助] Frida JNIEnv jobject jclass如何获取
发表于: 2019-10-13 23:39 7456

[求助] Frida JNIEnv jobject jclass如何获取

2019-10-13 23:39
7456

我有一个native方法如下

extern "C" JNIEXPORT jstring JNICALL
Java_com_n112h0ng_ndkapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject obj,
        jbyteArray name,
        jstring age,
        jint number)

这个native方法不是静态的,所有有jobject这个参数;现在我想用Frida的NativeFunction对象创建这个方法并准备调用它,第一个参数JNIEnv应该是使用Java.vm.getEnv()能获取,这个我在frida-java-bridge项目中的env.js、vm.js中可以找到,奈何我技术一般般没法想到如何获取jobject/jclass这参数,jobject/jclass的是分别指代了其所指代的类和对象,我想过直接传递类或者对象进去,但我觉得应该不行所以没试。

 

所以还麻烦指教,感谢


 

或者这么说,我想在frida里调用env->CallBooleanMethod,这个方法需要的参数第一个就是jobject,我怎么样在frida里获取到jobject


 

更新:
因为不知道jobject是什么东西,所以我没法确定这个东西的类型,我通过hook输出看了一下它的地址,然后我用如下代码想获取当前类的handle,我以为这个handle就是jobject:

var nFunc = new NativeFunction(sfjPtr, 'int64', ['pointer', 'int64', 'int64', 'int64', 'int']);
var m_cls = Java.use('com.n112h0ng.ndkapplication.MainActivity');
var env = Java.vm.getEnv();
var m_cls_handle = m_cls.$getClassHandle(env);
nFunc(env.handle, m_cls_handle, name, age);

运行给我的结果是闪退,输入如下信息:

***
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Xiaomi/equuleus/equuleus:9/PKQ1.180729.001/9.9.26:user/release-keys'
Revision: '0'
ABI: 'arm64'
pid: 30688, tid: 30688, name: .ndkapplication  >>> com.n112h0ng.ndkapplication <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'java_vm_ext.cc:542] JNI DETECTED ERROR IN APPLICATION: thread Thread[1,tid=30688,Runnable,Thread*=0x7452614c00,peer=0x785d2340,"main"] using JNIEnv* from thread Thread[19,tid=30710,Runnable,Thread*=0x7444086400,peer=0x0,"Thread-26"]'
    x0  0000000000000000  x1  00000000000077e0  x2  0000000000000006  x3  0000000000000008
    x4  fefeff73d4e6f667  x5  fefeff73d4e6f667  x6  fefeff73d4e6f667  x7  7f7f7f7fffffff7f
    x8  0000000000000083  x9  c638c5f7f118a6a6  x10 0000000000000000  x11 fffffffc7ffffbdf
    x12 0000000000000001  x13 ffffffffffffffff  x14 ffffffffff000000  x15 ffffffffffffffff
    x16 00000074d74f32c8  x17 00000074d7431544  x18 0000000000000001  x19 00000000000077e0
    x20 00000000000077e0  x21 00000074379fb100  x22 000000000000000b  x23 0000007451f51e03
    x24 0000007451f51cb7  x25 0000000000000001  x26 0000007fd14868f0  x27 0000000000000043
    x28 0000007452713840  x29 0000007fd14867a0
    sp  0000007fd1486760  lr  00000074d7425f0c  pc  00000074d7425f34

backtrace:
    #00 pc 0000000000021f34  /system/lib64/libc.so (offset 0x21000) (abort+116)
    #01 pc 0000000000000308  <anonymous:000000745251c000>
***

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-10-14 21:38 被nu11编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 35
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
调用过来的那个class或者实例。在Java调用native。jvm会自动帮你传前两个参数
2019-10-13 23:57
0
雪    币: 352
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
KomiMoe 调用过来的那个class或者实例。在Java调用native。jvm会自动帮你传前两个参数
用frida nativefunction调用也是吗。。我找了很久,能看懂的我都看了,就是找不到,就差去github 问了
2019-10-14 10:26
0
雪    币: 963
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
需要调试这个JNI库函数吗,这个AndroidnativeEMU模拟器可能有用,https://bbs.pediy.com/thread-254799.htm,可以把so库提出来单独调用,这是我测试的一个demo

# Initialize emulator
emulator = Emulator(
    vfp_inst_set=True,
    vfs_root=posixpath.join(posixpath.dirname(__file__), "vfs")
)


# Create java class.
class LocalApplication(metaclass=JavaClassDef, jvm_name='com/example/demo/LocalApplication'):

    def __init__(self):
        pass

    @java_method_def(name='encodeString', signature='(Ljava/lang/String;)Ljava/lang/String;', native=True)
    def encode_string(self, mu):
        pass

    @java_method_def(name='decodeString', signature='(Ljava/lang/String;)Ljava/lang/String;', native=True)
    def decode_string(self, mu):
        pass


# Register Java class.
emulator.java_classloader.add_class(LocalApplication)

emulator.load_library("lib/libc.so", do_init=False)
emulator.load_library("lib/libdl.so")
emulator.load_library("lib/liblog.so")
emulator.load_library("lib/libz.so")
emulator.load_library("lib/libstdc++.so")
emulator.load_library("lib/libm.so")
lib_module = emulator.load_library("lib/libnative_lib.so")

# Show loaded modules.
logger.info("Loaded modules:")

for module in emulator.modules:
    logger.info("[0x%x] %s" % (module.base, module.filename))


try:
    # 运行jni onload
    emulator.call_symbol(lib_module, 'JNI_OnLoad', emulator.java_vm.address_ptr, 0x00)

    # 直接调用库函数
    # 申请一块内存,用于传入参数
    emulator.call_symbol(lib_module, 'malloc', 0x100)
    input_address = emulator.mu.reg_read(UC_ARM_REG_R0)

    # 申请一块内存,用于接收结果
    emulator.call_symbol(lib_module, 'malloc', 0x100)
    output_address = emulator.mu.reg_read(UC_ARM_REG_R0)

    # 向申请的内存写入参数字符串
    memory_helpers.write_utf8(emulator.mu, input_address, 'a=1&b=2&c=3')
    input_str = memory_helpers.read_utf8(emulator.mu, input_address)
    print('Input str: %s' % input_str)

    # 调用库函数
    emulator.call_symbol(lib_module, 'U_Cast_ENcode_Buf', input_address, output_address, 0x100, 0x100)

    # 读取结果
    result_str = memory_helpers.read_utf8(emulator.mu, output_address)
    print('Response form so function: %s' % result_str)

    # 调用JNI方法
    Application = LocalApplication()
    data = 'a=1&b=2&c=3'
    result = Application.encode_string(emulator, data)
    print('Response form native function: %s' % result)
except UcError as e:
    print('Exit at %x' % emulator.mu.reg_read(UC_ARM_REG_PC))
    raise

最后于 2019-10-14 11:02 被guoqiangck编辑 ,原因:
2019-10-14 11:00
1
雪    币: 352
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
guoqiangck 需要调试这个JNI库函数吗,这个AndroidnativeEMU模拟器可能有用,https://bbs.pediy.com/thread-254799.htm,可以把so库提出来单独调用,这是我测试的 ...
谢谢你,不过我就是想知道怎么在frida里获取到jobject和jclass。。。我再尝试吧
2019-10-14 11:12
0
雪    币: 10847
活跃值: (4467)
能力值: ( LV12,RANK:404 )
在线值:
发帖
回帖
粉丝
6
试试 var env=Java.vm.getEnv();   var obj=env.allocObject(clazz)创建一个新对象
2019-10-14 11:26
0
雪    币: 144
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你调用本地对象就要构造对象引用啊。第一个是虚拟机指针。
2019-10-14 11:50
0
雪    币: 352
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
堂前燕 试试 var env=Java.vm.getEnv(); var obj=env.allocObject(clazz)创建一个新对象
emmm,用env.findClass只能在Interceptor.attach中使用
2019-10-14 12:18
0
雪    币: 352
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
zylyy 你调用本地对象就要构造对象引用啊。第一个是虚拟机指针。
env这个我知道怎么获取,困惑着我的是jobject和jclss怎么造出来
2019-10-14 12:22
0
雪    币: 2282
活跃值: (3828)
能力值: ( LV6,RANK:81 )
在线值:
发帖
回帖
粉丝
10
guoqiangck 需要调试这个JNI库函数吗,这个AndroidnativeEMU模拟器可能有用,https://bbs.pediy.com/thread-254799.htm,可以把so库提出来单独调用,这是我测试的 ...
牛啤
2019-10-14 13:42
0
雪    币: 6003
活跃值: (3490)
能力值: ( LV6,RANK:96 )
在线值:
发帖
回帖
粉丝
11
https://github.com/lasting-yang/frida_hook_libart/blob/master/hook_RegisterNatives.js
2019-10-17 19:23
0
雪    币: 352
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
Imyang https://github.com/lasting-yang/frida_hook_libart/blob/master/hook_RegisterNatives.js
首先感谢大佬回复,我以为没人再会回复了就没研究了,刚刚看到你的回复后打开链接一看,你写的这个代码我几天前看过了,我完全模拟你的代码写了一下,其中47行的导出方法_ZN3art3JNI11AllocObjectEP7_JNIEnvP7_jclass 我获取不到,我也把我手机里的32位和64位的libart.so扔进ida搜索了,找是能找到很多包含AllocObjec的方法,但是没有类似AllocObjectEP7_JNIEnvP7_jclass的方法,请问问题出在哪,谢谢
2019-10-20 00:00
0
雪    币: 6003
活跃值: (3490)
能力值: ( LV6,RANK:96 )
在线值:
发帖
回帖
粉丝
13
nu11 首先感谢大佬回复,我以为没人再会回复了就没研究了,刚刚看到你的回复后打开链接一看,你写的这个代码我几天前看过了,我完全模拟你的代码写了一下,其中47行的导出方法_ZN3art3JNI11AllocOb ...
系统版本不一样,可能函数的签名也不一样,你需要找到art::JNI::AllocObject函数
2019-10-21 09:59
0
雪    币: 352
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
Imyang 系统版本不一样,可能函数的签名也不一样,你需要找到art::JNI::AllocObject函数

这我搜索到的全部结果,我是MIUI android 9,取的是/system/lib64/libart.so,我没有找到一个和jni有关的含有allocobject关键字的方法
图片描述
图片描述

2019-10-21 10:38
0
雪    币: 81
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
https://bbs.pediy.com/thread-261018.htm  楼主是这样吗?
2020-7-31 12:00
0
游客
登录 | 注册 方可回帖
返回
//