gpt4 book ai didi

java - 从 nasm 创建的 dll 使用 JNIEnv

转载 作者:行者123 更新时间:2023-11-30 09:08:20 25 4
gpt4 key购买 nike

我一直在尝试调用 JNIEnv 函数 GetVersion(对于初学者),其索引为 4(根据 this site )。

我一直在使用 this site供引用,并通过使用 [ebp + x] 而不是参数名称将 masm 代码调整为 nasm。

下面的类和程序集文件应该创建一个乱码输出,但错误消息将我定向到一个日志文件。
在这个非常大的日志文件中,我发现特别有趣的是,所谓的内存映射寄存器似乎没有将寄存器的内容识别为 JNIEnv 函数(在 eax 中),而是识别为未知值。

谁能告诉我我做错了什么?
我只会根据要求附加日志,因为它相当大。

Java代码:

public class Ver {
private static native int ver();
public static void main(String[] args) {
System.loadLibrary("my32");
System.out.println(ver());
}
}

ASM 代码:

;my32.asm
segment .text
;JNIEXPORT void JNICALL Java_Ver_ver
; (JNIEnv *, jclass);
global _Java_Ver_ver
_Java_Ver_ver:
push ebp
mov ebp, esp
push ebx

mov ebx, [ebp+8]
mov eax, [ebx]

mov ebx, eax
mov eax, 4
mov ecx, 4
mul ecx
add ebx, eax
mov eax, [ebx]
push dword [ebp+8]
call [eax]

pop ebx
pop ebp
ret 8
;assembled using nasm -fwin32 my32.asm
;linked using gcc -o my32.dll -shared my32.obj
;with mingw-gcc

希望这可以被 SSCE 认为是一个有趣的问题
此致

最佳答案

看起来你的间接寻址太多了:

mov ebx, [ebp+8]   ; ebx = env
mov eax, [ebx] ; eax = *env
...
mov eax, [ebx] ; eax = (*env)->GetVersion
...
call [eax] ; call *((*env)->GetVersion)

所以 call 应该是 call eax(没有括号)。

此外,您可以删除偏移ebx 的方法,而只需执行mov eax, [ebx + 16]。或者使用 call [ebx + 16]

关于java - 从 nasm 创建的 dll 使用 JNIEnv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23580204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com