PDA

View Full Version : تغییر در فایل exe با کد نویسی



mojtaba_z
چهارشنبه 24 مرداد 1386, 15:26 عصر
سلام
یه فایل exe رو با Hex Editor باز کردم و توی آدرس خاصی از فایل رو تغییر دادم و ذخیره کردم .
حالا چون بطور مکرر باید اون فایل و اون آدرس خاص رو تغییر بدم ، چطوری میشه با کد نویسی در دلفی اون آدرس خاص رو بخونم و تغییر بدم بطوری که فایل exe قابل اجرا باشه؟

Hadizadeh
چهارشنبه 24 مرداد 1386, 16:36 عصر
در حالت عادی نمیشه چون فایل اجرائیت بازه و سیستم عامل اون رو قفل می کنه.

Hadizadeh
چهارشنبه 24 مرداد 1386, 16:38 عصر
اگه فایل اجرائیت در حال اجرا نیست میشه به شرط اینکه جای مناسبی رو تغییر داده باشی . مثلا یه جایی که توی اون فرضا caption فرمت نوشته شده. مثلا اگه قبلا بوده Test حالا تو می تونی با خیال راحت بری فقط همین 4 تا کاراکتر رو تغییر بدی نه بیشتر.

persianboy
چهارشنبه 24 مرداد 1386, 18:41 عصر
اینم یه سمپل خوب واسه شما . دقت کن این با offset کار میکنه .

mojtaba_z
پنج شنبه 25 مرداد 1386, 08:37 صبح
از توی دلفی میخوام یه فایل exe دیگه رو که در حال اجرا هم نیست تغییر بدم.
آقای persianboy ،فکر میکنم منظورم رو درست متوجه شدید ولی مثال تون رو نفهمیدم .
محل یه آدرس خاص از فایل exe رو چطوری میتونم پیدا کنم ؟ یعنی مثلا من اون فایل exe رو با Hex Editor باز میکنم و یه جایی از اون کنار سطر نوشته : 0x0A2580 که در ستون دوازدهم هستش و مقدارش مثلا 6F میباشد. (سطر 0x0A2580 و ستون 12) . من میخوام مقدار 6F رو همیشه تغییر بدم . این مقدار 6F با توجه به سطر و ستونش چه آدرسی داره ؟ و چطوری تغییرش بدم ؟

persianboy
پنج شنبه 25 مرداد 1386, 12:44 عصر
ببین این سمپلی که من گذاشتم ، مخصوص اینه که همیشه یه فایل ثابت داشته باشی و بخوای یه تغییر ثابت رو توش اعمال کنی . مثلا تو این مثالی که گفتی آدرس سطر A2580 و ستون 12
میشه : A258C ( چرا ؟ چون این اعداد تو مبنای 16 هستن و آدرس اولیه شما + 9 میشود : A2589 و این آدرس +1 میشود : A258A و همین آدرس آخری + 2 میشود : A258C )
در حقیقت شماره سطر داره آدرس اولین ستون از اون سطر رو نشون میده که اضافه شدن ستون ها ، اضافه شدن آدرس در مبنای 16 رو نتیجه میده +( به ازای هر ستون ، یک واحد )
حالا کاری که شما باید بکنید اینه که :
فرض کنید 6F رو میخواین به E0 تبدیل کنید ، ما برای این کار دیگه هیچ احتیاجی به 6F نداریم .
پس توی رویداد دکمه patch این تغییر رو اعمال میکنید :


Const A: Array[1..1] of Record {<-------- 1 byte to be patched}
A : Longint;
B : Byte;
End =
((A:$A258C;B:$E0));

البته سمپل من برای اعمال تغییرات توی دو بایت از فایل مورد نظر بود ، پس شما باید یکیشو پاک
کنید . یعنی از توی const ، آرایه دوم و از توی بلوک ، این کد رو باید پاک کنید :


Seek(F,c[I].c);
Ch:=Char(c[I].B);
Blockwrite(F,Ch,1);

اگه مشکلی بود بازم اطلاع بده .