ما هي الملفات و كيف نتعامل معها ؟؟
#31
السلام عليكم ورحمة الله وبركاته

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

هذا الملف اجرب عليه وهو خاص بالهاردديسك وهذه الصورة تحمل العنوان المراد التعديل عليه لسهولة فهمي اريد مثال على هذه الصورة للتوضيح .

الصورة للملف 1.bin كيف يتم البحث داخله وعن اول قيمة واخر قيمة المشار اليهم بالصورة ثم نسخهم الى الملف 2.bin في نفس الادريسس .

اريد ان افهم الية التعامل مع الملفات بأمثله حتى تتضح المعلومة ,, ايضا لا يهم التطبيق على هذان الملفان لاني لا احتاجهم في عملي بل هم لعمل مثال عملي , 

اما اذا كانت هناك شرح اشمل من المطلوب فلا مشكلة .


الملفات المرفقة
.rar   BinFile.rar (الحجم : 109.79 KB / التحميلات : 6)
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#32
وعليكم السلام
هذا مثال يقوم بالمطلوب
يمكن التعليق عن أي شيء لم تفهمه
PHP كود :
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
 
 DialogsStdCtrls;

type
  TForm1 
= class(TForm)
 
   Button1TButton;
 
   procedure Button1Click(SenderTObject);
 
 private
    
{ Private declarations }
 
 public
    
{ Public declarations }
 
 end;

var
 
 Form1TForm1;

implementation

{$R *.dfm}

type
  ByteArray 
= array of Byte;

function 
read_(const FileNamestringOffsetDWORDLengthDWORDout bArrayByteArray): Integer;
var
 
 MSTMemoryStream;
begin
  MS 
:= TMemoryStream.Create;
 
 try
    MS
.LoadFromFile(FileName);
 
   MS.Position := Offset;
 
   SetLength(bArrayLength);
 
   Result := MS.Read(bArray[0], Length);
 
 finally
    MS
.Free;
 
 end;
end;

function 
write_(const FileNamestringOffsetDWORD; var bArrayByteArray): Integer;
var
 
 MSTMemoryStream;
begin
  Result 
:= 0;
 
 MS := TMemoryStream.Create;
 
 try
    MS
.LoadFromFile(FileName);
 
   MS.Position := Offset;
 
   Result := MS.Write(bArray[0], Length(bArray));
 
   MS.SaveToFile(FileName);
 
 finally
    MS
.Free;
 
 end;
end;

procedure TForm1.Button1Click(SenderTObject);
var
 
 bArrayByteArray;
begin
  read_
('1.bin', $3CC, $74bArray);
 
 write_('2.bin', $3CCbArray);
end;

end
سبحان الله وبحمده سبحان الله العظيم
[-] كل من 2 users say قال شكرا ل Agmcz على المشاركة المفيدة
  • ELARAPY, eng_ali
الرد
#33
السلام عليكم
شكرا استاذ Agmcz جزاك الله خيرا .

ان شاء الله ساجرب عندما يكون الوقت متاح واخبرك .
معذرة لضيق الوقت فان العمل عندي في شهر رمضان قبل الافطار وبعده . كل عام وانتم بخير
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#34
موضوع رائع وجميل شكرا جزيلا لجميع الاساتدة والقائمين على المنتدي لقد استفدت كثيرا من بعض المواضيع والنقاشات المطروحة في جميع اقسام المنتدى فشكرا مرة اخرى للجميع
اخواني انا جديد معكم في المنتدى و ليس لي الا بضع شهور في دراسة البرمجة بالدلفي
وسؤال الاخ ELARAPY بصراحة رائع واجوبة الاساتدة كانت اروع في طريقة تحديد قراءة وكتابة بلوك معين بتحديد نقطي بداية ونهاية الــ Offset
ولقد قمت بتجربتها والنتيجة رائعة
ولاكن عندي مشكل ارجوا ان كان في مقدور الاساتدة و الاخوه شرحه لي او فكرة توجيهني في فهمه وهو
عند تحديد بداية ونهاية offset لملف ما كما صرح الاستاد Agmcz بارك الله فيه
فهي تكون محصورة بدالك الملف فقط بمعنى انه لو اردت قراءة بلوك معين وكتابته سيكون محصور بين بداية ونهاية الــ Offset الدين صرحت بهما في برمجة البرنامج
وانا لدي ملفين يحملان نفس قيمة البلوك ولاكن لكل بلوك منهما بداية ونهاية offset مختلفة عن الاخر؟؟
هنا طريقة تحديد البلوك عن طريق Offset اصبحت غير مجدية في حالتي لاختلاف تواجد البلوك في الملفين
وانا اريد طريقة للبحث داخل داتا الملف لاني لاحظت ان اول 8 بايت واخر 8بايت للبوك المراد قراته وكتابته للملفين لهما نفس القيمة
واريد تعويض تحديد البلوك من (بداية ونهاية) Offset الى قيمتي 8بايت (لبداية ونهاية) البلوك
لااله الا الله محمد رسول الله
الرد
#35
السلام عليكم ورحمة الله وبركاته

اولا اخي الحبيب مهندس Agmcz الكود يعمل جيدا بارك الله فيك , ما يهمني كيف يمكنني ان اصل لتلك النتيجة بمجهودي الذاتي ؟

بحثت على الانترنيت وايضا في دلفي Help عن الصنف TMemoryStream ولم اصل لمثل ذلك الكود وحاولت النظر الى جميع الاستخدامات التي تخص ذلك الصنف ولم اجد مثال واضح للتعامل مع BinFile مثل مثالك اخي الكريم .

اود معرفة 
---------- :
1- طريقة البحث والمحاولة .
2- كل شئ يخص الصنف TMemoryStream وجميع الدوال التي تندرج تحته بامثلة بسيطه ,, 
3- ما هي طريقة البحث عن قيمة داخل Bin File وان يكون البحث من نهاية الملف أي من الاسفل الى الاعلى ثم ارجاع عنوان الادريس الذي يحمل تلك القيمة ثم الكتابة من ذلك العنوان ..

افضل شئ علمني التعامل الكامل مع ذلك الصنف حتى لا اطيل بالاسئلة في المنتدى .
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#36
السلام عليكم ورحمة الله وبركاته 
اخي الكريم اولا شكرا جزيلا على ردك الكريم 
لقد وفقني ربي سبحانه وتعالى في تحقيق الشرط والسؤال الدي طرحته سابقا بعد دراسة وتحليل بعض النمادج  والامثلة الخاصة بــ TMemoryStream
بحيث قمت بتحديد قيمتين من داتا ملف BIN ثم البحث عن هاتين القيمتين بالقراءة المتتالية للداتا وعند العثور عليها يتم تحويلها لبداية ونهاية للبولك الدي اريد قراءته وكتابته وقد نجحت الفكرة وقمت بتجربتها على عدة ملفات والنتيجة مرضية  ارجوا ان تجد فيها جوابا لسؤالك 3 فالقراءة من اول الملف تختلف عن القراءة من أخره والله أعلم 
وهدا مثال على ما توصلت له 
كود :
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
ByteArray = array of Byte;
var
  Form1: TForm1;
  Buff : AnsiString;
  BB : TStringStream;
  FileName:String;
  F: File;
  BinaryBytesRead, TotalBytesRead, i, BufferSize: Integer;
  Buffer: array [0..4095] of byte;
  StartOffset,EndOffset,Star,EndO: Dword;

implementation

{$R *.dfm}
{------------------------------------------------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
begin
opendialog1.Filter:='Binary Files|*.bin';
if opendialog1.Execute then begin
  Edit1.Text:= Opendialog1.FileName;
  FileName:= Opendialog1.FileName
end;
end;

{------------------------------------------------------------------------------}

procedure TForm1.Button2Click(Sender: TObject);
var
  MS1,MSS:TMemoryStream;
begin
  TotalBytesRead := 0;
  BinaryBytesRead := 0;
  Buffer [0] := 0;
  FillChar(Buffer,SizeOf(Buffer),0);
  if FileExists(FileName) then
    begin
    AssignFile (F, FileName);
    Reset (F,1);
    try
      repeat
      BlockRead (F,Buffer,Sizeof (Buffer),BinaryBytesRead);
      inc(TotalBytesRead, BinaryBytesRead);
{ Start Offset Block } { Ãæá 4ÈÇíÊ ãä ÇáÈáæß } {2D726F6D}
      for i := 0 to BinaryBytesRead - 4 do
      begin
      if buffer [i + 0] <> $2D then continue;
      if buffer [i + 1] <> $72 then continue;
      if buffer [i + 2] <> $6F then continue;
      if buffer [i + 3] <> $6D then continue;
   StartOffset:= TotalBytesRead - BinaryBytesRead + I;
      end;
{ End Offset Block }  {  ÃÎÑ 4 ÈÇíÊ ãä ÇáÈáæß }  {453DCD28}
      for i := 0 to BinaryBytesRead -4 do
      begin
      if buffer [i + 0] <> $45 then continue;
      if buffer [i + 1] <> $3D then continue;
      if buffer [i + 2] <> $CD then continue;
      if buffer [i + 3] <> $28 then continue;
   EndOffset:= TotalBytesRead - BinaryBytesRead  + I;
      end;
      until BinaryBytesRead < 4;
      finally
      CloseFile (F);
{------------------------ Creat and Write Bin File -------------------------}
    MS1:= TMemoryStream.Create;
    MS1.LoadFromFile(FileName);
      Star := StrToInt('$'+IntToHex(StartOffset,8));
      EndO   := StrToInt('$'+IntToHex(EndOffset,8));
    BufferSize := EndOffset - StartOffset ;
    SetLength(Buff,BufferSize);
    MS1.Position := StartOffset;
    MS1.ReadBuffer(Buff[1],BufferSize);
    BB := TStringStream.Create(Buff);
    MSS:= TMemoryStream.Create;
  try
    MSS.LoadFromStream(BB);
    MSS.writeBuffer(Buff[1],BufferSize);
     if MSS.Size>0 then begin
    MSS.SaveToFile('.\Find_Block.bin');
    label3.Caption:='0x'+IntToHex(StartOffset,8);
    label4.Caption:='0x'+IntToHex(EndOffset,8);
    end
    else
     ShowMessage('Error Data Or File incorect');
  finally
   MS1.Free;
   MSS.Free;
end;
end;
end;
end;
end.

لااله الا الله محمد رسول الله
[-] كل من 2 users say قال شكرا ل eng_ali على المشاركة المفيدة
  • ELARAPY, أبو معاذ
الرد
#37
السلام عليكم ورحمة الله وبركاته

بارك الله فيك اخي eng_ali للمشاركة ,, انا لا ادري لماذا لم يتابعوا الاخوة المشرفين المواضيع وارى اكثر الاهتمام بالموضوع الجديد ,
علما ان من دواعي اصراري تعلم الدلفي هو ذلك المنتدى الجميل D4A .

شكرا للجميع .
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
[-] كل من 1 user says قال شكرا ل ELARAPY على المشاركة المفيدة
  • eng_ali
الرد
#38
(14-07-2019, 01:43 AM)ELARAPY كتب : السلام عليكم ورحمة الله وبركاته

بارك الله فيك اخي eng_ali للمشاركة ,, انا لا ادري لماذا لم يتابعوا الاخوة المشرفين المواضيع وارى اكثر الاهتمام بالموضوع الجديد ,
علما ان من دواعي اصراري تعلم الدلفي هو ذلك المنتدى الجميل D4A .

شكرا للجميع .
أخي هل تتحدث عن هذا الموضوع وأنه لم يتابع؟
سبحان الله وبحمده سبحان الله العظيم
الرد
#39
السلام عليكم ورحمة الله وبركاته اخي واستاذي الحبيب Agmcz

انا لا اقصد موضوع بعينه استاذي ولكن في الغالب اجد المشرف يرد على السؤال وليست هناك شروحات .

هناك منتدى (سؤال و جواب حول دلفي) يصلح لطرح سؤال من شخص والرد على السؤال من اخر .
وهناك منتدى (دروس دورة دلفي للعرب ) يحمل الشروحات فاين الصنف TMemoryStream في ذلك المنتدى ؟

انا اعلم جيدا انه من الصعب وضع كل كبيرة وصغيرة تخص البرمجة بالمنتدى لان ذلك يتطلب مئات بل ألوف السطور ولكن كنت اتمنى بعدما يتم الرد على السؤال ينشأ شرح للسائل اذا اراد التعلم , اما اذا كان يحتاج شئ بعينه ووجد ضالته فلا حرج .

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

http://delphi4arab.net/forum/showthread....9#pid48809
قل إن صلاتي ونسكي ومحياي ومماتي لله رب العالمين
الرد
#40
السلام عليكم
TMemoryStream تجد كل ما يخصه في ملفات المساعدة اذا اردت ان ان تتعامل مع الملفات bin...

  1.  يجب ان تدرس اولا بنية الملف PE.
  2. ان تكون لديك دراية كافية Byte / Decimal / Hexadecimal هذه الاخيرة ليست صعبة
  3. يجب ان تكون لى دراية كافية بالمؤشرات Pointers
هذا الرابط ربما يفيدك كما يوجد فيه كتاب لشرح بنية PE

تغيير قيمة معينة فى ملف عن طريق دالة معينة

بالتوفيق اخي
و لرب نازلة يضيق لها الفتى ذرعا و عند الله منها المخرج
ضاقت فلما استحكمت حلقاتها فرجت و كنت اضنها لا تفرج
[-] كل من 1 user says قال شكرا ل S.FATEH على المشاركة المفيدة
  • ELARAPY
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف