PDA

View Full Version : حرفه ای: تبدیل کد IL به کد C#‎



Houmehre
سه شنبه 20 مهر 1389, 00:14 صبح
با سلام من تازه این انجمن شدم و این اولین سوالم هستش.
میخواستم بدونم از دوستان کسی با IL آشنایی داره، یه قطعه کد دارم که نمی تونم به C#‎‎ تبدیلش کنم. اگه کسی از اساتید کمک کنه ممنون میشم. Reflector دارم، اما این ابزار به درد من نمیخوره. چون من یه کد IL دارم که کد C#‎‎ رو ازش می خوام، نه یه اسمبلی دات نت.
ممنونم:عصبانی:
کد:




.method public hidebysig specialname static class MyUserControl.MsAjaxProxy get_Current() cil managed
{
.maxstack 4
.locals init (
[0] object obj2)
L_0000: call class [System.Web]System.Web.HttpContext [System.Web]System.Web.HttpContext::get_Current()
L_0005: callvirt instance class [mscorlib]System.Collections.IDictionary [System.Web]System.Web.HttpContext::get_Items()
L_000a: ldstr "__ClientScriptProxy"
L_000f: callvirt instance object [mscorlib]System.Collections.IDictionary::get_Item(object)
L_0014: dup
L_0015: brtrue.s L_0034
L_0017: pop
L_0018: call class [System.Web]System.Web.HttpContext [System.Web]System.Web.HttpContext::get_Current()
L_001d: callvirt instance class [mscorlib]System.Collections.IDictionary [System.Web]System.Web.HttpContext::get_Items()
L_0022: ldstr "__ClientScriptProxy"
L_0027: newobj instance void MyUserControl.MsAjaxProxy::.ctor()
L_002c: dup
L_002d: stloc.0
L_002e: callvirt instance void [mscorlib]System.Collections.IDictionary::set_Item(object, object)
L_0033: ldloc.0
L_0034: isinst MyUserControl.MsAjaxProxy
L_0039: ret
}

r00tkit
سه شنبه 20 مهر 1389, 00:42 صبح
سلام

این کد رو از کجا اوردید؟ خوب اگه اسمبلی هستش با reflector به C# تبدیل کنید

dr_jacky_2005
سه شنبه 20 مهر 1389, 10:17 صبح
با سلام من تازه این انجمن شدم و این اولین سوالم هستش.
میخواستم بدونم از دوستان کسی با IL آشنایی داره، یه قطعه کد دارم که نمی تونم به C#‎‎‎ تبدیلش کنم. اگه کسی از اساتید کمک کنه ممنون میشم. Reflector دارم، اما این ابزار به درد من نمیخوره. چون من یه کد IL دارم که کد C#‎‎‎ رو ازش می خوام، نه یه اسمبلی دات نت.
ممنونم:عصبانی:
کد:




.method public hidebysig specialname static class MyUserControl.MsAjaxProxy get_Current() cil managed
{
.maxstack 4
.locals init (
[0] object obj2)
L_0000: call class [System.Web]System.Web.HttpContext [System.Web]System.Web.HttpContext::get_Current()
L_0005: callvirt instance class [mscorlib]System.Collections.IDictionary [System.Web]System.Web.HttpContext::get_Items()
L_000a: ldstr "__ClientScriptProxy"
L_000f: callvirt instance object [mscorlib]System.Collections.IDictionary::get_Item(object)
L_0014: dup
L_0015: brtrue.s L_0034
L_0017: pop
L_0018: call class [System.Web]System.Web.HttpContext [System.Web]System.Web.HttpContext::get_Current()
L_001d: callvirt instance class [mscorlib]System.Collections.IDictionary [System.Web]System.Web.HttpContext::get_Items()
L_0022: ldstr "__ClientScriptProxy"
L_0027: newobj instance void MyUserControl.MsAjaxProxy::.ctor()
L_002c: dup
L_002d: stloc.0
L_002e: callvirt instance void [mscorlib]System.Collections.IDictionary::set_Item(object, object)
L_0033: ldloc.0
L_0034: isinst MyUserControl.MsAjaxProxy
L_0039: ret
}



این کد Intermediate Language است
کد میانی.

یعنی مثلا کدسی شارپ رو کامپایلر میگیره، بعد تبدیلش میکنه به IL که این یک فایل اگزه است.
به چه درد میخوره؟ توو هر پی سی،وقتی اجرا میشه،میاد یک اگزۀ نهایی مخصوص اون CPU میده.و از دفعه های بعد که اگزه رو اجرا کنیم(اگزۀ نهایی) دیگه نمیاد چیزی رو چک کنه و برنامه باز اجرا میشه.

قدیم ندیما کامپایلر مستقیمآ میومد به اگزۀ نهایی تبدیل میکرد،واسه همین توو CPUهای مختلف با مشکل مواجه میشد.
شما الآن کد اون IL رو دارین.
نیاز به هیچ برنامۀ خاصی نیت.
با خود FrameWork میشه برش گردوند به کد سی شارپ.
ولی فعلآ اون توو ذهنم نیسن.
فعلا این کارت رو راه میندازه:
http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1#

Houmehre
سه شنبه 20 مهر 1389, 16:21 عصر
دوستای عزیز geek1982 (http://barnamenevis.org/forum/member.php?u=113200) و dr_jacky_2005 (http://barnamenevis.org/forum/member.php?u=62126)، از هر دوتون برای بذل توجه و پاسخگویی ممنونم، اما متاسفانه مثل اینکه هیچکدومتون نوشته منو کامل نخوندید؛ یا اینکه چون گفتم تازه وارد این فوروم شدم فکر کردید که دات نت رو هم تازه شروع کردم؛
من کاملا میدونم Intermediate Languageچیه و تو پری کامپایل و کامپایل برنامه های دات نت چه اتفاقاتی میفته و یه برنامه مثل رفلکتور که dr_jacky_2005 (http://barnamenevis.org/forum/member.php?u=62126) عزیز زحمت آدرس دانلودش رو برام کشیدن (http://reflector.red-gate.com/downlo...eatAsUpdate=1# (http://reflector.red-gate.com/download.aspx?TreatAsUpdate=1#) ) ، چه و چطور کار میکنه.
اگه دقت فرموده باشید عرض کردم رفلکتور کارم رو راه نمیندازه چون من اسمبلی ندارم، بلکه عین خود کد IL رو دارم. لطف بفرمایید راهنماییم کنید چون کارم گیره، وحشتناک هم گیره.
البته توضیحا عرض کنم سراغ InlineIL هم رفتم و کارم حل نشد. تنها راه، تفسیر خود کد هست. دلیلش اینه که این کد یه خطایی داره و اسکریپت هایی مثل InlineIL نمی تونن کاری کنن، چون خطای این کد باعث میشه کامپایل نشه، من باید کد رو بفهمم تا بتونم خطا رو پیدا کنم.
بازم ممنون و متشکر و در انتظار کمک.

r00tkit
سه شنبه 20 مهر 1389, 16:50 عصر
سلام

دوست عزیز من گرفتم شما چی گفتی ! پرسیدم این کد رو از کجا اودی چون شک داشتم ببینم ایا فقط همین کد رو داری یا از یه اسمبلی با ildasm خوندیش


چون زبان IL یه زبان stack base هستش opcode هار رو به ترتیب بخون (مثل اسمبلی )

امروز من در این وضع هستم" اگـر قـرار بـاشه كاری خراب بشه و درست پیش نره، حتما خراب می شـه آن هـم در نامناسبترین زمان! "

شاید فردا جوابتون رو نوشتم

لبخند بزن فردا روز بدتریه