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

كيفية اضافة عدد من البتات الى string

مغلق
بدأه allko في 5 أبريل 2007 · 4 رد · 813 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لنفرض ان لدينا string كالتالي مثلا:

"allko"

ستبدوا هكذا في اي محرر هكس : (الصورة التالية مأخوذة من Olly )

q1qc5.gif

كما ترون فـ allko هي بالهكس

61 6C 6C 6B 6F

اما بالبايناري فهي كالتالي

1100001  1101100  1101100  1101011  1101111

اريد جعلها كالتالي

1100001  1101100  1101100  1101011  1101111  00

اي اضافة صفرين الى نهايتها ثم .ليس شرطا صفرين ، ...المهم عدد ليس من مضاعفات 8 ،

(سيتضح لماذا بعد قليل)

طبعا السؤال الذي يطرح نفسه ما الحاجة الى اضافة صفر او اثنين ؟

اقوم بمحاولة عمل خوارزمية تشبه الـ MD-5 ، حيث سأتعامل مع البيانات

المدخلة ك blocks بحجم 256 بت .

أي أنه سيتم تقسيم البيانات المدخلة الى مجموعات كل منها بحجم 256بت .

اذن على فرض ان لدي string طولها 1150 بت مثلا ، سيكون لدينا

1150/256=4 بلوكات ويتبقى 126 بت

هذه الـ 126 بت سأقوم باضافة اصفار اليها (في الحقيقة ليست كل ما ساضيفه اصفار

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

1 ، حتى يمثل نهاية الستنرج كي يسهل النتعامل معها )

والان عدد الاصفار التي سنضيفها هو 256-126 يساوي 130بت

اذن عندما اضيف الـ 130بت الى الـ 126 بت يكون الناتج256 اي بلوك كامل.

اذن باختصار اريد اضافة 129 بت من فئة "0" ، و 1بت من فئة "1"

بالطبع لسنا بحاجة عمليا لان نضيف اصفار

يمكننا ان نضيف الـ "1" على بعد 129بت من نهاية السترنج المدخلة

وبذلك المسافة بينهما هي عبارة عن 129بت من فئة "0"

المشكلة انك لا تستطيع التعامل الا مع بايت.

فمثلا

invoke lstrcat,addr string+[129],addr anything

هذه العبارة لن تضيف ال anything على بعد 129 بت من string

بل ستضيفها على بعد 129*8 اي 1032 بت

قد يقترح احدكم ان نقسم 129/8 = 16.125

وهنا المشكلة فلدينا كسور وهي تمثل 0.125*8=1 بت

الحل قد يكون في api تشبه lstrcat لكن باستطاعتها التعامل مع بت وليس بايت

كي استطيع تحديد البعد بدقة.

هل لدى اي احد فكرة او حل ممكن ؟

تم تعديل هذه المشاركة بواسطة allko في 5 أبريل 2007 في 14:01

#2

السلام عليكم

اخي allko اعتقد ان لديك بعض الخلط بين الرقم 0 والعلامة 0 والتى تدعي null فى واقع الامر, هذه العلامة نرمز لها بالعدد 00h بالهكس, اما العدد 0 فنرمز له بالعدد 30h..

برامج الاسمبلر تتعرف على نهاية النص عندما تجد العلامة null فى نهاية النص وتتعامل معى النصوص على اساس ان كل حرف يتكون من بايت, انت تحاول التعامل معي كل حرف على اساس انه 7 بتات فقط كما هو واضح من الامثلة وبذلك لن تستطيع تمثيل جميع حروف قائمة الاسكي والتى تحتوي على 256 علامة او حرف..

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

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

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#3

ليس لدي خلط لكن هو خطأ في ايصال المعلومة

فعلا المفروض انني كتبت allko هكذا

1100001  01101100  01101100  01101011  01101111

اسف على الخطا

اي ان جميع الاحرف تمثل ب8 بت

لكن كما ترى اول مجموعة(اي الى اليسار) 7 بتات وليس 8

لانها بالاصل 01100001 لكن لا قيمة للـ 0 فهو الى يسار البيانات (صفر على الشمال)

اما الباقي فجميعها 8 بتات بشكل معتاد.

لا استطيع اعطائك مثال لكن استطيع اعطائك تفاصيل اكثر عن مرحلة الـ

padding

وهي المرحلة الاولى في الخوارزمية

نريد ان نجعل آخر بلوك من بلوكات المسج كالتالي

=====remaining of msg ======single '1'=====ROL=======

|-----------------------------------------------|-|----------------------------------|

where ROL=Representing Of Length ==>[32bit]

لنفرض انك ادخلت مسج ب3000بت

والان هذه الـ 3000 بت ...نريد ان نعرف هل يمكنها تشكيل اعداد صحيحة من البلوكات ام

لا...3000/256 =11 والباقي 184بت (ديسيمال)

ولكن حيث ان الخوارزمية تتعامل مع بلوكات بحجم 256 اذن يجب عمل padding

لهذه البتات الـ 184 بحيث نكملها الى 256 فتصبح بلوك كامل.

وبحسبة بسيطة يتبين ان الـ 184 ينقصها 72 بت كي تصبح بلوك كامل

ومع الاخذ بعين الاعتبار ان اخر 32بت من هذه الـ72 يجب ان يتم حجزها للـ

ROL

ومع الاخذ بعين الاعتبار ان اول بت يلي نهاية السترنج مباشرة هو بت1

اذن الـ 72 سوف نقسمها كالتالي : 1+32+39

اول بت هو الـ "1" ، يليه 39بت من فئة "0" ثم 32 بت خاصة بالـ

ROL

اي انك لو ادخلت مسج طولها 3000 بت اي

BB8 بالهكس

فيفترض ان اخر ما يكتب بالمسج هو(ROL)

0000000000000000000000001011 1011 1000

لاحظ ان هذه البتات طولها 32 .

المشكلة ببساطة هي كيفية كتابة تلك البتات بعد تلك الاصفار...هنا نحن نتعامل مع بت وليس بايت

التعامل مع بايت يعني ان دقة العمل هي لغاية 8 بت ولا يمكنك التعامل مع اقل من 8...

هذه هي المشكلة

#4

السلام عليكم

طيب اخى كيف ستعرف حجم الmessage الاصلية هل ستحتفظ بالرقم 3000 فى مكان معين..

كتابة البتات فى المكان المحدد بسيطة كل ما عليك القيام به هو ان تستخدم or معى العدد الذي تريد كتابته فى 32 بت بمعني

or eax,0BB8h
mov [ROL],eax

طبعاً ROL هى عنوان تقوم بحسابه بعد معرفة حجم الmessage والقيام بعملية القسمة لمعرفة مكان الpadding

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

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#5

مشكلة التنسيق هذه تتعبني

في ردي بالاعلى الـ ROL تكتب هكذا

0000000000000000000000001011 1011 1000

فكرة كتابة الـ ROL

كما تفضلت جيدة لكنها لن تحل المشكلة

اخي ما اريدك ان تفهمه هو ان الـ ROL

سيكون على بعد معين من نهاية السترنج

وهذا البعد ليس شرطا ان يكون من مضاعفات الـ 8

اي ليس شرطا انه يحوي اعداد صحيحة من البايتات

افرض انه بين نهاية السترنج وبداية ROL

هناك 50 بت

كيف سنفعل ذلك ؟

كيف سنجعل الـ ROL

على بعد 50 بت بالضبط؟

هذا الموضوع مغلق.

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