0

私はここでは新人です。また、ネイティブのWindows関数を呼び出すためにJNAを使用してC#コードをJavaに変換するためのサポートが必要です。

まず第一に、これは私が変換しようとしているコードです:http: //pastebin.com/0b5zMvBg

これまで、Kernel32およびNtDllライブラリを表すJNAインターフェイスを作成しました。Kernel32ライブラリ内で、使用する必要のある構造も定義しました。

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

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

ライブラリと構造を定義した後、非ネイティブ関数の記述に移りました。問題は、C#構文のすべてを理解していないことです。ただし、C#に含まれるすべてのJava機能を理解しています。

これが私がこれまでに書いたものです。わからないことや、自分の回心について疑問があるかどうかについてコメントしたことに注意してください。ほとんどの問題は繰り返されます。つまり、1回でも変換を提供してくれれば、残りの方法を理解できるでしょう。助けてくれてありがとう!:-)

http://pastebin.com/jfuzq0cj

4

3 に答える 3

2

一般に、C#に固有のことは何もしていませんが、基本的なCポインター演算を行っています。

データのブロックを歩き回り、データ型間の変換を実行する最も簡単な方法は、com.sun.jna.Memoryではなくを使用することですbyte[]。を使用Pointer.share(long offset)してポインタ演算を実行できます(結果は、要求された量だけオフセットされた元のポインタです)。Pointer.write()さまざまなバリアントまたはバリアントを使用して、ネイティブメモリの読み取りと書き込みを行うことができますPointer.readXXX()

ベースアドレスとしてを使用してJava側のStructureオブジェクトを初期化できますが、ネイティブメモリをJavaに同期Pointerするために明示的に呼び出すことを忘れないでください。Structure.read()

あなたのペーストからのいくつかの例:

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#プログラムを実行しようとしていますか?アプリケーションのOS固有の部分を抽象化するレイヤーを作成する方が簡単で高速です。JVMでは機能しないC#で実行できることがいくつかあります。DLLをロードしてから、DLL内のメソッドを呼び出すなど。または、Windowsメッセージループからメッセージを取得します。

さて、ネイティブライブラリからしか実行できないことがいくつかあることに同意します。他のウィンドウと対話するように。ただし、JavaでCLRを再実装しています。これは膨大な量の作業であり、一部のパーツは機能しません。

ただそれをしないでください。(ここにナイキスウッシュを挿入)

于 2013-01-02T06:18:17.703 に答える