PDA

View Full Version : کپی فایل های قفل شده توسط سیستم



gholami146
پنج شنبه 05 بهمن 1391, 01:43 صبح
سلام
من بدنبال استفاده از یک سری دستورات برای کپی کردن فایلهای تحت استفاده توسط سیستم عامل میگردم
من راه های بساری رو دیدم و تسط و خطا زدم ولی همگی دچار مشکل شدن و خطا زدن
از توابع ای پی ای گرفته تا استفاده از استریم
فقط تنها راه رو داخل بافر دیدم
من برای استفاده هندل فایل رو گرفته و مقدار اطلاعات اون رو داخل بافر میریزم
نکته : اولا که چطور میشه میزان بافر را با میزان بافر مورد نیاز فایل برابر کرد
دوما باید به عرض برسونم فایل ما باینری هست نه متنی

من یک سری کار انجام دادم اما برنامه من مشکل داره از دوستان میخوام کمک کنن

Felony
پنج شنبه 05 بهمن 1391, 04:45 صبح
نکته : اولا که چطور میشه میزان بافر را با میزان بافر مورد نیاز فایل برابر کرد
نمیشه ، باید فایل رو به صورت چند Chunk مختلف کپی کنید ، نمیتونید به اندازه کل فایل مورد نظر برای کپی بافر در نظر بگیرید .


دوما باید به عرض برسونم فایل ما باینری هست نه متنی
خوب که چی ؟!


من یک سری کار انجام دادم اما برنامه من مشکل داره از دوستان میخوام کمک کنن
یکسری کار یعنی چی ؟! ما از کجا بدونیم چه کاری انجام دادید ، تو اینجا داره رسم میشه هر کی میاد میگه من یکسری کار انجام دادم نشد ، پس یه سورس کامل بدید که بشه ... !

در آخر پست شماره 47 این تاپیک (http://barnamenevis.org/showthread.php?209792-%D8%B3%D9%88%D8%B1%D8%B3%D9%87%D8%A7%D9%8A-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%D9%8A&p=1179989&viewfull=1#post1179989) میتونه کمکتون کنه .

gholami146
پنج شنبه 05 بهمن 1391, 13:11 عصر
بله حق با شماست
اولا باید به عرض برسونم من قصد دارم که یک کپی از فایل SAM ویندوز بگیرم
اگه گفتم باینری بخاطر اینه که فایل رو در هنگام خواندی بصورت متنی ریست نکنن
اگه کد رو نزاشتم چون خیلی کد من ساده است متن برنامه من اینه

unit Unit1;

interface

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

type
TForm1 = class(TForm)
sButton1: TsButton;
sOpenDialog1: TsOpenDialog;
procedure sButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.sButton1Click(Sender: TObject);
var
Fromhandle,Tohandle:THandle;
Bufer:array of Byte;
size:Int64;
begin
if sOpenDialog1.Execute then
begin
try
Fromhandle:=FileOpen(sOpenDialog1.FileName,fmOpenR ead);
size:=GetFileSize(Fromhandle,nil);
Form1.Caption:=FloatToStr(size);
SetLength(Bufer,size);
FileRead(Fromhandle,Bufer,SizeOf(Bufer));
finally
FileClose(Fromhandle);
end;

//=============
try
Tohandle:=FileCreate('c:\sam');
FileWrite(Tohandle,bufer,SizeOf(Bufer));
finally
FileClose(Tohandle);
end;


end;
end;

end.

gholami146
پنج شنبه 05 بهمن 1391, 13:29 عصر
دوست عزیز اقای Mahan-1363 من برنامه شما را اجرا کردم ولی هیچ اتفاقی برای کپی فایل سم انجام نشد
من از اینترنت برنامه ای رو گرفتم به نام FFC_x86.exe که با دلفی نوشته شده و به راحتی فایل های سیستم رو کپی میکنه زمانی که من این برنامه رو از طریق انپک کردن بازش کردم و داخل سورس اون رو نگاه کردم دیدم که ابتدا یک هندل از فایل میگیره و اونو داخل بافر قرار میده بعد یک فایل در مسیر جدید میسازه و بافر رو داخل اون مینویسه
برای همین من این کد ها رو نوشتم و تا حدودی انجام شد ولی نه بصورت کامل
برای همین از شما درخواست تکمیل کد ها رو دارم

Felony
پنج شنبه 05 بهمن 1391, 14:41 عصر
من نگفتم از برنامه من برای این کار استفاده کن ، گفتم میتونه کمکتون کنه یعنی اینکه ازش ایده بگیرید ، کدتون باید همچین چیزی بشه ، البته وقت نشد کامل تستش کنم ، شاید مشکل داشته باشه ولی کلیت کار درسته :


var
FromHandle, ToHandle: THandle;
Buffer: array of Byte;
BufferSize: Cardinal;
Size, Pos: Int64;
begin
try
FromHandle := FileOpen('C:\Windows\System32\config\SAM', fmOpenRead);
ToHandle := FileCreate('E:\My_SAM_File');

Pos := 0;
Size := GetFileSize(FromHandle, nil);
BufferSize := (Size div 10);
SetLength(Buffer, BufferSize);
while (Pos < Size) do
begin
if (Pos + BufferSize > Size) then
begin ShowMessage('');
BufferSize := (Size - Pos);
SetLength(Buffer, BufferSize);
end;
FileRead(FromHandle, Buffer, BufferSize);
FileWrite(ToHandle, Buffer,BufferSize);
Inc(Pos, BufferSize);
FileSeek(FromHandle, Pos, soFromBeginning);
FileSeek(ToHandle, Pos, soFromBeginning);
Caption:= Format('%d : %d', [Pos, Size]);
Application.ProcessMessages;
end;
finally
ShowMessage('Copy Completed');
FileClose(FromHandle);
FileClose(ToHandle)
end;
end;

gholami146
پنج شنبه 05 بهمن 1391, 17:24 عصر
کد شما هم مثل کد من کار می کنه فقط با این تفاوت که مال من 256 کیلو رو 2 کیلو محاسبه میکنه و مال شما 4 گیگا بایت

Felony
پنج شنبه 05 بهمن 1391, 18:37 عصر
برنامه درست کار میکنه ( هم از لحاظ منطقی درسته و هم در کپی فایل های عادی دیگه مشکلی نداره ) ، من کد شما رو برای اون کار بررسی نکردم ، شما گفتی یه برنامه دیدی که چنین کاری کرده منم کدت رو بسته به نیازت تغییر دادم ، الان تست کردم برنامه نمیتونه هندل اون فایل SAM رو بگیره :


var
FromHandle: THandle;
Size: Int64;
begin
try
FromHandle := FileOpen('C:\Windows\System32\config\SAM', fmOpenRead);
Size := GetFileSize(FromHandle, nil);
ShowMessage(IntToStr(GetLastError));
Size:= ((Size div 1024) div 1024);
ShowMessage(IntToStr(Size) + ' MB');
finally
FileClose(FromHandle);
end;
end;

با صدا زدن GetLastError عدد 6 نمایش داده میشه که تو MSDN گفته :

Invalid Handle

پس باید بری دقیق ببینی اون برنامه چی کار کرده ( OllyDbg میتونه کمکت کنه ) .

gholami146
جمعه 06 بهمن 1391, 23:11 عصر
اقای تاجیک من برنامه ای رو که دیدم رو براتون میزارم شما بررسی کنید ببینید سر از کارش در میارید

Download (gholami.persiangig.com/Upload%20File/PORTABLE1.rar)