0

我刚来这地方。同样,我需要一些帮助来使用 JNA 将一些 C# 代码转换为 Java 来调用本机 Windows 函数。

首先,这是我要转换的代码:http: //pastebin.com/0b5zMvBg

到目前为止,我已经编写了 JNA 接口来表示 Kernel32 和 NtDll 库。在 Kernel32 库中,我还定义了需要使用的结构。

Kernel32.java http://pastebin.com/93xTvD0T

NtDll.java http://pastebin.com/giup88Tk

在我定义了库和结构之后,我开始编写非本地函数。问题是,我不了解所有的 C# 语法。但是,我确实了解 C# 中的所有 Java 功能。

这是我到目前为止所写的;请注意,如果我对我的转换有疑问,我已经评论了我不理解的内容。大多数问题都会重复,这意味着如果您提供我一次转换,我可能会弄清楚如何完成其​​余的工作。事先感谢您的帮助!:-)

http://pastebin.com/jfuzq0cj

4

3 回答 3

2

通常,您甚至没有做任何特定于 C# 的事情,而是做基本的 C 指针算法。

遍历数据块并在数据类型之间执行转换的最简单方法是使用com.sun.jna.Memory而不是byte[]. 您可以使用Pointer.share(long offset)来执行指针运算(结果是原始指针偏移量的请求量)。Pointer.write()您可以使用各种或Pointer.readXXX()变体读取和写入本机内存。

您可以使用 a 作为基地址来初始化 Java 端Structure对象Pointer,只需记住显式调用Structure.read()以将本机内存同步到 Java。

一些例子,来自你的馅饼:

Memory data = ...;
// mzH = *(MZHeader*) dPtr;
MZHeader mzH = new MZHeader(data);
mzH.read(); // or put this in the MZHeader(Pointer) ctor
// peH = *(PE_Header*)&dPtr[mzH.offsetToPE];
PE_Header peH = new PE_Header(data.share(mzH.offsetToPE));
peH.read(); // or put this in the PE_Header(Pointer) ctor
// peXH = *(PE_ExtHeader*)&dPtr[mzH.offsetToPE + sizeof(PE_Header)];
PE_ExtHeader peXH = new PE_ExtHeader(data.share(mzH.offsetToPE + peH.size()));
peXH.read(); // or put this in the PE_ExtHeader(Pointer) actor

我想你可以从那里得到这个想法......

编辑

Pointer p = new Memory();
byte[] data = ...;
// Copy into Memory from data
p.write(0, data, 0, data.length);
// Copy out of Memory into data
p.read(0, data, 0, data.length);
于 2013-01-02T21:06:33.963 回答
1

所以你的 Kine.Run() 看起来就像这段代码的主要入口点。它所做的是获取给定的字节数组,分叉当前进程,然后用字节数组覆盖当前进程内存并开始执行它。如果您实现了这一点,您会将字节数组作为子进程运行。

现在,假设字节数组来自文件系统中的某个文件(或者可以写在那里),您可以将所有这些代码替换为以下行:

Runtime.getRuntime().exec(filename);

假设文件名是包含字节数组的文件。无需了解 PE 标头或 Windows 内部结构。如果字节数组来自您无法在本地存储的地方,那么您无论如何都无法运行它。

于 2013-01-02T07:44:52.423 回答
-1

不要学究,但不要那样做。您正在尝试在 JVM 中运行 C# 程序?编写一个抽象出应用程序的操作系统特定部分的层会更简单、更快。您可以在 C# 中执行一些在 JVM 中无法执行的操作。比如加载DLL,然后调用其中的方法。或者从 windows 消息循环中获取消息。

现在,我同意有些事情您可能想做而只能从本机库中完成。喜欢与其他窗口交互。但是您正在用 Java 重新实现 CLR。这是一个巨大的工作量,有些部分永远不会工作。

只是不要这样做。(在此处插入耐克旋风)

于 2013-01-02T06:18:17.703 回答