3

問題は、まだサポートされていない mono 関数への関数呼び出しから始まります。呼び出しは、MWARRAY.DLL (.net バージョン 2.x) と呼ばれる近い matlab DLL から行われます。この dll は通常 VS .NET で使用され、.net 3.5 を使用する場合に機能します。

関数は次のとおりです: [mscorlib]System.Security.Principal.WindowsIdentity::GetCurrent(bool)

いくつかの可能な解決策を考えることができますが、それらを行う方法がわかりません:

  1. dll を逆コンパイルし、バイト コードを同様の機能する関数に置き換えます。 [mscorlib]System.Security.Principal.WindowsIdentity::GetCurrent() 関数にブール値が渡されないことに注意してください。
  2. mono をコンパイルして自分で関数を書く
  3. 古いバージョンの MWARRAY.DLL を使用している (見つからなかったが、同じコードを使用している可能性がある)

逆コンパイルには IDA を使用しました。最初の関数 CIL + HEX への呼び出しがある場所を以下で見つけました

loc_38B1:    
ldsfld  native     
int [mscorlib]System.IntPtr::Zero   
stloc.s 7    
ldc.i4.0
stloc.s 8
ldc.i4.1
stloc.s 9
ldc.i4.1
call    class [mscorlib]System.Security.Principal.WindowsIdentity::GetCurrent(bool)
stloc.s 0xA
call    void [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::PrepareConstrainedRegions()
  .try {
ldc.i4.0
stloc.s 0xB
br      loc_3982

call および stloc コマンドの HEX:

28 96 00 00 0A 

また、他のコマンドがバイトコードでどのように見えるかを確認するためだけに、両方の関数を呼び出して、独自の dll をコンパイルおよび逆コンパイルしました。

loc_3AE:
call    class [mscorlib]System.Security.Principal.WindowsIdentity [mscorlib]System.Security.Principal.WindowsIdentity::GetCurrent()
callvirt class System.String [mscorlib]System.Security.Principal.WindowsIdentity::get_Name()
stloc.s 8
ldc.i4.1

太字のカスタム コンパイル/逆コンパイル行の 16 進数:

28  00 00 0A 6F 1B 00 00 0A  13 08 17

誰かが提案された解決策のパス、または頭に浮かぶ可能性のある何かを知っているかどうか知りたいですか?

4

1 に答える 1

2

これは解決されました。

.netリフレクターを使用してmwarray.dllを抽出すると、VisualStudio内からコードを変更できます。

330行目のクラスMCR()には、getcurrent()の呼び出しがあります。=nullに置き換えます。

于 2012-01-17T06:03:31.847 に答える