الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف تقوم بتنقيح تطبيقات .net من أعين مبرمجي الاسمبلي وقراصنة البرمجيات

بدأه Xacker في 27 نوفمبر 2007 · 20 رد · 8,342 مشاهدة · في منتدى تحليل التطبيقات البرمجية وحمايتها
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

في المواضيع التي ساشرع بطرحها من الان فصاعدا لن يكون هناك شئ hand by hand او step by step وانما ساقوم بوضع الصورة الكبيرة وتجزئيها الى صور صغيرة وعلى القارئ مهمة التدقيق في الصورة بنفسه بتوفيق من الله.

فيما يتعلق بتطبيقات .NET فنحن بحاجة الى عدة برامج لتنقيح هذه التطبيقات, ما يميز هذه البيئة انها تتبع لغة MSIL التي نستطيع ان نقوم بعمل decompile لها والحصول على نص برمجي مشابه تقريبا بنسبة 90% واكثر للشفرة الاصلية للبرنامج. cool :D

بعض هذه التطبيقات على الترتيب:

Reflector: http://www.aisto.com/roeder

9Rays.NET decompiler: http://www.9rays.com

Remote Soft Salamander: http://www.remotesoft.com

التطبيق الاول مجاني, التطبيقين الآخرين لا.

انصح بـ Reflector, لم يخذلني حتى الآن.

كنت قد كتبت الموضوع منذ بضع دقائق بتفصيل اكبر لكم لكن بالغلط تم اغلاق المتصفح. بأي حال, نتابع لاحقاً

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

السلام عليكم ورحمة الله وبركاته,

الآن مثال بسيط على ما اعنيه بـ decompile لشفرة .NET

لنفرض ان لدي البرنامج البسيط ذو الشفرة التالية:

		MsgBox("hello world")
		TextBox1.Text = "ArabTeam2000.com"

لتطبيق ذو نافذة يحوي على زر Button و منطقة نصية TextBox والشفرة السابقة هي في حدث النقر على الزر..

لو قمت بفتح التطبيق في Reflector وقمت بمحاولة تتبع الشفرة تلك لرأيت التالي, انظر الى الطريقة التي استخدمتها في الوصول اليه بين الـ members ضمن الـ Namespace الخاصة بالتطبيق WindowsApplication

post-7008-1196169708_thumb.jpg

هل تلاحظ مدى التشابه في عرض الشفرة؟

المثال بسيط, قد ولن ترى مثله على الارض الواقعية لكن من السهل جدا تنقيح تطبيق تستطيع قراءة سطور برمجية قريبة جدا منه.

ملاحظة: احاول كتابة بعض الاسطر ثم اعود لعملي الى ان اتفرغ ببعض الوقت لاكتب المزيد وهكذا, ليس هناك طريقة اخرى..

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

بارك الله فيك على هذا الموضوع القيم

نحن بانتظار بقية الشرح

زادك الله علما وتقى

#5

شكرا اخي

السلام عليكم ورحمة الله وبركاته,

سيتساءل البعض الآن ان كانت .NET بهذه السهولة عند التنقيح اذن اي شخص يستطيع سرقة ما اكتبه والادعاء بانه يخصه!

في الواقع هذا الأمر صحيح وغير دقيق - صحيح, هو ان اي شخص يستطيع قراءة الشفرات وتقليدها او الادعاء انها تخصه عندما يضعها في برنامجه

الغير دقيق هو موضوع السهولة, فبالامكان جعل هذه العملية اصعب من خلال عملية تدعى obfuscation وليكن المصطلح المعرب منها "تشويش" او لنطلق عليها اسم آخر هو encoding وهو نوعا ما بعيد عن الدقة حيث ان اي شئ encoded كما نعلم يحتاج الى ان يصبح decoded قبل ان يتم تنفيذه, بينما في عملية الـ obfuscation فلا تحتاج الى عملية deobfuscation للكود, على العكس الكود يبقى سليم والشفرات كما هي لكن عملية التشويش تعنى ان نقوم بأخذ النصوص الصريحة مثلا ونستبدلها بتوابع تقوم بتوليد هذه النصوص وفق خوارزمية رياضية (encoding / decoding مرة أخرى؟؟ لا تعقد الامر على نفسك)

او نقوم باخذ اسماء التوابع والوظائف الموجودة في التطبيق ونستبدلها بتوابع وثوابت وقيم واسماء وظائف عشوائية بالنسبة لعين البشر لكنها مرتبطة ونظامية لا تشوبها شائبة في الكود نفسه عند التنفيذ.

كيف؟

هناك برامج تجارية واخرى مجانية تقوم بهذا

على سبيل المثال لا الحصر

dotfuscator وهو ملحق بنسخة الفيجوال ستديو

Remotesoft .NET obfuscator

9Rays.NET obfuscator

XenoCode solution

والعديد

/index.php?showtopic=74499

اممممممم.. اذن استطيع ان اقوم بمنع المتلصصين والقراصنة من اخذ تعبي؟

اممممممم, لا

تستطيع ان تقوم بمنع المتلصصين من اخذ شفرات برنامجك كما هي واستخدامها مباشرة دون عناء

لكن لا تستطيع ان تقوم بمنع القراصنة من هذا, if it works, it can be cracked

هذا مبدأ القراصنة

طالما انك تقوم فقط بتشويش اسماء وعناوين وارقام

الا يملك القراصنة شئ اسمه debugger؟

جيد لنقل في .NET عمليه الـ debugging صعبة, ستعلم لاحقا لماذا

ماذا عن الـ decompiling وقراءة اسطر البرنامج بتمعن؟

هناك امر آخر, القراصنة يملكون الوقت, انت لا تملكه

اذن ماذا نفعل؟

نأخذ منهم ادواتهم

هناك بعض تطبيقات الـ obfuscation تقوم بالتلاعب بالـ CLR بحيث لا يغدو من الممكن فكه بـ Reflector

هذه المشكلة كنت اعاني منها الى ان قام البعض بتنقيح مثل هذه التطبيقات وايجاد طريقة لاصلاح الـ CLR او التلاعب عليه ببايت او اثنين فقط :)

حسنا الى هنا ماذا استفدنا؟

اصبحنا نعرف انه يوجد بعض الطرق لتقوية الحماية ويوجد من يحاول تخطيها

أمر آخر هو الـ StrongName protection الذي سأتكلم عنه في المشاركة التالية عندما يتوفر لدي الوقت لها ان شاء الله.. اريد ان اشرب الشاي الآن

السلام عليكم

تم تعديل هذه المشاركة بواسطة Junkie في 28 نوفمبر 2007 في 18:37

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

السلام عليكم

شكرا Junkieعلى هذا الموضوع الشيق.

يوجد هذا الرابط أيضا يناقش نفس المسألة

وفي هذا الرابط التقنية الجديدة التي س\تعتمدها مايكروسوفة لحماية الأكواد. الفكرة تتمثل في تغير أسماء الأقسام والمتغيرات... إلى تسميات يصعب فهمها أو بالأحرى يصعب تتبعها لفهم الكود كامل

post-91400-1196285414_thumb.jpg

وعند محاولة فتح أحد الملفات:

post-91400-1196285525_thumb.jpg

وعند التمكن أخيرا من فتح الملف نجد أكواد كهذا

				internal class ק : ListViewItem
				   {
					   private uint;
					   private IntPtr ת;

					   public ק()
					   {
						   base.SubItems.Add("");
						   base.SubItems.Add("");
					   }

					   public IntPtr ר
					   {
						   get
						   {
							   return this.ת;
						   }
						   set
						   {
							   this.<font color="#ff0000">ת</font> = value;
							   base.SubItems[1].Text = string.Format("0x{0:X8}", value);
						   }
					   }

					   public uint ש
					   {
						   get
						   {
							   return this.׫;
						   }
						   set
						   {
							   this.׫ = value;
							   base.SubItems[2].Text = string.Format("0x{0:X8}", value);
						   }
					   }

 internal enum Խ
		   {
			   Ծ,
			   Կ,
			   Հ,
			   Ձ
		   }

وتتمثل هذه الطريقة في إستعمال برنامج يقوم بتشفير نص الكود مع الحفاض على العلاقة بين الأقسام و عمل البرنامج ككل. ويكون ذلك بإستعمال الملف الرئيسي للبرنامج .csprojوهذا مثال على محتوياته:

	   ....
		<Compile Include="Program.cs" />
		   <Compile Include="Properties\AssemblyInfo.cs" />
		   <EmbeddedResource Include="Form1.resx">
			 <SubType>Designer</SubType>
			 <DependentUpon>Form1.cs</DependentUpon>
		   </EmbeddedResource>
		   <EmbeddedResource Include="Properties\Resources.resx">
			 <Generator>ResXFileCodeGenerator</Generator>
			 <LastGenOutput>Resources.Designer.cs</LastGenOutput>
			 <SubType>Designer</SubType>
		   </EmbeddedResource>
	   ....

توجد طريقة ثانية أو مشابهة وتتمثل في تغير أسماء الدوال والأقسام إلى سلسلة أرقام أو سلسلة أرقام وحروف ليصبح الكود مشابه للنموذج التالي:

internal static void 1254862487121233065(Form 99651212330)
	{
	 int 554234687612 = 125871212330654862487121233065(99620771212330.065486248712123, -20) | 0x4000000;
	 132689854577855423.46876121279332301154(6876121.8954571533, -20, 130543873617);
	}

:wacko:

هذه الطريقة التي يستعملها حديثا فريق ال Open CompactFramework

#7

حسبما فهمت من الـ SLP انه يعتمد ايضا على عملية الـ obfuscation في عمله

هذا ما قرأته من ردك

عندما قرأت ما وجدته على موقع مايكروسوفت بصراحة كالعادة, كلام شركات معسول كبير ومفخم الى اقصى درجة

اريد الواقع

موضوع تغيير اسماء الدوال وخلافه كل الشركات التي تطرح منتجات لحماية الـ .NET apps تقوم بهذا الأمر

لكن صدقني لم اجد برنامج بين يدي استطعت تنقيحه بـ Reflector على سبيل المثال حتى لو كان obfuscated الا وقمت بقرصنته خلال فترة وجيزة

لا تنسى ان هناك امور لن يستطيعوا تغييرها على الاطلاق وهي ما اعتمده غالبا

باي حال, التجربة خير برهان

احاول الان الحصول على تطبيق من موقع Microsoft نفسه موضوع للتجربة وسأرى ما هذه التقنية الجديدة.

السلام عليكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#8

لم يعمل لدي هذا الـ SLP بشكل صحيح لا اعلم السبب

هلا تقوم بتجريبه اخي بن العيد وتضع ملف محمي فيه باقصى درجات الحماية لو سمحت.

السلام عليكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#9

السلام عليكم

لم أعر الكثير من الإهتمام للرابط الذي وضعته سابقا حول أسلوب الحماية الجديدة التي توفرها مايكروسوفة لأنها تبقى دائما قائمة على خلل :) ... كيف؟؟؟

قم بالتلاعب بالheader كما شئت ففي نهاية المطاف عدد البايتات المشكلة لذلك الheader معروفة (على حد علمي مشتركة بين المشاريع المطورة في بيئة الدوت نت وربما تفترق حسب لغة البرمجة) لذلك إحذف ذلك الheader وعوضه بآخر لملف قابل للفتح.

الحل الناجع لهذه المسألة هو ...

هل ستدفع لي ثمن المعلومة ؟ :P

قبل الإجابة إطلع على هذا الموضوع العلاقة بين ثلاثة أرقام الSDK التي كانت عندي وقتها مطورة بمزيج من السي و السي شارب. تمكنت من فتح المكتبة سي شارب ولكن البقية لا أنها مطورة بالسي وجزء كان معرف داخل المكتبة سي حيث أن الخوازمية تأخذ كمدخل العنوان MAC لحاسوب الكف و الرقمIMEI . ونفس الخوارزمية تستعملها الشركة الموفرة لل SDK لمنح الترخيص إثر مدها بذلك الرقمين.

لذلك يبقى الحل الأنجع هو إستعمال مكتبات dllمع المشروع دوت نت وإن أمكن خزن أقصى حد ممكن فيها خاصة الأجزاء الرئيسية لعمل البرنامج ككل وربطها بالمكتبة التي تطلب ترخيص.

يبقى الكود دوت نت!!!

إذا تم خزن أهم جزء من الكود في مكتبات dll فإن كود الدوت نت الذي سيتم الحصول عليه لن يكون ذا قيمة. أما إذا أردت إخفائه أيضا فعليك باللغة العربية :)

في أغلب الأجهزة لا يكون هناك دعم للغة العربية. لذلك إذا إتبعت ردي السابق و إستعملت اللغة العربية فعند فتح ملف الكود ستظهر مربعات أو نقاط تعجب فيتعجب... وتصور البقية

تم تعديل هذه المشاركة بواسطة بن العيد في 2 ديسمبر 2007 في 00:06

#10

قرأت على السريع

لم افهم شئ :D

سأتابع الموضوع لاحقا بالامور الموجودة الان الى ان نصل الى فهم SLP أفندي :P

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#11

بخصوص الموضوع, نتابع

تنقيح تطبيقات .NET ليس بالأمر صعب

قراءة التعليمات وسطور الشفرة ليست بالأمر العظيم

المشكلة تكمن في التعديل - ليس في تنفيذه - وإنما في وضع الصورة الصحيحة التي يجب التعديل على أساسها

فكما نعلم الشفرة مكتوبة بـ MSIL لذلك التعليمات ليست تعليمات الاسمبلي التي تعودنا عليها

وهذه قائمة بالتعليمات لضرورة الالمام بها:

http://www.koders.com/c/fid52F88B563EF2F99...25DFBB629F.aspx

الآن

لنفرض, وجدنا المراد التعديل عليه

في معظم الأوقات, افضل طريقة لقرصنة تطبيقات .NET هي عبر التعديل على الشفرة

في بعض الاوقات تجد ان الخوارزمية من الممكن متابعتها لاعادة كتابة keygen

غالبا في .NET عندما يتم الاعتماد على مثل هذا الامر يتم استخدام خوارزميات التشفير في التدقيق, RSA (SHA256)

المهم

بعد ان نقوم بايجاد المكان المراد التعديل عليه (وهو غالبا يجب ان يتم بصورة دقيقة جدا والا يتم اتلاف الشفرة)

الخطوات المتبقية هي 2

تحديد البايتات, يتم هذا عن طريق برنامج PEBrowse disassembler حيث نقوم بالبحث عن الاجرائية التي اخذنا اسمها من Reflector

بعدها نقوم بتحديد هذه البايتات ومن ثم عن طريق برنامج hex editor نقوم بالتعديل المطلوب (الممل :P)

هذه الفكرة هي العامة

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#12

لو ما زال هناك من يتابع الموضوع, ما رأيكم في اي تطبيق نجرب عليه الأمر شريطة ان يكون صغير الحجم نوعا ما كي يسهل على البقية تحميله؟

الاقتراحات مقبولة بغض النظر عن التطبيق.

السلام عليكم

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#13

أتمني أن أري تجربة , وأعتقد ان سبب عدم تفاعل الأعضاء هو انهم يريدون شرح بالصور أو فيديو وكود و Copy & Paste وانتهت المسألة ,,,

#14

سترى تجرية وستعجبك ;)

التطبيق الذي سأقوم باختباره هو Janus Systems controls

النسخة التي ساعتمدها هي المتوفرة "حاليا" في الموقع وهي الاصدار 3.5.0.20

من خلال الامثلة المتوفرة في الحزمة بعد التنصيب قمت بفتح المثال باسم Button Bar

فظهرت لي النافذة التالية

post-7008-1197498345_thumb.jpg

اما بقية اجزاء البرنامج فلا تشوبها شائبة. ما اريده هو ازالة هذه النافذة.

على المسار الافتراضي للتثبيت

C:\Program Files\Janus Systems\Controls for Microsoft .NET\Windows Forms Controls v3\Bin

ساقوم بفتح الملف باسم Janus.Windows.ButtonBar.v3.dll بواسطة Reflector

post-7008-1197498508_thumb.jpg

الى الآن كل الامور بخير

نسيت ان اذكر امر مهم, في Reflector اجعله يقوم باعتبار الـ framework المراد التنقيح لها هو 1.x وفي حال كنت قد اخترت optimization اخرى معينة مثل 2.0, 3.0, 3.5 (اصدارات ال FW) فقم بالتعديل على ملف Reflector.cfg واحذف ما يقع تحت تبويب AssemblyManager فقط.

post-7008-1197502268_thumb.jpg

هذا ما سيظهر لك.

كيف سأجد شفرة النافذة الآن في هذا الكم الهائل من الأسطر البرمجية؟

لدينا خيارات مساعدة لا بأس بها, انظر الى النافذة

هناك الكثير من النصوص التي استطيع البحث عنها لعلي أجدها.. لنقم بالبحث عن بعض ما يظهر على الصورة.. اختر كلمات مميزة, وليس النص بالكامل

بعد البحث لن تجد اي شئ post-7008-1197499317_thumb.png

لا بأس, انظر لو حاولت الاطلاع على الـ namespaces لوجدت انه يتم اضافة اسمبلي اخرى هي Janus.Windows.Common.v3

حاول البحث مرة أخرى ولن تجد شيئا.. post-7008-1197501441_thumb.png

حسنا, another approach

سأتبع ما يشبه الـ API ضمن الـ framework

ساحاول الوصول الى العنصر الخاص بالنافذة, الـ dialog نفسه

المسار الذي توجد عليه الوظيفة التي اريد هو التالي:

System.Windows.Forms.Form.ShowDialog

هذه الوظيفة هي المسؤولة عن اظهار Dialog معين على الشاشة.. جيد

بعد الوصول اليها وتحديدها انقر CTRL+R الاختصار اللازم لعمل analyze لكل الاجرائيات الاخرى التي تقوم باستخدامها

ثم اختر used by وسيظهر

29021245mr9.th.jpg

ما يثير اهتمامي هو الثلاث وظائف في المنتصف

قمت بعرض الوظيفة الثالثة منهم فظهر لي الكود التالي

Friend Sub a(ByVal text1 As String)
	Me.b.Visible = True
	Me.c.Text = text1
	Me.c.Visible = False
	MyBase.ClientSize.Height = (MyBase.ClientSize.Height - Me.c.Height)
	MyBase.Height = (MyBase.Height - Me.c.Height)
	MyBase.ShowDialog
End Sub

لاحظ معي, obfuscated :) اسماء الوظائف لا معنى لها..

ما هو هذا النص text1

لاحظ انه يتم اسناده للوظيفة من اجرائية اخرى.. مرة أخرى CTRL+R > used by

هذه المرة اخترت

Janus.Windows.ButtonBar.ButtonBarLicenseProvider.GetLicense(LicenseContext, Type, Object, Boolean) : License

من القائمة التي ستظهر

الامور بدأت تأخذ منحى جميل :)

الشفرة الخاصة بهذه الوظيفة هي

Public Overrides Function GetLicense(ByVal context As LicenseContext, ByVal type As Type, ByVal instance As Object, ByVal allowExceptions As Boolean) As License
	Dim designTime As Boolean = (context.UsageMode = LicenseUsageMode.Designtime)
	Dim a As a = Nothing
	a = New a(Me, type, True, designTime)
	If ((Not a Is Nothing) AndAlso a.b) Then
		If designTime Then
			If a.a.c Then
				If allowExceptions Then
					ButtonBarLicenseProvider.a(type, Me)
				Else
					a = Nothing
				End If
			ElseIf a.a.d Then
				New JNSC().a(a.a.b)
			End If
		ElseIf ((Not a.a.b OrElse a.a.c) OrElse a.a.d) Then
			ButtonBarLicenseProvider.a(type)
		End If
	End If
	If ((designTime AndAlso (Not a Is Nothing)) AndAlso Not a.b) Then
		context.SetSavedLicenseKey(type, a.LicenseKey)
	End If
	Return a
End Function

لندع هذه الوظيفة ولنعد الى الوظائف الثلاث السابقة

لنطلع على الوظيفة الثانية فيهم

سنجد الشفرة التالية

Friend Sub a(ByVal bar1 As ButtonBar)
	Try 
		Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey(a.a(ChrW(5308) & ChrW(5336) & ChrW(5327) & ChrW(5341) & ChrW(5344) & ChrW(5322) & ChrW(5339) & ChrW(5326) & ChrW(5317) & ChrW(5299) & ChrW(5322) & ChrW(5335) & ChrW(5342) & ChrW(5340) & ChrW(5257) & ChrW(5308) & ChrW(5346) & ChrW(5340) & ChrW(5341) & ChrW(5326) & ChrW(5334) & ChrW(5340) & ChrW(5317) & ChrW(5312) & ChrW(5330) & ChrW(5335) & ChrW(5325) & ChrW(5336) & ChrW(5344) & ChrW(5340) & ChrW(5257) & ChrW(5295) & ChrW(5336) & ChrW(5339) & ChrW(5334) & ChrW(5340) & ChrW(5257) & ChrW(5292) & ChrW(5336) & ChrW(5335) & ChrW(5341) & ChrW(5339) & ChrW(5336) & ChrW(5333) & ChrW(5340) & ChrW(5257) & ChrW(5295) & ChrW(5336) & ChrW(5339) & ChrW(5257) & ChrW(5271) & ChrW(5303) & ChrW(5326) & ChrW(5341) & ChrW(5317) & ChrW(5291) & ChrW(5342) & ChrW(5341) & ChrW(5341) & ChrW(5336) & ChrW(5335) & ChrW(5291) & ChrW(5322) & ChrW(5339) & ChrW(5257) & ChrW(5311) & ChrW(5276)))
		Me.e.Text = CStr(key.GetValue(a.a(ChrW(5310) & ChrW(5340) & ChrW(5326) & ChrW(5339) & ChrW(5303) & ChrW(5322) & ChrW(5334) & ChrW(5326)), a.a("")))
		Me.i.Text = CStr(key.GetValue(a.a(ChrW(5292) & ChrW(5336) & ChrW(5334) & ChrW(5337) & ChrW(5322) & ChrW(5335) & ChrW(5346)), a.a("")))
		Me.j.Text = CStr(key.GetValue(a.a(ChrW(5305) & ChrW(5339) & ChrW(5336) & ChrW(5325) & ChrW(5342) & ChrW(5324) & ChrW(5341) & ChrW(5300) & ChrW(5326) & ChrW(5346)), a.a("")))
	Catch obj1 As Object
	End Try
	Dim b As b = bar1.a
	If (b Is Nothing) Then
		Me.b.Visible = False
		Me.c.Visible = True
		Dim clientSize As Size = MyBase.ClientSize
		clientSize.Height = (clientSize.Height - Me.b.Height)
		MyBase.ClientSize = clientSize
	Else
		Me.b.Visible = True
		Me.c.Text = b.b
		Me.c.Visible = False
		Dim size2 As Size = MyBase.ClientSize
		size2.Height = (size2.Height - Me.c.Height)
		MyBase.ClientSize = size2
	End If
	MyBase.ShowDialog
End Sub


Friend Sub a(ByVal bar1 As ButtonBar)
	Try 
		Dim key As RegistryKey = Registry.LocalMachine.OpenSubKey(a.a(ChrW(5308) & ChrW(5336) & ChrW(5327) & ChrW(5341) & ChrW(5344) & ChrW(5322) & ChrW(5339) & ChrW(5326) & ChrW(5317) & ChrW(5299) & ChrW(5322) & ChrW(5335) & ChrW(5342) & ChrW(5340) & ChrW(5257) & ChrW(5308) & ChrW(5346) & ChrW(5340) & ChrW(5341) & ChrW(5326) & ChrW(5334) & ChrW(5340) & ChrW(5317) & ChrW(5312) & ChrW(5330) & ChrW(5335) & ChrW(5325) & ChrW(5336) & ChrW(5344) & ChrW(5340) & ChrW(5257) & ChrW(5295) & ChrW(5336) & ChrW(5339) & ChrW(5334) & ChrW(5340) & ChrW(5257) & ChrW(5292) & ChrW(5336) & ChrW(5335) & ChrW(5341) & ChrW(5339) & ChrW(5336) & ChrW(5333) & ChrW(5340) & ChrW(5257) & ChrW(5295) & ChrW(5336) & ChrW(5339) & ChrW(5257) & ChrW(5271) & ChrW(5303) & ChrW(5326) & ChrW(5341) & ChrW(5317) & ChrW(5291) & ChrW(5342) & ChrW(5341) & ChrW(5341) & ChrW(5336) & ChrW(5335) & ChrW(5291) & ChrW(5322) & ChrW(5339) & ChrW(5257) & ChrW(5311) & ChrW(5276)))
		Me.e.Text = CStr(key.GetValue(a.a(ChrW(5310) & ChrW(5340) & ChrW(5326) & ChrW(5339) & ChrW(5303) & ChrW(5322) & ChrW(5334) & ChrW(5326)), a.a("")))
		Me.i.Text = CStr(key.GetValue(a.a(ChrW(5292) & ChrW(5336) & ChrW(5334) & ChrW(5337) & ChrW(5322) & ChrW(5335) & ChrW(5346)), a.a("")))
		Me.j.Text = CStr(key.GetValue(a.a(ChrW(5305) & ChrW(5339) & ChrW(5336) & ChrW(5325) & ChrW(5342) & ChrW(5324) & ChrW(5341) & ChrW(5300) & ChrW(5326) & ChrW(5346)), a.a("")))
	Catch obj1 As Object
	End Try
	Dim b As b = bar1.a
	If (b Is Nothing) Then
		Me.b.Visible = False
		Me.c.Visible = True
		Dim clientSize As Size = MyBase.ClientSize
		clientSize.Height = (clientSize.Height - Me.b.Height)
		MyBase.ClientSize = clientSize
	Else
		Me.b.Visible = True
		Me.c.Text = b.b
		Me.c.Visible = False
		Dim size2 As Size = MyBase.ClientSize
		size2.Height = (size2.Height - Me.c.Height)
		MyBase.ClientSize = size2
	End If
	MyBase.ShowDialog
End Sub

لست خبير .NET لكن الا تبدو لك هذه النصوص التي يتم تجميعها من سلسلة Chars مثيرة للشبهات post-7008-1197504780_thumb.gif

لننظر الى الوظيفة الاولى

Private Sub b(ByVal Object, ByVal EventArgs)
	Dim jnsp As New JNSP
	jnsp.a(a.a(""))
	If (jnsp.ShowDialog = DialogResult.OK) Then
		Dim layout As ButtonBarLayout = Me.a.GetLayout
		Me.a.Layouts.Add(layout)
		Try 
			layout.Key = jnsp.a
		Catch obj1 As Object
			Dim num As Integer = 1
			Do While Me.a.Layouts.Contains((a.a(ChrW(5301) & ChrW(5322) & ChrW(5346) & ChrW(5336) & ChrW(5342) & ChrW(5341)) & num))
				num += 1
			Loop
			layout.Key = (a.a(ChrW(5301) & ChrW(5322) & ChrW(5346) & ChrW(5336) & ChrW(5342) & ChrW(5341)) & num)
		End Try
		Me.a.CurrentLayout = layout
		Me.b
	End If
	jnsp.Dispose
End Sub

يبدو ان الوظائف الثلاثة لها مهمة تتعلق باظهار النافذة ومحتوياتها.. قبل ان اقوم بتحديد الاجزاء المسؤولة عن اظهار النافذة بالضبط سأترك الموضوع قليلا كي يتم استيعاب ما ذكر بشكل اكبر

ان شاء الله نتابع في اقرب فرصة وعذرا على التأخير فالامتحانات على الابواب

السلام عليكم

تم تعديل هذه المشاركة بواسطة Junkie في 13 ديسمبر 2007 في 03:33

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#15

السلام عليكم ,,

صراحة موضوع و لا أحلى مع الأمثلة :thumb_up:

بس كان لي طلب و هو اعطائنا بعض المراجع للأوامر, أريد مراجع تشرح الأوامر و ليس مواضيع ,,

تحياتي لك أخ Junkie

#16

تفضل أخي خالد

http://msdn2.microsoft.com/en-us/library/s...es_members.aspx

هذه الصفحة تشرح استخدام كل opcode من MSIL

السلام عليكم ورحمة الله

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#17

بسم الله

كلاااااااااااام جميل وكلام معقول مقدرش اقول حاجة عنه

بس يا ريت نكمل المشوار

جزاك الله خيرًأ يا أخ Junkie وفي انتظارك

#18

موضوع جميل جدا وشيق

الرجاء الإكمال

ويعطيكم ألف عافية

#19

موضوع اكثر من رائع  دائما مبدع الله يزيدك من علمه

127gq4.png
#20

السلام عليكم و رحمة الله و بركاته

عودة للموضوع و معي هذه المرة حل ربما يكون جذري :wink:

Extending MFC Applications with the .NET Framework

كتاب جيد يفسر كيفية المزج بين تطبيقات ال MFC و لغات الدوت نت... يبدو أنه الحل

لأن ملف التشغيل لن يحتوي على MSIL/SIL header بل executable machine code

يمكن الإطلاع على مزيد من التفاصيل هنا

مكتبات الربط الديناميكي: التطوير و الإستخدام

إن شاء الله سأضع نسخة من هذا الكتاب في أقرب فرصة

#21

مشكور أخي على هذا الشرح الرائع..

أسأل الله أن ينفع الناس بعلمك...وجزاك الله عنا ألف خير .

:clapping:

get-8-2008-ltbjogmcwtd.gif

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…