ahmed.o.mohamed

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

21 ردود في هذا الموضوع

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

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

بالتوفيق.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

تم تعديل بواسطه OricalcosZy
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

بهذا

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

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

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

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

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

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

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

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

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

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

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

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

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

اما

الكيفية

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

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

للوقت

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

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

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

العكسي

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هذه أمثلة لكراكات و 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 (يسرني معرفة اسمك :))

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

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

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

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

مثلا

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

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

يعني مثلا

AAA-BBB-CCC-DDD-EEE

هذا سريال

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

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

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

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

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

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

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

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

المهم

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هلا أبو ماهر smile.gif

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

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

سبحان الله.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

لماذا الوجه الممتعض؟

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

سبحان الله.

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكراً

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

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

:thinking:

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكراً

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

:thinking:

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

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

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

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

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

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

سلام عليكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

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

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

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

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

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

سلام عليكم

لم أقصد هذا.

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

صحيح أخي

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

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

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

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

مثلا

الإيميل هكذا

[email protected]

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

monaam

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

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

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

يعني هكذا

myname[md5(monaam)]email.com

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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


# إسم المستخدم
Username ........: Monaam
# البريد الإلكتروني
Email ...........: [email protected]
# جلب تشفير اسم المستخدم
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
# وينتج لنا سيريال صعب الفك

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

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

فقط

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

مثلا سنفترض ان البرنامج الذى تريد إنشاء 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

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

تم تعديل بواسطه محمد علاء الدين
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

...

...

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

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

فقط

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

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

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

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

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

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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

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

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

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .