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

مشكلة في كود لقراءة ملف تنفيذي

بدأه Rasool Micro في 4 يناير 2012 · 19 رد · 931 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع
Dim FS As New FileStream("I:\36601021\virus.exe", FileMode.Open)
        Dim BS As New BinaryReader(FS)
        Do
            Dim i As String
            Dim F As String = ""
            For x As Integer = 1 To 16
                i = BS.ReadByte.ToString
                i = Conversion.Hex(i)
                If i.Length = 1 Then
                    Dim y As String = i
                    i = "0" & y
                End If
                F &= i
            Next
            TextBox2.Text &= F & " " & vbNewLine
        Loop Until BS.BaseStream.Position > BS.BaseStream.Length
        MsgBox("done")
        BS.Close()
        FS.Close()

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

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

المهم

المشكلة في الكود انه عندما انفذ الكود يدخل في تكرار غير منتهي infenety loop اي عندما يصل الى شرط التوقف لا يتوقف بل يتابع عمله وبذلك اقع في دوران غير منتهي

فما المشكلة ؟.؟؟؟؟؟؟؟؟؟

ارجو الرد وشكراً

#2

السلام عليكم ..

  1. ربما يجب ان يكون :
    Loop Until BS.BaseStream.Position >= BS.BaseStream.Length

  2. قم بوضع break point عند السطر المذكور .. لتعرف قيمة كل من الــ position و الــ Length ..
  3. الحلقة تنتهي لكن تأخذ وقت (أكثر من خمس دقائق) .. حسب حجم الملف المستخدم و سرعة الجهاز ...
  4. مع ذلك يحصل خطأ لأنك تقوم يقراءة بايت من الملف لكن ضمن حلقة من 1 إلى 16 و بالتالي يحصل يخطأ إذا لم يكن جحم الملف هو عدد صحيح من 16 بايت (اعتقد ذلك) .

تم تعديل هذه المشاركة بواسطة houssam11350_11350 في 5 يناير 2012 في 00:35

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

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

اعتقد ان BS.BaseStream.Position و BS.BaseStream.Length لا يتغيران فهم ثبتي لم يحدث تغير لهما

#4

اخواني لقد جربت طريقتكما كلاهما ولكن لم ينفع

لكن وجدت شيئاً غريباً :

Dim FS As New FileStream("I:\36601021\virus.exe", FileMode.Open)
        Dim BS As New BinaryReader(FS)
        While BS.BaseStream.Position < BS.BaseStream.Length
            TextBox2.Text &= BS.ReadByte()
        End While
        MsgBox("done")
        BS.Close()
        FS.Close()

هذا الكود لا يعمل نفس المشكلة السابقة حيث يدخل في infenety loop :huh:

ولكن هذا الكود:

Dim FS As New FileStream("I:\36601021\virus.exe", FileMode.Open)
        Dim BS As New BinaryReader(FS)
        While BS.BaseStream.Position < BS.BaseStream.Length
            BS.ReadByte()
        End While
        MsgBox("done")
        BS.Close()
        FS.Close()

يعمل ويتوقف عندما يصل الى شرط التوقف :huh:

هذا امر غريب :blink: هل لديكم فكرة عنها؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

اني دايخ بهذا البرنامج :wacko:

#5

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

الحل بإختصار

إنك تقرأ بايت بايت واذا كان الرقم = -1 يعني نهايه الملف

Dim i As Integer = f.ReadByte

if i = -1 then

exit sub

end if

وتقدر تستخدم hex مع الـ integer لان الـ byte اهو اصلا integer يبدأ من 0 إللى 255 لكن ماتقدر تقرأ بايت على أنه بايت اذا كانت النتيجه -1 راح يحصل خطأ

فقط افتح مشروع جديد والصق الاكواد اللي تحت وراح تفهمها إن شاء الله ..

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim t As New TextBox

Me.Controls.Add(t)

t.Multiline = True

t.Dock = DockStyle.Fill

t.Text = FileToHex("c:\pkt2.jpg")

End Sub

Function FileToHex(ByVal file As String, Optional ByVal maxlength As Integer = -1) As String

If FileLen(file) = 0 Then Return ""

Dim f As New IO.FileStream(file, IO.FileMode.Open)

Dim S As String

While True

Dim i As Integer = f.ReadByte

If i = -1 Or f.Position = maxlength Then

f.Close()

Exit While

End If

Dim hx As String = Hex(i)

If hx.Length = 0 Then

hx = "0" & hx

End If

S += hx & " "

End While

Return S

End Function

End Class

بالتوفيق ,,..

1
#6
njq8 كتب:

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

الحل بإختصار

إنك تقرأ بايت بايت واذا كان الرقم = -1 يعني نهايه الملف

Dim i As Integer = f.ReadByte

if i = -1 then

exit sub

end if

وتقدر تستخدم hex مع الـ integer لان الـ byte اهو اصلا integer يبدأ من 0 إللى 255 لكن ماتقدر تقرأ بايت على أنه بايت اذا كانت النتيجه -1 راح يحصل خطأ

فقط افتح مشروع جديد والصق الاكواد اللي تحت وراح تفهمها إن شاء الله ..

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim t As New TextBox

Me.Controls.Add(t)

t.Multiline = True

t.Dock = DockStyle.Fill

t.Text = FileToHex("c:\pkt2.jpg")

End Sub

Function FileToHex(ByVal file As String, Optional ByVal maxlength As Integer = -1) As String

If FileLen(file) = 0 Then Return ""

Dim f As New IO.FileStream(file, IO.FileMode.Open)

Dim S As String

While True

Dim i As Integer = f.ReadByte

If i = -1 Or f.Position = maxlength Then

f.Close()

Exit While

End If

Dim hx As String = Hex(i)

If hx.Length = 0 Then

hx = "0" & hx

End If

S += hx & " "

End While

Return S

End Function

End Class

بالتوفيق ,,..

اشكرك اخي إن شاء الله سوف اجرب الكود واردلك الخبر

لكن الا تعرف ما سبب المشكلة

الحل اللذي اعطيتني اياه سوف يحل المشكلة من جذورها ......... هل تعرف ما الخلل في برنامجي ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

#7

على فكره أخوي .. الكود اللي حاطه انت توي جربته وفعال ..

لكن أعتقد أن حجم الملف اللي تقراه كبير ويحتاج وقت طويل علشان يقرآه كامل

..

#8
njq8 كتب:

على فكره أخوي .. الكود اللي حاطه انت توي جربته وفعال ..

لكن أعتقد أن حجم الملف اللي تقراه كبير ويحتاج وقت طويل علشان يقرآه كامل

..

لا اخي الملف صغير كلش

وازيدك لقد قمت بعمل debug خطوة خطوة بال VB.net وعندما يصل الى شرط التوقف فانه يقوم بالاستمرار ولا يتوقف اي يصبح position اكبر من length ويستمر

حاول ان تعمل debug وستفهم قصدي

#9

طيب ..

Dim FS As New FileStream("c:\pkt2.jpg", FileMode.Open)

While True

Dim i As Integer = FS.ReadByte

If i = -1 Then

Exit While

End If

If i < 10 Then

TextBox2.Text &= 0

End If

TextBox2.Text &= Hex(i) & " "

End While

MsgBox("done")

FS.Close()

#10
njq8 كتب:

طيب ..

Dim FS As New FileStream("c:\pkt2.jpg", FileMode.Open)

While True

Dim i As Integer = FS.ReadByte

If i = -1 Then

Exit While

End If

If i < 10 Then

TextBox2.Text &= 0

End If

TextBox2.Text &= Hex(i) & " "

End While

MsgBox("done")

FS.Close()

اعرف اخي اني جربت هذا الكود قبل ما تعطيني اياه

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

امر هذا الكود غريب

#11

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

اخي جرب الكود المرفق, وحاول ترفق الملف virus.exe ليتم اختباره

WindowsApplication1.zip

.:: Wish to become better and better ::.

#12
VB Helper كتب:

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

اخي جرب الكود المرفق, وحاول ترفق الملف virus.exe ليتم اختباره

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

ملاحظة: فقط انظروا الكود في الحدث form_load واتركوا باقي الكود

WindowsApplication1.zip

#13

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

اخي لقد ارفقت لك المشروع وسألتك عن ارفاق الملف الذي تم اختباره؟

.:: Wish to become better and better ::.

#14
VB Helper كتب:

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

اخي لقد ارفقت لك المشروع وسألتك عن ارفاق الملف الذي تم اختباره؟

اسف اخي ما فهمت قصدك هذا هو الملف

VB Helper كتب:

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

اخي لقد ارفقت لك المشروع وسألتك عن ارفاق الملف الذي تم اختباره؟

اسف اخي ما فهمت قصدك هذا هو الملف

virus.zip

#15

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

اخي جرب المشروع المرفق وهو نفس المشروع السابق مع فحص ملفك وشغال 100%

WindowsApplication1.zip

.:: Wish to become better and better ::.

#16
VB Helper كتب:

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

اخي جرب المشروع المرفق وهو نفس المشروع السابق مع فحص ملفك وشغال 100%

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

اخي المشكلة نفسها :sad:

ولقد عملت thread للبرنامج لكي ابين لك المشكلة حيث اضفت label هو يشير الى موقع القراءة من الملف فعندما يصل الى شرط التوقف لا يتوقف ويستمر الى ما لا نهاية

وهذا هو البرنامج موجود في المرفقات

هذا البرنامج سوف يصيبني بالجنون :wacko:

WindowsApplication1.zip

#17

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

اخي والله حيرتني البرنامج شغال 100% ولكن سيأخذ فتره زمنية لأنك تقرأ بايت بايت, لكن في النهاية تظهر الرسالة, فضلا جربه وانتظر لبرهه ..

.:: Wish to become better and better ::.

#18

اسف اخي لاني تعبتكم معي كثيراً

ولكني انتظرت البرنامج كثيراً ولكن لم ينفع .. ليس من المعقول ان ياخذ فترة كثيرة لقراءة ملف تنفيذي فلقد رأيت برامج كثيرة مثل olly التي تقوم بقراءة ملفات تنفيذية وعمل debug لها (اظن انك سمعت به) ومع ذلك فهو لا ياخذ فترة طويلة حتى وان كان البرنامج كبير

بالنسبة الى برنامجك التي اعطيتني اياه فلقد عملت له تعديل بسيط حيث اضفت threading له لكي يعمل بشكل مستقل حتى ارى النتائج بينما هو يقرأ من الملف واضفت label وهذا ال label يحتوي على قيم basestream.posion و basestream.length لكي اعرف هل عندما يصل الى شرط التوقف يتوقف ام لا؟

وتابعت النتائج ولقد وجدت ان posetion يزداد حتى اصبح اكبر من length واستمر في الازدياد الى ما لا نهاية

وهذا التعديل موجود في البرنامج الذي ارفقته في ردي الاخير

ارجوا ان يكون شرحي واضحاً

#19

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

اخي وكيف شغال عندي!! حيرتني؟!!

.:: Wish to become better and better ::.

#20
VB Helper كتب:

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

اخي وكيف شغال عندي!! حيرتني؟!!

اخي واخيرا بعد مثابرة من قبلي استطعت كيف احل المشكلة انه :

عرفت متغيرين x,y المتغير الاول ياخذ مقدار صفر والثاني ياخذ مقدار طول السترنغ للملف واضعه في الشرط واقوم بزيادة المتغير الاول بمقدار عدد الباياتات التي اقراءها عندها يقوم برنامج بقراءة الملف بصورة سريعة جدا ومضمونة

شكرا لتعاونكم معي

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

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

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

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

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