السلام عليكم و رحمة الله و بركاته
أحببت أن أفتح نقاشا حول كيفية برمجة الكيجين, خصوصا كيف يتم توليد سيريال مختلف في كل مرة ...
بالتوفيق.
السلام عليكم و رحمة الله و بركاته
أحببت أن أفتح نقاشا حول كيفية برمجة الكيجين, خصوصا كيف يتم توليد سيريال مختلف في كل مرة ...
بالتوفيق.
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
فيما يخص الكيجن أو برامج توليد السريالات ففبها نوعان :
بعضها يتم ادخال سلسلة السريالات التي سوف تولدها في الكود الخاص بها ...
والبعض الآخر منها تولد السريالات اعتمادا على خوارزميات تأخد بعين الاعتبار معايير محددة في الجهاز والبرنامج المستهدف
تم تعديل هذه المشاركة بواسطة OricalcosZy في 27 يونيو 2011 في 22:48
Zefri Yahya - ArabTeam 2000

الأكثر شيوعاً في البرمجة هي لغة
الأسيمبلي ... حيث تتميز بصغرها وفعاليتها في هذا المجال ، الا انه يلزمك للقيام
بهذا
فك ضغط البرامج وكسر حمايتها مثل برامج Quick Unpack ,
VMunpacker , RL!depacker ، وتحليلها بإستخدام برنامج Ollydbg >>
بالإضافة الى وجود الفك اليدوي ..
وطرق فك البرامج وكسر حمايتها تختلف من برنامج الى برنامج حسب اللغة التي تمت بها برمجة البرنامج فمثلاً البرامج المبرمجة بال.Net تكسر بالــ Dotnet Reflector
والدلفي DeDe ...... -
اسمها بضحكني دايماً -
وهكذا تختلف حسب اختلاف البرنامج ... وهنالك أدوات
كثيرة لنفس لغة البرمجة ولكن هذه ما اعرفها ...
على العموم موضوع
الكراكات والسيريالات وكسر الحماية متشعب وطويل جداً ويختلف حسب البرمجة والمستخدم
والبرنامج الذي برمج ..
وايضاً سمعت عن بعض الأشخاص قاموا ببرمجة
الباتشات والكيجن بالدلفي ... وهذا طبيعي فاللغة ديناميكية عالية جداً ...
---------------------------------------------
اما
الكيفية
التي تولد فيها الكيجن ، فالكيجن الذي يعتبر من أصعب طرق كسر
الحمايات وأكثرها استهلاكاً
للوقت
حيث يتطلب فهماً دقيقاً لخوارزمية إنشاء
السريال بلغة الأسمبلي
ومن ثم عمل خوارزمية مشابهة لها بأي لغة يجيدها المهندس
العكسي
فمهارتك بالخوازميات تعتمد على طرق التوليد .... ![]()
هذه أمثلة لكراكات و des keyngens لبرامج مشهورة :
كراك OxO IDM 6.06 Buiild 8 (juin/2/2011) OxO

كيجن OxO USB Virus Scan v 2.3 OxO

كيجن OxO Internet Lock v 5.1 OxO

OricalcosZy كتب:فيما يخص الكيجن أو برامج توليد السريالات ففبها نوعان :
بعضها يتم ادخال سلسلة السريالات التي سوف تولدها في الكود الخاص بها ...
والبعض الآخر منها تولد السريالات اعتمادا على خوارزميات تأخد بعين الاعتبار معايير محددة في الجهاز والبرنامج المستهدف
أهلا أخي OricalcosZy (يسرني معرفة اسمك :))
كلام جميل .. بس أنا عايز نتكلم بشيئ من التفاصيل ... الخوارزميات المستخدمة و مإ إلى ذلك ...
اقتباسيتطلب فهماً دقيقاً لخوارزمية إنشاء السريال بلغة الأسمبلي ومن ثم عمل خوارزمية مشابهة لها بأي لغة يجيدها المهندس العكسي
هلا أبو ماهر :)
هل تعني أنه لا بد من كتابة الكود بالأسمبلي ؟, ألا يكفينا فهم الخوارزمية و كتابتها بلغة برمجة عالية المستوى ؟
اقتباسمهارتك بالخوازميات تعتمد على طرق التوليد ....
+1, هذا بيت القصيد :)
كيف يمكن للمبرمج أن يضمن عدم تكرار السيريال المُولد في كل مرة ؟
هل يستخدم الأرقام العشواءية .. و لكن كيف يتحقق من أن العدد عشوائي يحقق الخوارزمية ؟
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
انا عندي فكرة وأود أن أطبقها
مثلا
السيريال يتكون من 5 مجموعات من الأرقام
كل مجموعة بها ولنقل 3 حروف
يعني مثلا
AAA-BBB-CCC-DDD-EEE
هذا سريال
طيب طريقة العمل كيف تكون
انت تعرف ان كل حرف له كود ASCII صح؟
طيب أنا بالبداية رح أقوم بجلب رقم عشوائي
هذا الرقم هو مجموعة أرقام الـ ASCII لكل الحروف في كل مجموعة
يعني إذا كان عندي الرقم يساوي 195 فيجب ان يكون مجموع ارقام الـ ASCII للحروف بالمجموعة = 195 وفي هذه الحالة يمكن ان يكون الكود AAA أو AR0
وإذا كان يساوي 207 فهنا عندنا عدة حلول, أحدها W2F
ونقوم بنفس العملية لكل المجموعات, ولتكن لكل المجموعات نفس العدد
وبما أن العدد عشوائي, فإن الحروف ستتغير, حتى وإن لم يكن عشوائي, فإن الحروف ستتغير, وإحتمال تكرر كود, ضئيييل جدا جدا جدا, للأسف ماأقدر أقولك النسبة لأني مش دارس احتمالات ههههه
المهم
أتمنى وصلتك الفكرة
ورح أجرب أكتبها بلغة الـ PHP لعلي أقدر أوصل للنتيجة النهائية
والسلام عليكم ورحمة الله
اقتباسهلا أبو ماهرهل تعني أنه لا بد من كتابة الكود بالأسمبلي ؟, ألا يكفينا فهم الخوارزمية و كتابتها بلغة برمجة عالية المستوى ؟
معرفة البرنامج وطريقة كسره بالأسمبلي وأيضاً فك تشفير الكود وفهمه ، ثم تقوم بكتابة نفس الكود وطريقة التفعيل بالأسمبلي أو لغة اخرى (طبعاً تختلف من لغة الى اخرى فلا تتشابه الأسمبلي والــVB.net) .. ولكن لا يشترط كتابة الباتش او الكيجن بالأسمبلي مع انها الأكثر استخداماً ... فالدلفي 7 جيد أيضاً في هذا ، وهذا ما رأيته في بعض المواقع ومنها الأجنبية ...
اقتباس+1, هذا بيت القصيدكيف يمكن للمبرمج أن يضمن عدم تكرار السيريال المُولد في كل مرة ؟
هل يستخدم الأرقام العشواءية .. و لكن كيف يتحقق من أن العدد عشوائي يحقق الخوارزمية ؟
هذه ليست لي ... فانا لم أجرب كسر برنامج مطلقاً ، إنما أنا معرفة به ، ولكن لي بعض التجارب في هذا ...
بالنسبة للطريقة التي ذكرها عبد المنعم بن حورية:
قمت بتوليد السيريال، اوك.. كيف ستقوم بالتحقق منه باستخدام هذه الخوارزمية في البرنامج بعد ذلك طالما أن الرقم عشوائي؟
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
Xacker كتب:بالنسبة للطريقة التي ذكرها عبد المنعم بن حورية:
قمت بتوليد السيريال، اوك.. كيف ستقوم بالتحقق منه باستخدام هذه الخوارزمية في البرنامج بعد ذلك طالما أن الرقم عشوائي؟
وجهة نظر برضوا ... !؟ ![]()
أبو ماهر كتب:وجهة نظر برضوا ... !؟
لماذا الوجه الممتعض؟ لا أعتقد أن سؤالي يحمل أي إساءة.
سبحان الله.
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
اقتباسانا عندي فكرة وأود أن أطبقها
أطرح نفس سؤال الأخ Xacker :
اقتباسقمت بتوليد السيريال، اوك.. كيف ستقوم بالتحقق منه باستخدام هذه الخوارزمية في البرنامج بعد ذلك طالما أن الرقم عشوائي؟
هنا تكمن المصيبة ...!
اقتباسلماذا الوجه الممتعض؟
نأخذ الأمور بحسن النية ما لم يثبت العكس .. لعل الأخ لم يقصد ما تعنيه :)
اقتباسلا أعتقد أن سؤالي يحمل أي إساءة.
أبدا .. أبدا .. على العكس .. سؤالك يزيد من لذة النقاش البرمجي :D
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
Xacker كتب:لماذا الوجه الممتعض؟ لا أعتقد أن سؤالي يحمل أي إساءة.
سبحان الله.
Xacker ما قصدت انزعاجي من نقطتك ... انما هذه الصورة رأيتها تدل على التفكير ، ولا اعلم لماذا .. !!!!!!
عندما يحاول المرء التفكير في شيء لا يفهمه بكل نواحيه ....
.... والله اعلم .....
وهذه على شانك يا جميل ... ![]()
شكراً
أبو ماهر كتب:Xacker ما قصدت انزعاجي من نقطتك ... انما هذه الصورة رأيتها تدل على التفكير ، ولا اعلم لماذا .. !!!!!!
أضفت هذه لك إلى حزمة صور المنتدى :D
:thinking:
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
Xacker كتب:شكراً
أضفت هذه لك إلى حزمة صور المنتدى :D
:thinking:
هذا بالضبط ما قصدته ، وشكراً على الإضافة . .. ... .... ..... ......
السلام عليكم
التحقق إخواني من السيريال سهل جدا
أولا عند إدخال السريال يقوم بفصل المجموعات على بعض
يقوم بحساب مجموع أرقام الـ ASCII لكل مجموعة
إذا كانت كل المجموعات متساوية إذن السيريال صحيح, وإذا كانت غير متسواية فإن العميل عدل على السريال
هذه هي الفكرة وأعتذر إذا لم أكتب الطريقة في الاعلى
سلام عليكم
عبد المنعم بن حورية كتب:السلام عليكم
التحقق إخواني من السيريال سهل جدا
أولا عند إدخال السريال يقوم بفصل المجموعات على بعض
يقوم بحساب مجموع أرقام الـ 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
صحيح أخي
أعرف أن الطريقة ليست محمية 100% ولا حتى 50%
طريقة إستخدام الإيميل واليوزنيم هي تعد استخلاص كود عن طريقهما
وفي هذه الحالة انا افضل الـ md5
تشفير قوي غير ممكن فكه
مثلا
الإيميل هكذا
myname@email.com
واليوزنيم هكذا
monaam
طريقة العمل تكون كالتالي
يتم فك الإيميل إلى جزئين عن طريق @
ويتم ادخال md5 تبع الإسم في الوسط
يعني هكذا
myname[md5(monaam)]email.com
ويتم تشفيرها جميعا عن طريق الـ md5
وكما نعلم ان الـ md5 ينشيء قيمة نصية بـ 32 حرف
نقوم بعمل مانريده بهذه القيم
طيب هل هذه الطريقة تمكننا من فك التشفير وإيجاد كيجين له؟
اقتباسقمت بتوليد السيريال، اوك.. كيف ستقوم بالتحقق منه باستخدام هذه الخوارزمية في البرنامج بعد ذلك طالما أن الرقم عشوائي؟
التحقق من السيريال أصعب عندي من توليده !! :huh:
بافتراض أننا سنكتب كود تجريبي بسيط (بالسي مثلا), سنحتاج فقط إلى المقارنة بين المجموعات .. (بغض النظر عن التعقيدات الأخرى ...)
لنفرض أن السيريال يحتوي على أربع مجموعات, كل مجموعة تحتوي على أربع حروف-أرقام, من يضمن لي أن العدد المأخوذ يمكن من خلاله توليد أربع مجموعات مختلفة ؟ :blink:
كيف سنعرف الإحتمالات الممكنة للعدد الذي تم توليده ؟
أعرف أن أسئلتي بدائية جدا .. ولكني مبتدأ و أريد الإستفادة من خبراتكم في هذاا المجال :wink:
C++ and Java, say, are presumably growing faster than plain C, but I bet C will still be around. ― Dennis Ritchie
~OoO~________--------------------------------------------________~OoO~
من مواضيعي :
طيب أخي سيبنا من الطريقة المعقدة تبع الـ 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 # وينتج لنا سيريال صعب الفك
طريقة التحقق سهلة جدا
نقوم بجلب الإسم ونجلب الإيميل ونعمل سيريال من أول وجديد ثم نتحقق إذا كان السيريال هو نفسه أم لا
فقط
والسلام عليكم
الخوارزميه المستخدمه فى التحقق من السريال المدخل تكون دائما موجوده داخل الملف التنفيذى فإن استطعت الوصول لها يمكنك عكسها لتوليد السريال، و بشكل إفتراضي سيكون السريال المولد صحيح. الصعوبه تكون فى إيجاد الخوارزميه و محاولة عكسها.
مثلا سنفترض ان البرنامج الذى تريد إنشاء 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
عبد المنعم بن حورية كتب:طيب أخي سيبنا من الطريقة المعقدة تبع الـ ASCII
ورح نعمل على طريقة الـتشفير
لأنها هي الطريقة الأكثر حماية والأصعب فكا وتكسيرا
تابع معي الطريقة
...
...
طريقة التحقق سهلة جدا
نقوم بجلب الإسم ونجلب الإيميل ونعمل سيريال من أول وجديد ثم نتحقق إذا كان السيريال هو نفسه أم لا
فقط
والسلام عليكم
تابع كلام محمد علاء في المشاركة التالية، عملية كتابة Keygen أو توليد SN في النهاية تتطلب الوصول إلى خوارزمية التحقق من المفتاح وإعادة كتابتها بشكل عكسي، هناك عدة مقالات كتبتها على أمثلة حقيقة في هذا الموضوع فهل ترغب برابط لها لتطلع على الفكرة؟
من ناحية أخرى، الخوارزمية التي وضعتها، ستمكن الـ cracker من تتبع الاسم والايميل، وملاحظة كيف يتم التقسيم وجمع بيانات مع بعضها البعض ومن ثم تنفيذ خوارزمية رياضية معينة، وباستخدام plugin لـ PEiD مثلاً (kanal) ستتمكن من كشف أن البرنامج يحوي على خوارزمية MD5، وستتمكن من تأكيد أن تلك الخوارزمية الرياضية التي وجدتها هي فعلاً MD5، لأن الخوارزمية منشورة على الانترنت أساساً.
أي أن البرنامج لم يصمد.
* ملاحظة: هناك برنامج لفريق TMG (The Millennium Group) يقوم بأخذ نسخة من كود الأسمبلي الذي تجده لإجرائية توليد SN ومطابقته، ويقوم بإنشاء ملف تنفيذي يعمل على استثمار هذه الخوارزمية في توليد SN، أي أن البرنامج ذاته هو Keygen maker :D
في الواقع عملية منع إيجاد SN أو كتابة Keygen تأتي من خلال obfuscation للكود، بشكل تجعل فيه مسألة فهم الخوارزمية عكسياً أمراً صعباً (لن يغدو مستحيلاً طالما أن الوقت متوفر).
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
طيب أنا فكرتي لم تكن تقتصر على إسم المستخدم وكلمة المرور
فانا اظفت لها خاصية
فعند أول تشغيل للبرنامج يتم كتابة كود صغير او بالاحرى رقم مربوط بشيء معين في الحاسوب, مثلا رقم الهارد دسك او اي شي من هذا القبيل في الملف التطبيقي, ويتم قرائته منه ورح ندخله داخل الخوارزمية
لكن تكمن المشكلة في كيفية معرفة هذا الكود للمبرمج, لأنه لو طلبه من العميل العميل رح يعرف انه في كود لازم يدخل في الخوارزمية وبذلك رح ينتبه الكراكر, ورح يصير بدون فائدة
طيب ساعودنا شوي هههه
مخي توقف وصرت ماأفكر إلا بهذا الموضوع خخخخ