PDA

View Full Version : سوال: خواندن و نوشتن یک فایل باینری به حالت اولیه



one hacker alone
دوشنبه 15 آبان 1391, 02:56 صبح
با یاد خدا
با سلام
من به دنبال روشی برای خواندن فایل هستم که وقتی ما یه فایل باینری رو میخونیم و داخل یه تکست میریزیم بتونیم با ذخیره محتویات اون تکست به صورت باینری به فایل اولیه برسیم
میشه دوستان راهنمایی کنن

SlowCode
دوشنبه 15 آبان 1391, 13:14 عصر
سلام
شما اول باید فایل رو به صورت باینری باز کنی، اینطوری:

Open "C:\pic.jpg" For Binary As #1
ReDim a(LOF(1) - 1)
Get #1, , a
Close

حالا مقادیر این فایل توی آرایه a ذخیره میشه حالا اگه می خوای تغییرش بده بعد ذخیرش کن، مثلا:

a(5) = 255
Open "C:\my.jpg" For Binary As #1
Put #1, , a
Close

نکته:
1- دو بایت اول فایل نشان به عنوان شناسه فایل محسوب میشه یعنی به سیستم میگه که jpg هست یا چیز دیگه، پس اگه توی این دو بایت تغییری ایجاد بشه فایل خراب میشه.
2- سعی کنین مقادیر رو توی تکست باکس نریزین چون سرعت رو خیلی خیلی پایین میاره، یعنی شما تا بیایین همه آرایه رو با حلقه بریزین بهش چند دقیقه طول میکشه.

one hacker alone
دوشنبه 15 آبان 1391, 18:25 عصر
ببینید من میخوام فایل رو با باینری باز کنم و محتویات رو در یک فایل txt ذخیره کنم و بعد اون محتویات رو به سیستم دیگه ببرم و در اونجا با یه برنامه دیگه اما تحت وی بی اون فایل تکست رو بخونم و بعدش در قالب فایل اولیه که یک فایل exe بوده ذخیره و اجرا کنم
من برای اینکار وقتی فایل هارو میخوندم به صورت عددی در میومد
حتی خودم اومدم یک فایل اجرایی رو در notepad باز کردم و اون محتوا رو با vb در یک فایل اجرایی ذخیره کردم اما برنامه اجرا نشد
من دنبال راهی هستم که وقتی من یک فایل اجرایی رو تبدیل به متن کردم و به شما دادم شما بتونید با ذخیره اون در قالب فایل باینری به برنامه ای که داشتم برسید
پیشنهاد؟؟؟

SlowCode
دوشنبه 15 آبان 1391, 21:59 عصر
بله اجرا نمیشه چون اگه دقت کنین عرض کردم دو بایت اول فایل نشان دهنده نوع فایله، پس وقتی متن رو با نوت پد ذخیره میکنین اون دو بایت نوشته نمیشن.
می تونید از کد زیر استفاده کنید:
Dim a() As Byte, strByte As String
Open "C:\test.exe" For Binary As #1
ReDim a(LOF(1) - 1)
Get #1, , a
Close
For i = 0 To UBound(a)
strByte = strByte & a(i)
Next
Text1 = strByte
حالا وقتی خواستین ذخیرش کنین باید بایت ها رو از هم جدا کنین پس بهتره توی کد بالا از یه کاراکتر جداکننده استفاده کنین بعد با تابع split بایت ها رو جدا کنین و با دستوری که توی پست دوم نوشتم بایت ها رو توی یه فایل ذخیره کنین.

one hacker alone
دوشنبه 15 آبان 1391, 22:30 عصر
ممنون از راهنماییتون
سوالی که هست اینه که خوب اگه قراره من فایلی رو که خوندم کاراکترهای اون رو از هم جدا کنم بعد دوباره بچسبونم چرا باید این کار رو بکنم
درضمن اگه امکان داره درمورد علامت گذاری بین بایت ها بیشتر توضیح بدین من نمیدونم این کار روباید به چه صورت انجام داد

SlowCode
دوشنبه 15 آبان 1391, 22:42 عصر
بفرما:
Dim a() As Byte, strByte As String
Open "C:\test.exe" For Binary As #1
ReDim a(LOF(1) - 1)
Get #1, , a
Close
For i = 0 To UBound(a)
strByte = strByte & "%" & a(i)
Next
Text1 = strByte
برای ذخیره کردن هم:

a=Split(Text1,"%")
Open "C:\program.exe" For Binary As #1
Put #1, , a
Close

سوالی که هست اینه که خوب اگه قراره من فایلی رو که خوندم کاراکترهای اون رو از هم جدا کنم بعد دوباره بچسبونم چرا باید این کار رو بکنم
خوب چون که ما اونارو قبلا به هم چسبوندیم. اگه نخوای این کار رو بکنی باید هر بایت رو توی یه سطر بنویسی.

one hacker alone
سه شنبه 16 آبان 1391, 02:08 صبح
مهندس دستت درد نکنه ولی تابع split خطای type mismatch رو میزنه همه جوره تغییر دادم اما خطا داد

SlowCode
سه شنبه 16 آبان 1391, 02:58 صبح
احتمالا توی اون رویداد آرایه a رو به عنوان بایت تعریف کردین، از نوع variant و یا string در نظر بگیر ببین درست میشه؟

one hacker alone
سه شنبه 16 آبان 1391, 23:00 عصر
مشکل باز حل نشد
کد زیر رو ببینید



Private Sub Command_Read_Click()
Dim a() As Byte, strByte As String
Open "C:\1.exe" For Binary As #1
ReDim a(LOF(1) - 1)
Get #1, , a
Close #1
For i = 0 To UBound(a)
strByte = strByte & "%" & a(i)
Next
Text1.Text = strByte

End Sub

Private Sub Command_write_Click()
Dim b() As String
b = Split(Text1.Text, "%")
Open "C:\3.exe" For Binary As #1
Put #1, , b
Close
End Sub


متغیر b که اطلاعات رو از تکست باگس میخونه به صورت string تعریف بشه برنامه بدون خطا اجرا میشه اما فایل خروجی ما 4 برابر فایل اولیه حجمش میشه

اگه اطلاعات فایل اجرایی رو بخونیم و همون وقت بنویسیم به درستی کار میکنه اما اگه بخوایم اون رو درون یه تکست باکس بریزیم مشکل دار میشه و کماکان درگیر این موضوع هستم
راه حل:؟

SlowCode
سه شنبه 16 آبان 1391, 23:16 عصر
بله یادم رفت بگم، وقتی که فایل رو مینویسی اول باید به کاراکتر تبدیل کنی بعد بنویسی(با تابع chr)
شما خاصیت MultiLine تکست باکس رو هم true کن بعد امتحان کن.
در ضمن توی Command_Read کد خط زیر رو بعد از حلقه بنویس:
strByte = Right(strByte, Len(strByte) - 1)

one hacker alone
چهارشنبه 17 آبان 1391, 13:07 عصر
برای نوشتن من کد زیر رو نوشتم

Dim b() As String
b = Split(Text1.Text, "%")
b = Chr(Val(b))
Open "C:\3.exe" For Binary As #1
Put #1, , b
Close


چون محتوای فایل به صورت کد اسکی هست باید از تابع VAL برای تبدیلش به رشته استفاده کنم بعد از CHR چون بدون این کار خطای MISMATCH میده اما با این حال هم باز کار نمیکنه و البته تابع CHR هر بار یه کد اسکی میگیره و تبدیل میکنه و این هم یه ایراد دیگه کد من هست

SlowCode
چهارشنبه 17 آبان 1391, 18:19 عصر
ببینید شما تو مفاهیم مشکل دارید، b یک آرایه است نه متغیر پس خط سوم شما اشتباهه چون شما نمیتونی همه مقادیر آرایه رو به کاراکتر تبدیل کنی. باید توی یه حلقه این کار رو بای تمام خانه های آرایه انجام بدین. یعنی اینطوری:

For i=0 to Ubound(b)
b(i)=chr(val(b(i)))
Next


باید از تابع VAL برای تبدیلش به رشته استفاده کنم
برعکس گفتین، این تابع رشته رو به عدد تبدیل میکنه.

one hacker alone
پنج شنبه 18 آبان 1391, 00:58 صبح
در مورد تابع val میدونستم اما حواصم نبود اشتباهی گفتم
والا اون چیزی که شما گفتین من انجام دادم اما جواب نمیده و این منطقی نیست که ما نتونیم این کار رو بکنیم
شما چی فکر میکنین؟ مشکل از کجاست؟ دوباره فایل با حجم بالا میسازه و کلا کار نمیکنه

Private Sub Command6_Click()
Dim b() As String
b = Split(Text1.Text, "%")
For i = 0 To UBound(b)
b(i) = Chr(Val(b(i)))
Next i
Open "C:\3.exe" For Binary As #1
Put #1, , b
Close

vbhamed
دوشنبه 22 آبان 1391, 20:31 عصر
سلام


Dim s() As String, b() As Byte
s = Split(Text1.Text, "%")
ReDim b(UBound(s))

For i = 0 To UBound(s)
b(i) = Val(s(i))
Next i

Open "C:\3.exe" For Binary As #1
Put #1, , b
Close