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

التقنيات المُستخدمة لبرمجة الكيجين و توليد السيريال

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

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

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

بالتوفيق.

#2

فيما يخص الكيجن أو برامج توليد السريالات ففبها نوعان :

بعضها يتم ادخال سلسلة السريالات التي سوف تولدها في الكود الخاص بها ...

والبعض الآخر منها تولد السريالات اعتمادا على خوارزميات تأخد بعين الاعتبار معايير محددة في الجهاز والبرنامج المستهدف

تم تعديل هذه المشاركة بواسطة OricalcosZy في 27 يونيو 2011 في 22:48

Zefri Yahya - ArabTeam 2000

tpc7rzy94tx8iduak4b.png

#3

الأكثر شيوعاً في البرمجة هي لغة

الأسيمبلي ... حيث تتميز بصغرها وفعاليتها في هذا المجال ، الا انه يلزمك للقيام

بهذا

فك ضغط البرامج وكسر حمايتها مثل برامج Quick Unpack ,

VMunpacker , RL!depacker ، وتحليلها بإستخدام برنامج Ollydbg >>

بالإضافة الى وجود الفك اليدوي ..

وطرق فك البرامج وكسر حمايتها تختلف من برنامج الى برنامج حسب اللغة التي تمت بها برمجة البرنامج فمثلاً البرامج المبرمجة بال.Net تكسر بالــ Dotnet Reflector

والدلفي DeDe ...... -

اسمها بضحكني دايماً - ROFL.gif وهكذا تختلف حسب اختلاف البرنامج ... وهنالك أدوات

كثيرة لنفس لغة البرمجة ولكن هذه ما اعرفها ...

على العموم موضوع

الكراكات والسيريالات وكسر الحماية متشعب وطويل جداً ويختلف حسب البرمجة والمستخدم

والبرنامج الذي برمج ..

وايضاً سمعت عن بعض الأشخاص قاموا ببرمجة

الباتشات والكيجن بالدلفي ... وهذا طبيعي فاللغة ديناميكية عالية جداً ...

---------------------------------------------

اما

الكيفية

التي تولد فيها الكيجن ، فالكيجن الذي يعتبر من أصعب طرق كسر

الحمايات وأكثرها استهلاكاً

للوقت

حيث يتطلب فهماً دقيقاً لخوارزمية إنشاء

السريال بلغة الأسمبلي

ومن ثم عمل خوارزمية مشابهة لها بأي لغة يجيدها المهندس

العكسي

فمهارتك بالخوازميات تعتمد على طرق التوليد .... smile.gif

MagicCreativity.png

 

♥♥♥

♥♥♥

♥♥♥

♥♥♥


Palestine.gif

#4

هذه أمثلة لكراكات و des keyngens لبرامج مشهورة :

كراك OxO IDM 6.06 Buiild 8 (juin/2/2011) OxO

64586f5880.png

كيجن OxO USB Virus Scan v 2.3 OxO

ddf8de2f92.png

كيجن OxO Internet Lock v 5.1 OxO

678587904e.png

OricalcosZy كتب:

فيما يخص الكيجن أو برامج توليد السريالات ففبها نوعان :

بعضها يتم ادخال سلسلة السريالات التي سوف تولدها في الكود الخاص بها ...

والبعض الآخر منها تولد السريالات اعتمادا على خوارزميات تأخد بعين الاعتبار معايير محددة في الجهاز والبرنامج المستهدف

أهلا أخي OricalcosZy (يسرني معرفة اسمك :))

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

اقتباس
يتطلب فهماً دقيقاً لخوارزمية إنشاء السريال بلغة الأسمبلي ومن ثم عمل خوارزمية مشابهة لها بأي لغة يجيدها المهندس العكسي

هلا أبو ماهر :)

هل تعني أنه لا بد من كتابة الكود بالأسمبلي ؟, ألا يكفينا فهم الخوارزمية و كتابتها بلغة برمجة عالية المستوى ؟

اقتباس
مهارتك بالخوازميات تعتمد على طرق التوليد ....

+1, هذا بيت القصيد :)

كيف يمكن للمبرمج أن يضمن عدم تكرار السيريال المُولد في كل مرة ؟

هل يستخدم الأرقام العشواءية .. و لكن كيف يتحقق من أن العدد عشوائي يحقق الخوارزمية ؟

#5

انا عندي فكرة وأود أن أطبقها

مثلا

السيريال يتكون من 5 مجموعات من الأرقام

كل مجموعة بها ولنقل 3 حروف

يعني مثلا

AAA-BBB-CCC-DDD-EEE

هذا سريال

طيب طريقة العمل كيف تكون

انت تعرف ان كل حرف له كود ASCII صح؟

طيب أنا بالبداية رح أقوم بجلب رقم عشوائي

هذا الرقم هو مجموعة أرقام الـ ASCII لكل الحروف في كل مجموعة

يعني إذا كان عندي الرقم يساوي 195 فيجب ان يكون مجموع ارقام الـ ASCII للحروف بالمجموعة = 195 وفي هذه الحالة يمكن ان يكون الكود AAA أو AR0

وإذا كان يساوي 207 فهنا عندنا عدة حلول, أحدها W2F

ونقوم بنفس العملية لكل المجموعات, ولتكن لكل المجموعات نفس العدد

وبما أن العدد عشوائي, فإن الحروف ستتغير, حتى وإن لم يكن عشوائي, فإن الحروف ستتغير, وإحتمال تكرر كود, ضئيييل جدا جدا جدا, للأسف ماأقدر أقولك النسبة لأني مش دارس احتمالات ههههه

المهم

أتمنى وصلتك الفكرة

ورح أجرب أكتبها بلغة الـ PHP لعلي أقدر أوصل للنتيجة النهائية

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

#6
اقتباس
هلا أبو ماهر smile.gif

هل تعني أنه لا بد من كتابة الكود بالأسمبلي ؟, ألا يكفينا فهم الخوارزمية و كتابتها بلغة برمجة عالية المستوى ؟

معرفة البرنامج وطريقة كسره بالأسمبلي وأيضاً فك تشفير الكود وفهمه ، ثم تقوم بكتابة نفس الكود وطريقة التفعيل بالأسمبلي أو لغة اخرى (طبعاً تختلف من لغة الى اخرى فلا تتشابه الأسمبلي والــVB.net) .. ولكن لا يشترط كتابة الباتش او الكيجن بالأسمبلي مع انها الأكثر استخداماً ... فالدلفي 7 جيد أيضاً في هذا ، وهذا ما رأيته في بعض المواقع ومنها الأجنبية ...

اقتباس
+1, هذا بيت القصيد smile.gif

كيف يمكن للمبرمج أن يضمن عدم تكرار السيريال المُولد في كل مرة ؟

هل يستخدم الأرقام العشواءية .. و لكن كيف يتحقق من أن العدد عشوائي يحقق الخوارزمية ؟

هذه ليست لي ... فانا لم أجرب كسر برنامج مطلقاً ، إنما أنا معرفة به ، ولكن لي بعض التجارب في هذا ...

MagicCreativity.png

 

♥♥♥

♥♥♥

♥♥♥

♥♥♥


Palestine.gif

#7

بالنسبة للطريقة التي ذكرها عبد المنعم بن حورية:

قمت بتوليد السيريال، اوك.. كيف ستقوم بالتحقق منه باستخدام هذه الخوارزمية في البرنامج بعد ذلك طالما أن الرقم عشوائي؟

1

Do as I say, not as I do

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

#8
Xacker كتب:

بالنسبة للطريقة التي ذكرها عبد المنعم بن حورية:

قمت بتوليد السيريال، اوك.. كيف ستقوم بالتحقق منه باستخدام هذه الخوارزمية في البرنامج بعد ذلك طالما أن الرقم عشوائي؟

وجهة نظر برضوا ... !؟ dry.gif

MagicCreativity.png

 

♥♥♥

♥♥♥

♥♥♥

♥♥♥


Palestine.gif

#9
أبو ماهر كتب:

وجهة نظر برضوا ... !؟ dry.gif

لماذا الوجه الممتعض؟ لا أعتقد أن سؤالي يحمل أي إساءة.

سبحان الله.

Do as I say, not as I do

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

#10
اقتباس
انا عندي فكرة وأود أن أطبقها

أطرح نفس سؤال الأخ Xacker :

اقتباس
قمت بتوليد السيريال، اوك.. كيف ستقوم بالتحقق منه باستخدام هذه الخوارزمية في البرنامج بعد ذلك طالما أن الرقم عشوائي؟

هنا تكمن المصيبة ...!

اقتباس
لماذا الوجه الممتعض؟

نأخذ الأمور بحسن النية ما لم يثبت العكس .. لعل الأخ لم يقصد ما تعنيه :)

اقتباس
لا أعتقد أن سؤالي يحمل أي إساءة.

أبدا .. أبدا .. على العكس .. سؤالك يزيد من لذة النقاش البرمجي :D

#11
Xacker كتب:

لماذا الوجه الممتعض؟ لا أعتقد أن سؤالي يحمل أي إساءة.

سبحان الله.

Xacker ما قصدت انزعاجي من نقطتك ... انما هذه الصورة رأيتها تدل على التفكير ، ولا اعلم لماذا .. !!!!!!

عندما يحاول المرء التفكير في شيء لا يفهمه بكل نواحيه ....

.... والله اعلم .....

وهذه على شانك يا جميل ... wub.gif

MagicCreativity.png

 

♥♥♥

♥♥♥

♥♥♥

♥♥♥


Palestine.gif

#12

شكراً

أبو ماهر كتب:

Xacker ما قصدت انزعاجي من نقطتك ... انما هذه الصورة رأيتها تدل على التفكير ، ولا اعلم لماذا .. !!!!!!

أضفت هذه لك إلى حزمة صور المنتدى :D

:thinking:

1

Do as I say, not as I do

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

#13
Xacker كتب:

شكراً

أضفت هذه لك إلى حزمة صور المنتدى :D

:thinking:

هذا بالضبط ما قصدته ، وشكراً على الإضافة . .. ... .... ..... ......

MagicCreativity.png

 

♥♥♥

♥♥♥

♥♥♥

♥♥♥


Palestine.gif

#14

السلام عليكم

التحقق إخواني من السيريال سهل جدا

أولا عند إدخال السريال يقوم بفصل المجموعات على بعض

يقوم بحساب مجموع أرقام الـ ASCII لكل مجموعة

إذا كانت كل المجموعات متساوية إذن السيريال صحيح, وإذا كانت غير متسواية فإن العميل عدل على السريال

هذه هي الفكرة وأعتذر إذا لم أكتب الطريقة في الاعلى

سلام عليكم

#15
عبد المنعم بن حورية كتب:

السلام عليكم

التحقق إخواني من السيريال سهل جدا

أولا عند إدخال السريال يقوم بفصل المجموعات على بعض

يقوم بحساب مجموع أرقام الـ ASCII لكل مجموعة

إذا كانت كل المجموعات متساوية إذن السيريال صحيح, وإذا كانت غير متسواية فإن العميل عدل على السريال

هذه هي الفكرة وأعتذر إذا لم أكتب الطريقة في الاعلى

سلام عليكم

لم أقصد هذا.

وفقاً لخوارزميتك، سيكون واجباً عليك أن تقوم بتخزين مجموع sum قيم ASCII لكل مجموعة ضمن البرنامج (hardcoded)، وعلى اعتبار أن المنطق يقول بأنه يتم عادة إنشاء ملف تنفيذي واحد من مشروع، يحزّم وينشر في مواقع الانترنت، فهذا يعني أن جميع النسخ التي ينشرها المبرمج ستحوي على ذات القيم التي تم تخزينها سابقاً، وحالماً يتم إيجاد هذه القيم، يصبح من السهل جداً توليد سيريال. الأمر في الواقع لا يشابه إطلاقاً ما يحدث الآن، فالخوارزميات تجدها تعتمد على Username وعلى Email وبيانات أخرى أحياناً مثل معلومات خاصة بالـ hardware للجهاز الذي تثبت عليه.

ماذا تقترح لحل هذه المشكلة؟ (المسألة ليست معقّدة، أنا فقط أناقش لتحفيز التفكير لدى بعض زوار هذا الموضوع)

Do as I say, not as I do

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

#16

صحيح أخي

أعرف أن الطريقة ليست محمية 100% ولا حتى 50%

طريقة إستخدام الإيميل واليوزنيم هي تعد استخلاص كود عن طريقهما

وفي هذه الحالة انا افضل الـ md5

تشفير قوي غير ممكن فكه

مثلا

الإيميل هكذا

myname@email.com

واليوزنيم هكذا

monaam

طريقة العمل تكون كالتالي

يتم فك الإيميل إلى جزئين عن طريق @

ويتم ادخال md5 تبع الإسم في الوسط

يعني هكذا

myname[md5(monaam)]email.com

ويتم تشفيرها جميعا عن طريق الـ md5

وكما نعلم ان الـ md5 ينشيء قيمة نصية بـ 32 حرف

نقوم بعمل مانريده بهذه القيم

طيب هل هذه الطريقة تمكننا من فك التشفير وإيجاد كيجين له؟

#17
اقتباس
قمت بتوليد السيريال، اوك.. كيف ستقوم بالتحقق منه باستخدام هذه الخوارزمية في البرنامج بعد ذلك طالما أن الرقم عشوائي؟

التحقق من السيريال أصعب عندي من توليده !! :huh:

بافتراض أننا سنكتب كود تجريبي بسيط (بالسي مثلا), سنحتاج فقط إلى المقارنة بين المجموعات .. (بغض النظر عن التعقيدات الأخرى ...)

لنفرض أن السيريال يحتوي على أربع مجموعات, كل مجموعة تحتوي على أربع حروف-أرقام, من يضمن لي أن العدد المأخوذ يمكن من خلاله توليد أربع مجموعات مختلفة ؟ :blink:

كيف سنعرف الإحتمالات الممكنة للعدد الذي تم توليده ؟

أعرف أن أسئلتي بدائية جدا .. ولكني مبتدأ و أريد الإستفادة من خبراتكم في هذاا المجال :wink:

#18

طيب أخي سيبنا من الطريقة المعقدة تبع الـ ASCII

ورح نعمل على طريقة الـتشفير

لأنها هي الطريقة الأكثر حماية والأصعب فكا وتكسيرا

تابع معي الطريقة

# إسم المستخدم
Username ........: Monaam 
# البريد الإلكتروني
Email ...........: a.benhouria@gmail.com 
# جلب تشفير اسم المستخدم
MD5 Username ....: 865455a788796b26075e3619f81857ae 
# قسم الإيميل إلى جزئين
Email Parts .....: a.benhouria - gmail.com 
# تجهيز الكود, وهو ادخال تشفير إسم المستخدم مابين جزئي الإيميل
# هذه نستخدمها للتمويه فقط
Serial Text .....: a.benhouria865455a788796b26075e3619f81857aegmail.com 
# تشفير النص كاملا
Serial MD5 ......: b4e374fc0ff54270fd254f49e7713602 
# نقوم بقص التشفير إلى 4 مجموعات كل مجموعة بها 8 خانات
Serial Splited ..: b4e374fc - 0ff54270 - fd254f49 - e7713602
# نقوم بحساب رموز الأسيي لكل مجموعة
Serial ASCII ....: 610 - 510 - 568 - 463
# وينتج لنا سيريال صعب الفك

طريقة التحقق سهلة جدا

نقوم بجلب الإسم ونجلب الإيميل ونعمل سيريال من أول وجديد ثم نتحقق إذا كان السيريال هو نفسه أم لا

فقط

والسلام عليكم

#19

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

مثلا سنفترض ان البرنامج الذى تريد إنشاء keygen له يقوم على الخوارزميه التاليه للتحقق من ان السريال المدخل سليم: (السريال عباره عن رقم صحيح)

1- الرقم المدخل لابد ألا يقل عن 1000.

2- قم بتنفيذ xor على الرقم المدخل مع الرقم 19.

3- قم بتنفيذ or على الرقم المدخل مع الرقم 7.

4- قم بتنفيذ xor بين الرقمين من الخطوه 2 و 3.

5- إذا كان الناتج أكبر من صفر و أقل من او يساوى 19 فالرقم صحيح و غير ذلك خاطئ.

الكود للخوازميه السابقه :

#include <iostream>
using std::cin;
using std::cout;

int main()
{
	const int XOR_MAGIC = 19;
	const int  OR_MAGIC = 7;

	int num1 = 0;

AGAIN:
	cout << "Enter Serial: ";
	cin >> num1;

	if (num1 < 1000)
	{
		cout << "invalid serial, try again.\n";
		goto AGAIN;
	}

	int num2 = num1 | OR_MAGIC;
	num1 ^= XOR_MAGIC;

	if (num2 > num1) std::swap<int>(num1, num2);

	num1 ^= num2;

	if (!(num1 > 0 && num1 <= 19))
	{
		cout << "invalid serial, try again.\n";
		goto AGAIN;
	}

	cout << "serial is OK.\n";
}

الخوارزميه يمكن عكسها بسهوله و السبب أن العمل على الرقم المدخل يكون على مستوي البت، فى البدايه يتم إجراء xor للرقم المدخل بعدها يتم إجراء or على نفس الرقم بعدها يتم تنفيذ xor بين الرقمين لذا على افتراض ان الرقم المدخل هو صفر حينها ستكون الأرقام التى لدينا هي 19 و 7 و بالتالي يمكن تلخيص الخوازميه السابقه فى الخطوه قبل الأخير - رقم 4 - لذا بتطبيق xor بين الرقم 19 و 7 ينتج لنا 20، بهذا نحن نعلم انه إذا اخذنا اي رقم اكبر من 1000 و قمنا بتنفيذ or عليه مع الرقم 20 فأيا كان الرقم الناتج سيكون serial سليم يقبله البرنامج.

كود الـ key generator هو التالي:

#include <iostream>
#include <ctime>
using std::cin;
using std::cout;

int main()
{
	const int MAGIC = 20;
	const int MIN_VALUE = 1000;

	char exit = 'n';

	while(exit != 'y')
	{
		srand( (unsigned)time(NULL) );

		int LOOP = 0x235698;
		while( --LOOP );

		cout << "valid key: ";
		cout << ((MIN_VALUE + rand()) | MAGIC);

		cout << "\nexit(y/n): ";
		cin >> exit;
		exit |= 0x20;
	}
}

المثال يتعامل مع رقم صحيح فقط لتقريب الصوره و توضيح كيفية تصنيع الـ keygen، مع البرامج الحقيقيه تكون الخوارزميه اصعب و لكن نظام العمل واحد. أذكر يوما ما اني قضيت ما يقرب من الساعتين لتحليل الخوارزميه المستخدمه داخل لعبة NFS Carbon الخاصه بالتحقق من الـ checksum لملف الـ save.

وجدت رابط يحتوى على بعض الأمثله فى هذا الشأن و عنوانه Key Generators & Serial Number Schemes

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 28 يونيو 2011 في 22:57

مدونتي: C++ Tips and Tricks

#20
عبد المنعم بن حورية كتب:

طيب أخي سيبنا من الطريقة المعقدة تبع الـ ASCII

ورح نعمل على طريقة الـتشفير

لأنها هي الطريقة الأكثر حماية والأصعب فكا وتكسيرا

تابع معي الطريقة

...

...

طريقة التحقق سهلة جدا

نقوم بجلب الإسم ونجلب الإيميل ونعمل سيريال من أول وجديد ثم نتحقق إذا كان السيريال هو نفسه أم لا

فقط

والسلام عليكم

تابع كلام محمد علاء في المشاركة التالية، عملية كتابة Keygen أو توليد SN في النهاية تتطلب الوصول إلى خوارزمية التحقق من المفتاح وإعادة كتابتها بشكل عكسي، هناك عدة مقالات كتبتها على أمثلة حقيقة في هذا الموضوع فهل ترغب برابط لها لتطلع على الفكرة؟

من ناحية أخرى، الخوارزمية التي وضعتها، ستمكن الـ cracker من تتبع الاسم والايميل، وملاحظة كيف يتم التقسيم وجمع بيانات مع بعضها البعض ومن ثم تنفيذ خوارزمية رياضية معينة، وباستخدام plugin لـ PEiD مثلاً (kanal) ستتمكن من كشف أن البرنامج يحوي على خوارزمية MD5، وستتمكن من تأكيد أن تلك الخوارزمية الرياضية التي وجدتها هي فعلاً MD5، لأن الخوارزمية منشورة على الانترنت أساساً.

أي أن البرنامج لم يصمد.

* ملاحظة: هناك برنامج لفريق TMG (The Millennium Group) يقوم بأخذ نسخة من كود الأسمبلي الذي تجده لإجرائية توليد SN ومطابقته، ويقوم بإنشاء ملف تنفيذي يعمل على استثمار هذه الخوارزمية في توليد SN، أي أن البرنامج ذاته هو Keygen maker :D

في الواقع عملية منع إيجاد SN أو كتابة Keygen تأتي من خلال obfuscation للكود، بشكل تجعل فيه مسألة فهم الخوارزمية عكسياً أمراً صعباً (لن يغدو مستحيلاً طالما أن الوقت متوفر).

1

Do as I say, not as I do

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

#21

طيب أنا فكرتي لم تكن تقتصر على إسم المستخدم وكلمة المرور

فانا اظفت لها خاصية

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

لكن تكمن المشكلة في كيفية معرفة هذا الكود للمبرمج, لأنه لو طلبه من العميل العميل رح يعرف انه في كود لازم يدخل في الخوارزمية وبذلك رح ينتبه الكراكر, ورح يصير بدون فائدة

طيب ساعودنا شوي هههه blush.gif مخي توقف وصرت ماأفكر إلا بهذا الموضوع خخخخ

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