PDA

View Full Version : جستجو و تغییر دادن یک مقدار HEX در فایل های اجرایی



ICEMAN
یک شنبه 22 مهر 1386, 20:32 عصر
جستجو و تغییر دادن یک مقدار HEX در فایل های اجرایی

سلام ..
فک کنم سوالم مشخص
می خوام دنبال یه مقدار یه Hex بگردم توی یه فایل اجرایی و بتونم تغییرش بدم ؟
اگه بشه دنبال دستورات Assembly بگرده خیلی عالیه ؟

مثلا push ebp رو با یه jmp 0xxxxxxxxx عوض کنه
(نرم افزار نمی خوام که معرفی بشه)

ممنون

Developer Programmer
یک شنبه 22 مهر 1386, 22:31 عصر
می خوام دنبال یه مقدار یه Hex بگردم توی یه فایل اجرایی و بتونم تغییرش بدم ؟کاری نداره، یه خوندن و نوشتن بسیار ساده است.
مثلا اگر توی یه فایل اجرای، کد اسکی MZ رو جستجو کنی، دو بایت اول فایل رو نشونت میده.


بشه دنبال دستورات Assembly بگرده خیلی عالیهتصور نمیکنم چنین کاری ممکن باشه؛
خودت باید کد دستور رو پیدا کنی و اونرو داخل فایل جستجو کنی

ICEMAN
دوشنبه 23 مهر 1386, 08:49 صبح
کاری نداره، یه خوندن و نوشتن بسیار ساده است.
مثلا اگر توی یه فایل اجرای، کد اسکی MZ رو جستجو کنی، دو بایت اول فایل رو نشونت میده.
تصور نمیکنم چنین کاری ممکن باشه؛
خودت باید کد دستور رو پیدا کنی و اونرو داخل فایل جستجو کنی

تصور نمیکنی که ممکن باشه;
یعنی ممکن نیست که دنبال یه مقدار hex مثلا 0x55 یا همون push ebp بگردی و مثلا با یه مقدار Hex دیگه عوضش کنی ؟
یه کم کار کردم ,جای یه مقرار char رو از یه فایل exe با یه مقدار دیگه عوض کردم ,حالا اگه این کارو با مثلا "0x55" انجام بدم شاید بشه ؟ :-؟
یه جورایی میخوام patch کنم یه فایلی رو

Developer Programmer
دوشنبه 23 مهر 1386, 09:21 صبح
تصور نمیکنی که ممکن باشه;
منظورم، دنبال دستور اسمبلی گشتن بودن.


یه جورایی میخوام patch کنم یه فایلی رو
توی اینترنت سورس کدهای زیادی واسه اینکار پیدا میکنی. فورووم ها پر شده از پچرهای ساختگی

ICEMAN
دوشنبه 23 مهر 1386, 11:48 صبح
منظورم، دنبال دستور اسمبلی گشتن بودن.
توی اینترنت سورس کدهای زیادی واسه اینکار پیدا میکنی. فورووم ها پر شده از پچرهای ساختگی
برای دستورات اسمبلی هم منطقا میشه یه کارایی کرد disasm() و ... شاید ???

من هم زیاد گشتم یا keyword های خوبی انتخاب نکردم با منابع خوبی رو نمی شناختم اگه لطف کنی
چند نمونه از اون برنامه هایی که گفتی رو معرفی کنی ممنون میشم.
( منظورم از Patcher :که دنبال یه سری مقادیر Hex بگرده و بتونه اونا رو عوض کنه [صرفا نه دستورات در یک آدرس خاص مهم که بگرده دنبال اون مقادیر])
با زبون دیگه هم اگه باشه مشکلی نیست

Developer Programmer
دوشنبه 23 مهر 1386, 14:09 عصر
فکر کنم این صفحه بدردت بخوره
http://www.planet-source-code.com/vb/scripts/BrowseCategoryOrSearchResults.asp?lngWId=1&B1=Quick+Search&txtCriteria=Patcher&blnWorldDropDownUsed=TRUE&txtMaxNumberOfEntriesPerPage=10&blnResetAllVariables=TRUE&optSort=Alphabetical


این هم عکس یکی از برنامه ها
http://www.planet-source-code.com/Upload_PSC/ScreenShots/PIC2004851823173985.JPG

ICEMAN
دوشنبه 23 مهر 1386, 14:40 عصر
patch specific areas
بگرده و هر چی مثلا 00 می بینه تغییر بده , البته من هم دارم خودم مینویسم یه چیزایی شما هم به فکر باشید
ممنون :)

ICEMAN
چهارشنبه 25 مهر 1386, 12:59 عصر
این برنامه یه فایل Binary میگیره و hex شده اش رو در خروجی چاپ میکنه
حالا اگه اینو تو یه buffer لود کنیم میتونیم عمل مقایسه رو انجام بدیم
کسی نمونه کدی برای این کار داره



/*_ format83.c Thu Sep 17 1987 Modified by: Erik Lindberg */
/*
This program is released to the public domain. It can be
used for any purpose whatsoever. If you can get some poor
sucker to pay money for it, tell me your secret.

Prints a file to stdout in Intel HEX 83 format. I wrote this
to be easy to understand, modify, and *portable*. If you want
elegant, you can get there from here.
*/

#include <stdio.h>

#define REC 0x10 /* Size of a record. */

char *line, buffer[128];
FILE *infile;

extern char hex();

main(argc,argv)
int argc;
char *argv[];
{
int c=1, address=0;
int sum, i;
i=0;
if (!(infile = fopen(argv[++i],"rb"))) {
fprintf(stderr, "Error on open of file %s\n",argv[i]);
exit(1);
}

while (c != EOF) {
sum = 0;
line = buffer;
for (i=0; i<REC && (c=getc(infile)) != EOF; i++) {
*line++ = hex(c>>4);
*line++ = hex(c);
sum += c; /* Checksum each character. */
}
if (i) {
sum += address >> 8; /* Checksum high address byte.*/
sum += address & 0xff; /* Checksum low address byte.*/
sum += i; /* Checksum record byte count.*/
line = buffer; /* Now output the line! */
putchar(':');
puthex(i,2); /* Byte count. */
puthex(address,4); /* Do address and increment */
address += i; /* by bytes in record. */
puthex(0,2); /* Record type. */
for(i*=2;i;i--) /* Then the actual data. */
putchar(*line++);
puthex(0-sum,2); /* Checksum is 1byte 2's comp.*/
printf("\n");
}
}
printf(":00000001FF\n"); /* End record. */
}

/* Return ASCII hex character for binary value. */

char hex(c)
int c;
{
if((c &= 0x000f)<10)
c += '0';
else
c += 'A'-10;
return((char) c);
}

/* Put specified number of digits in ASCII hex. */

puthex(val,digits)
int val,digits;
{
if (--digits)
puthex(val>>4,digits);
putchar(hex(val & 0x0f));
}

Developer Programmer
چهارشنبه 25 مهر 1386, 16:28 عصر
ببینم مگه تو آدرسی که دادم، چیزی پیدا نشد ؟

Developer Programmer
پنج شنبه 26 مهر 1386, 09:39 صبح
چیزی رو که میخواستی واست ضمیمه کردم.
نمیدونم چطور سرچ میکنین که به جواب نمیرسین و نمیدونم چرا منتظرین یکی دیگه براتون بنویسه.

ICEMAN
شنبه 28 مهر 1386, 08:07 صبح
بابت فایل ها ممنون ولی شاید مشکل در انتخاب KeyWord بوده
میشه بگی شما چطوری search کردی با چه keyword هایی و کجا ؟