منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
[سؤال] كيفية التعديل على قيمه معينه داخل ملف هيكس - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183)
+--- الموضوع : [سؤال] كيفية التعديل على قيمه معينه داخل ملف هيكس (/showthread.php?tid=2858)

الصفحات: 1 2 3 4


RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - Motaz Alnuweiri - 21-05-14

لقد قمت بتعديل مثال "البحث عن 3 قيم وتعديل القيمة الثالثة" بحيث يقوم بحساب CRC-32 للملف بعد التعديل وتخزينها في المكان الذي أشرت إليه

كود :
Dim MyFileStream As IO.FileStream = Nothing

Try
    'تعريف مسار الملف
    MyFileStream = New IO.FileStream("D:\test.exe", IO.FileMode.Open, IO.FileAccess.ReadWrite)

    'مصفوفة من البايت بحجم الملف
    Dim Buffer(MyFileStream.Length - 1) As Byte

    'المصفوفة المراد البحث عنها داخل الملف
    Dim Find As Byte() = {&HFF, &HFF, &H10}

    'قرائة الملف حتي النهاية
    MyFileStream.Read(Buffer, 0, Buffer.Length)

    Dim Index As Integer = 0
    Do
        Index = SearchByteArray(Buffer, Find, Index)

        If Index <> -1 Then
            'اسنبدال القيمة الثالثة بقيمة جديدة
            Buffer(Index + 2) = &HFF
        End If
    Loop Until Index = -1

    'الانتقال لبداية الملف
    MyFileStream.Seek(&H0, IO.SeekOrigin.Begin)

    'كتابة المصفوفة للملف بعد التعديل
    MyFileStream.Write(Buffer, 0, Buffer.Length)

    'للتأكد من أنه تم كتابة كل البيانات للملف
    MyFileStream.Flush()

    'حساب CRC-32 للملف بعد التعديل وتحويله لمصفوفة من البايت
    Dim CRCBytes As Byte() = BitConverter.GetBytes(CRC32.ComputeChecksum(Buffer))

    'الانتقال لموقع حفظ CRC-32
    MyFileStream.Seek(&HC, IO.SeekOrigin.Begin)

    'كتابة قيمة CRC-32 الجديدة للملف بعد التعديل
    MyFileStream.Write(CRCBytes, 0, CRCBytes.Length)

Finally
    If MyFileStream IsNot Nothing Then MyFileStream.Close()
End Try

وهذا كود Crc32 - منقول

كود :
Public Class Crc32
    Shared table As UInteger()

    Shared Sub New()
        Dim poly As UInteger = &HEDB88320UI
        table = New UInteger(255) {}
        Dim temp As UInteger = 0
        For i As UInteger = 0 To table.Length - 1
            temp = i
            For j As Integer = 8 To 1 Step -1
                If (temp And 1) = 1 Then
                    temp = CUInt((temp >> 1) Xor poly)
                Else
                    temp >>= 1
                End If
            Next
            table(i) = temp
        Next
    End Sub

    Public Shared Function ComputeChecksum(bytes As Byte()) As UInteger
        Dim crc As UInteger = &HFFFFFFFFUI
        For i As Integer = 0 To bytes.Length - 1
            Dim index As Byte = CByte(((crc) And &HFF) Xor bytes(i))
            crc = CUInt((crc >> 8) Xor table(index))
        Next
        Return Not crc
    End Function
End Class

المصدر: Calculate CRC32 of an String or Byte Array


RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - محمديات - 21-05-14

لا ادري ما هي المشكله هنا




RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - محمديات - 21-05-14



وعلى فكره انا شغال على 2013 vb.net
والبرنامج تم عمله على .net freamwork 4
ولا ادري ما المشكله


RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - Motaz Alnuweiri - 21-05-14

(21-05-14, 06:54 PM)محمديات كتب :

وعلى فكره انا شغال على 2013 vb.net
والبرنامج تم عمله على .net freamwork 4
ولا ادري ما المشكله

ارجع إلي هذه المشاركة التي فيها البحث عن 3 قيم وتعديل القيمة الثالثة وانسخ كود البحث داخل مصفوفة عن مصفوفة آخرى

ملاحظة: لقد قمت بتعديل كل الاكواد في جميع المشاركات بحيث أصبحت أبسط وأصغر


RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - محمديات - 21-05-14

تمام واضح سوف اقوم بالتجربه والرد عليك


RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - محمديات - 21-05-14

ممتاااااااااااااز وشكرا لك للمجهود الطيب لكن المشكله ان ال crc لا يعطي القيم اللي انا طالبها بالظبط لأن المشكله لا اعرف نوع ال crc المستخدمه في مثل هذه الملفات ولن نتطرق له الن حتى اتاكد من crc صحيح اريد استخدامه


اما بالنسبه واجهتني مشكله في الكود هذا لا ادري لماذا وشكرا لك



RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - Motaz Alnuweiri - 22-05-14

(21-05-14, 10:36 PM)محمديات كتب : اما بالنسبه واجهتني مشكله في الكود هذا لا ادري لماذا وشكرا لك

هذا حل لمشكلتك Smile

كود :
Dim Find As Byte() = {&HFF, &HFF, &H10}

If IsArraysEqual(Find, {&HFF, &HFF, &H10}) Then
    MsgBox("الحالة الأولى")
ElseIf IsArraysEqual(Find, {&H5E, &H5, &H64}) Then
    MsgBox("الحالة الثانية")
Else
    MsgBox("الحالة الثالثة")
End If

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

كود :
Function IsArraysEqual(ByVal ArrayA As Byte(), ByVal ArrayB As Byte()) As Boolean
    If ArrayA.Length <> ArrayB.Length Then
        Return False
    Else
        Dim Counter As Integer = 0
        For I As Integer = 0 To ArrayA.Length - 1
            If ArrayA(I) = ArrayB(I) Then
                Counter += 1
            Else
                Exit For
            End If
        Next

        Return (Counter = ArrayA.Length)
    End If
End Function



RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - محمديات - 22-05-14

شكرا لمتابعتك لي اخي الحبييييييييييييييييييييييييييييييب جدا Motaz Alnuweiri واتمنى اقدر ارد جميلك هذا علي وسوف اجرب واوفيك بالنتيجه


RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - Motaz Alnuweiri - 23-05-14

(22-05-14, 04:26 PM)محمديات كتب : شكرا لمتابعتك لي اخي الحبييييييييييييييييييييييييييييييب جدا Motaz Alnuweiri واتمنى اقدر ارد جميلك هذا علي وسوف اجرب واوفيك بالنتيجه

العفو أخي محمديات Smile


RE: كيفية التعديل على قيمه معينه داخل ملف هيكس - محمديات - 23-05-14

1- بالنسبه لل crc وجدت برنامج يقوم بعمله بالطريقة الصحيحه ويكتب ال crc المناسب للملف والملف يعمل بطريقه صحيحه انا رفعت البرنامج لمعرفة نوع ال crc او الطريقة التي يتبعها في حساب ال crc او على الأقل طريقة دمجه داخل برنامجي ليعمل في الخلفية ويعدل ال crc Smile

2- عندي مشكله عند البحث بالهكس عن مجموعة بايت بجوار بعضهم اريد ان اظهر كل قيمة منهم في صندوق فيظهرون عندي بصيغة الأرقام ولا يظهرون بصيغة الهيكس وانا اريدهم يظهرون بصيغة الهيكس والكود المستخدم
كود :
Dim Buffer(MyFileStream.Length - 1) As Byte
            Dim Find As Byte() = {&H46, &H3, &HFF, &HF}
            MyFileStream.Read(Buffer, 0, Buffer.Length)
            If IsArraysEqual(Find, {&H46, &H3, &HFF, &HF}) Then
                Dim Index As Integer = 0
                Do
                    Index = SearchByteArray(Buffer, Find, Index)

                    If Index <> -1 Then

                        TextBox2.Text = Buffer(Index + 0)
                        TextBox3.Text = Buffer(Index + 1)
                        TextBox4.Text = Buffer(Index + 3) & Buffer(Index + 2)

                    End If
                Loop Until Index = -1

هذا ناتج الكود



ولكن من الفترض او المطلوب انه يظهر القيم الحقيقة مثل


ومكانهم بالملف الهيكس



مع العلم اني استخدمة خاصية البحث اللي حضرتك شرحتها علشان اعرف مكانه على ال buffer
ولكن ما الحل لأنه في النهاية المظهر اللي من المفترض ان يخرج



مع امكانية عمل swap بالضغط على زر وليكن مثلا لنقل مربع ازرق مكان مربع ازرق اخر في نفس الملف

واسف اني اطلت عليك اخي الحبيب والمحبوب Smile

Motaz Alnuweiri