- PR -

.NETやXMLはウイルス作者にとっても最適の環境

投稿者投稿内容
arton
会議室デビュー日: 2002/03/22
投稿数: 19
投稿日時: 2002-04-01 08:15
引用:

NothingBut.NETFXさんの書き込み (2002-03-31 04:28) より:
私の上記のコードですと、System.Consoleは(自分じゃない)他のアセンブリに入ってますから、他のアセンブリのNonPublicを呼んでいると思うんですが。。。こういうことではない?


そういうことに近いですが実際は動的な呼び出しではありません。
Xの派生クラスを作成して、そのクラス内で
il.Emit(OpCOdes.Call, typeof(X).GetMethod("foo", BindingFlags.NonPublic | ..);
(fooはinternal)となるコードを生成すると、この呼び出しが、MemberAccessExceptionになるということです。fooをpublicにすれば問題はないわけですが、呼び出すべき規則がいろいろあるため、単純にpublicにするのは問題を感じるためランタイム中に隠しておきたいとかあって。
#えと、別にウィルス作者じゃないです。
http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/netruby.html
で、インタープリターの部分がほぼ終わったので、実際にコードを生成するテストをいろいろしているところなんで。(サイトにコンパイルを行うソースはまだ置いてないです)
NothingBut.NETFX
大ベテラン
会議室デビュー日: 2001/09/13
投稿数: 102
投稿日時: 2002-04-01 13:02
どはずしの可能性大ですが。。。

引用:

artonさんの書き込み (2002-04-01 08:15) より:
そういうことに近いですが実際は動的な呼び出しではありません。
Xの派生クラスを作成して、そのクラス内で
il.Emit(OpCOdes.Call, typeof(X).GetMethod("foo", BindingFlags.NonPublic | ..);
(fooはinternal)となるコードを生成すると、この呼び出しが、MemberAccessExceptionになるということです。fooをpublicにすれば問題はないわけですが、呼び出すべき規則がいろいろあるため、単純にpublicにするのは問題を感じるためランタイム中に隠しておきたいとかあって。



ILGeneratorをお使いということは、このコードはAppDomain.DefineDynamicAssemblyから始まっているのではないかと思うのですが、とするとこの時点で今のコードが含まれるアセンブリとこれから作ろうとしているコードが含まれるアセンブリは違うものになっちゃいますから、他の型のinternalメソッドは呼べなくなってしまいます。試しに次のコードならちゃんと実行できました。

コード:

AppDomain ad = AppDomain.CurrentDomain;
AssemblyName name = new AssemblyName();
name.Name = "DynAsm";
AssemblyBuilder ab = ad.DefineDynamicAssembly(
name, AssemblyBuilderAccess.Run);
ModuleBuilder mb = ab.DefineDynamicModule("DynMod");

TypeBuilder tb1 = mb.DefineType(
"X", TypeAttributes.Class | TypeAttributes.Public);
MethodBuilder mtb1 = tb1.DefineMethod(
"foo", MethodAttributes.Assembly,
CallingConventions.Standard, typeof(void), new Type[]{});
ILGenerator il1 = mtb1.GetILGenerator();
il1.Emit(OpCodes.Ldstr, "Hello");
il1.Emit(OpCodes.Call,
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }));
il1.Emit(OpCodes.Ret);

Type x = tb1.CreateType();

TypeBuilder tb = mb.DefineType(
"DynType", TypeAttributes.Class | TypeAttributes.Public, x);
MethodBuilder mtb = tb.DefineMethod("bar",
MethodAttributes.Public,
CallingConventions.Standard, typeof(void), new Type[]{});
ILGenerator il = mtb.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Call, x.GetMethod("foo",
BindingFlags.NonPublic | BindingFlags.Instance));
il.Emit(OpCodes.Ret);

Type t = tb.CreateType();
object o = Activator.CreateInstance(t, true);
MethodInfo[] mi = t.GetMethods();
object ret = t.InvokeMember("bar",
BindingFlags.InvokeMethod, null, o, new object[]{});



うーん、やっぱはずしてますかね。ま、たとえおおはずしだったとしても、Reflection.Emitの例ということで。

引用:

#えと、別にウィルス作者じゃないです。



もちろん存じ上げております。邪道編買いました

[ メッセージ編集済み 編集者: NothingBut.NETFX 編集日時 2002-04-02 02:12 ]

スキルアップ/キャリアアップ(JOB@IT)