PDA

View Full Version : سوال: چطور میتونم اطلاعات درون یه فایل exe رو به صورت باینری بخونم



joooje
سه شنبه 21 دی 1389, 10:25 صبح
با سلام
چطور میتونم اطلاعات درون یه فایل exe رو به صورت باینری بخونم
توی فروم هم جستجو کردم ولی چیز به درد بخوری برای دلفی پیدا نکردم
دو نمونه کد بود که برای VB بود
ممنون میشم راهنمایی کنید

BORHAN TEC
سه شنبه 21 دی 1389, 16:51 عصر
اگه امکان داره کمی واضح تر توضیح بدین تا بهتر بتونم راهنمایی کنم. اگه از Delphi XE استفاده می کنید باید بگویم که کلاس جدیدی به نام TBinaryReader به آن اضافه شده است.

vcldeveloper
سه شنبه 21 دی 1389, 21:56 عصر
چطور میتونم اطلاعات درون یه فایل exe رو به صورت باینری بخونم
منظورتون از خواندن چی هست؟ میخواید فایلی رو باز کنید، و محتوای آن را بررسی کنید یا تغییری درش ایجاد کنید؟ یا اینکه منظورتون نمایش محتوای فایل به کاربر هست؟

هر فایلی رو شما می تونید با کلاس هایی مثل TFileStream، TMemoryStream، و غیره؛ یا توابع مختلف کار با فایل دلفی و ویندوز، بخونید؛ یعنی به محتوای داخل فایل دسترسی داشته باشید. حالا میخواد محتوای فایل شما هر چیزی باشه. از نظر این کلاس ها و این توابع، اون فایل صرفا حاوی دنباله ایی از بایت ها ست.

اگر منظورتون این هست که محتوای فایل را به کاربر نمایش بدید (مثل برنامه های Hex Editor)، باید با همون ابزارهایی که در بالا بهشون اشاره کردم، فایل را بخوانید، سپس محتوای خوانده شده را با یک تابع تبدیل به رشته ایی با فرمت Hex بکنید. اگر مشکل تون این هست، باید بپرسید، "چطور می توان مجموعه ایی از بایت ها را تبدیل به Hex کرد؟"

joooje
چهارشنبه 22 دی 1389, 12:27 عصر
ممنون
من از دلفی 7 استفاده میکنم
راسش دقیقا میخوام یه قسمت از یه فایل رو با یه قسمت از یه فایل دیگه چک کنم و در صورت لزوم تغییر تو اون بدم.
قطعا باید بتونم کل کارکترهای متنی و غیر متنی رو بخونم (نمیدونم اصلا میشه این اطلاعات رو بصورت رشته ای مورد بررسی قرار داد یا نه)
ممنون میشم یکم بیشتر راهنمایی کنید

vcldeveloper
چهارشنبه 22 دی 1389, 12:41 عصر
راسش دقیقا میخوام یه قسمت از یه فایل رو با یه قسمت از یه فایل دیگه چک کنم و در صورت لزوم تغییر تو اون بدم.
فایل های مربوطه رو با TFileStream باز کنید، و با استفاده از متد Read آن، بخش های مورد نظرتان را در یک بافر بریزید. اون وقت می تونید محتوای این دو بافر را بایت به بایت با هم مقایسه کنید؛ یا در حالت دیگه، می تونید از اون دو بافر Hash Code بگیرید، و Hash Code ها را با هم مقایسه کنید.

Mask
چهارشنبه 22 دی 1389, 18:26 عصر
با عرض سلام
منم یه سوال داشتم.
میشه بفرمایید چه مقدار از فایل اول رو باید در بافر ریخت و چه مقدار رو در بافر دوم و با هم مقایسه کرد؟
من این کار رو انجام دادم. مشکل اینجاست که گاهی فایلها ابتداشون خالیه یا تا جایی عدد 0 داره. که این موضوع مشکل ساز میشه.
از کجا باید بریزم تو بافر؟

Felony
چهارشنبه 22 دی 1389, 19:26 عصر
با عرض سلام
منم یه سوال داشتم.
میشه بفرمایید چه مقدار از فایل اول رو باید در بافر ریخت و چه مقدار رو در بافر دوم و با هم مقایسه کرد؟
من این کار رو انجام دادم. مشکل اینجاست که گاهی فایلها ابتداشون خالیه یا تا جایی عدد 0 داره. که این موضوع مشکل ساز میشه.
از کجا باید بریزم تو بافر؟
شما دارید 2 تا فایل رو با هم مقایسه میکنید ، اینکه چه مقدار از فایل اول رو داخل بافر اول و چه مقدار از فایل دوم رو داخل بافر دوم بریزید و از کجا بریزید بستگی به خودتون داره ، وقتی 2 تا فایل با هم قراره مقایسه بشن همه چیشون مقایسه میشه نه جاهایی که 0 نیستن یا ... ؛ اگر میخواین بایت های 0 اول فایل رو نخونید یا ... باید خودتون پیادش کنید .

joooje
پنج شنبه 23 دی 1389, 13:48 عصر
سلام
میشه یه نمونه کد بزارید
آخه من حتی همون کاری که دوستمون Delphi-7 تونسته انجام بده رو هم نتونستم!:گریه:
ممنون

vcldeveloper
پنج شنبه 23 دی 1389, 17:28 عصر
میشه یه نمونه کد بزارید

function CompareFiles(const File1, File2 : string): Boolean;
const
BuffSize = 128;
var
F1, F2 : TFileStream;
F1Buffer, F2Buffer : TBytes; //array of Byte
i: Integer;
begin
if (not FileExists(File1)) or (not FileExists(File2)) then
raise Exception.Create('Invalid files are specified');

SetLength(F1Buffer,BuffSize);
SetLength(F2Buffer,BuffSize);

F2 := nil;
F1 := TFileStream.Create(File1,fmOpenRead or fmShareDenyWrite);
try
F2 := TFileStream.Create(File2, fmOpenRead or fmShareDenyWrite);
F1.ReadBuffer(F1Buffer[0],Length(F1Buffer));
F2.ReadBuffer(F2Buffer[0],Length(F2Buffer));
finally
F1.Free;
F2.Free;
end;

Result := True;
for i := Low(F1Buffer) to High(F1Buffer) do
begin
if F1Buffer[i] <> F2Buffer[i] then
begin
Result := False;
Break;
end;
end;
end;این کد فقط 128 بایت اول دو فایل رو با هم مقایسه میکنه.

نحوه استقاده ازش:


var
R : Boolean;
begin
R := CompareFiles('D:\File1.exe','D:\File2.exe');
if R then
ShowMessage('Files are the same')
else
ShowMessage('Files differ.');
end;

joooje
پنج شنبه 23 دی 1389, 18:08 عصر
ممنون
من کد رو زیر این کد وارد کردم


implementation

{$R *.dfm}
و کد دوم رو هم به یه دکمه دادم
ولی به این خط گیر میده!!


F1Buffer, F2Buffer : TBytes;

آیا نیاز هست تو uses چیزی اضافه کنم؟

vcldeveloper
جمعه 24 دی 1389, 00:55 صبح
ولی به این خط گیر میده!!
به خاطر این هست که دارید از نسخه های قدیمی دلفی استفاده می کنید. در کامنت رو به روی آن نوشتم که می تونید به جای TBytes از array of Byte استفاده کنید. تعریف TBytes هم در واقع همون هست:


type
TBytes = array of Byte;

joooje
جمعه 24 دی 1389, 17:42 عصر
سلام
ممنون از راهنماییتون
فقط 2 تا سوال دیگه دارم که ممنون میشم راهنمایی کنید.ممنون میشم اگر کد بزارید
چطور میتونم تعداد کل بایتهای یه فایل رو به دست بیارم که مثلا بشه همه بایتها رو با هم چک کرد- نه فقط 128 تا
و اینکه چطور میتونم این 128 بایت را که با هم چک کردم اختلافشون رو تویه یه فایل جدید بنویسم
منظورم اینه که اول یه فایل خالی بسازم و بعد اختلاف اون دوتا فایل رو بنویسم توی اون
ممنون از وقتی که میزارید.

vcldeveloper
جمعه 24 دی 1389, 20:07 عصر
چطور میتونم تعداد کل بایتهای یه فایل رو به دست بیارم که مثلا بشه همه بایتها رو با هم چک کرد- نه فقط 128 تا
TFileStream خصوصیت Size داره.


و اینکه چطور میتونم این 128 بایت را که با هم چک کردم اختلافشون رو تویه یه فایل جدید بنویسم
TFileStream متد Write داره.

درباره همون TFileStream، خصوصیات و متدهاش، و چگونگی کار کردن باهاش تحقیق کنید.

joooje
یک شنبه 26 دی 1389, 19:36 عصر
سلام
من در مورد TFileStream یکم جستجو کردم و در مورد نوشتن توی فایل یه چیزایی دستگیرم شد
ولی واقعا در مورد ساخت یه فایل خام که بتونم توی اون اختلاف اون دوتا فایل رو بنویسم چیزی گیرم نیومد
میشه لطفا راهنمایی کنید
ممنون

Felony
یک شنبه 26 دی 1389, 20:59 عصر
سلام
من در مورد TFileStream یکم جستجو کردم و در مورد نوشتن توی فایل یه چیزایی دستگیرم شد
ولی واقعا در مورد ساخت یه فایل خام که بتونم توی اون اختلاف اون دوتا فایل رو بنویسم چیزی گیرم نیومد
میشه لطفا راهنمایی کنید
ممنون
یه نمونه کد نوشتم ولی وقت نکردم تستش کنم ؛ فکر نمیکنم مشکلی داشته باشه :

var
File1, File2, NewFile: TFileStream;
B1, B2: TBytes;
i: Integer;
begin
File1:= TFileStream.Create('A.exe', fmOpenRead);
File2:= TFileStream.Create('B.exe', fmOpenRead);
NewFile:= TFileStream.Create('New.exe', fmCreate or fmOpenWrite);
try
SetLength(B1, File1.Size);
SetLength(B2, File1.Size);
File1.ReadBuffer(B1[0], Length(B1));
File2.ReadBuffer(B2[0], Length(B2));
for i:= Low(B1) to High(B1) do
if B1[i] <> B2[i] then
NewFile.WriteBuffer(B1[i], 1);
finally
File1.Free;
File2.Free;
NewFile.Free;
end;
end;

vcldeveloper
یک شنبه 26 دی 1389, 21:06 عصر
for i:= Low(B1) to High(B1) - 1 do
بعد از High(B1) نباید -1 بزارید.

Felony
یک شنبه 26 دی 1389, 21:10 عصر
بعد از High(B1) نباید -1 بزارید.
بله ، چون High خودش بالاترین مقدار رو برمیگردونه ، اون -1 رو خود دلفی در زمان نوشتن حلقه ایجاد کرد که من به اون دقت نکردم ، اصلاح شد .

joooje
سه شنبه 28 دی 1389, 09:03 صبح
سلام
ممون از کدی که گذاشتید
این زمانی درست کار میده که فایل اول که به File1 میدیم حجمش از فایل دوم کمتر باشه
ولی اگر حجمش بیشتر باشه هنگامی که کد رو اجرا میکنیم مشکل داره و ارور میده
البته من فکر کردم مشکل از اینه و کد رو اینطوری تغییر دادم ولی بازم مشکل حل نشد


var
File1, File2, NewFile: TFileStream;
B1, B2: array of Byte;
i: Integer;
begin
File1:= TFileStream.Create('D:\A.exe', fmOpenRead);
File2:= TFileStream.Create('D:\B.exe', fmOpenRead);
NewFile:= TFileStream.Create('D:\New.exe', fmCreate or fmOpenWrite);
try
SetLength(B1, File1.Size);
SetLength(B2, File1.Size);
File1.ReadBuffer(B1[0], Length(B1));
File2.ReadBuffer(B2[0], Length(B2));
if File1.Size < File2.Size then
begin
for i:= Low(B1) to High(B1) do
if B1[i] <> B2[i] then
NewFile.WriteBuffer(B1[i], 1);
end;
if File2.Size < File1.Size then
begin
for i:= Low(B2) to High(B2) do
if B1[i] <> B2[i] then
NewFile.WriteBuffer(B2[i], 1);
end;
finally
File1.Free;
File2.Free;
NewFile.Free;
end;
end;

ممنون میشم راهنمایی کنید