PDA

View Full Version : پيدا كردن مكان يك متغير در برنامه



sara Afshar
دوشنبه 11 شهریور 1392, 13:58 عصر
سلام دوستان
من يك برنامه دارم مينويسم كه توي اون بايد به بعضي از متغيرهايي كه در كد يك فايل اجرايي هستند، مقدار بدم و براي اين كار بايد بدونم كه اون متغيرها در كدوم بايت از برنامه قرار گرفته اند تا در همون مكان بگم كه مقادير به كد اضافه بشن. كسي ميدونه چه جوري بايد اين رو بفهمم؟ :متفکر:

بهروز عباسی
دوشنبه 11 شهریور 1392, 17:25 عصر
:متعجب:
درود

اگه ممکنه قبل از هر چیز بگین به علت می خواین این کارو انجام بدین ؟
و اینکه شما قصد دارین این کارو به صورت ایستا یا دینامیک انجام بدین ؟

UfnCod3r
دوشنبه 11 شهریور 1392, 17:47 عصر
چی می شد یکم بهتر توضیح می دادی
برای اینکار می تونی از اشتراک حافظه استفاده کنی طوری که متغیر هایی که می خوای رو با توابع سیستم عامل شیر می کنی بعد ت وفایل های اجرایی دیگه همی می تونی از اون استفاده کنی
راحت ترینش همینه فکر کنم
اگه یکی از برنامه هات به صورت DLL باشه و با اون یکی برنامه لود بشه این دوتا با هم دوست میشن و می تونی به حافظه ها شون دست بزنی
وگرنه بی اجازه نمیشه هر قسمتی از حافظه رو دست زد.
که البته می شه .:لبخند:

Felony
دوشنبه 11 شهریور 1392, 19:51 عصر
حافظه اختصاص داده شده به پروسه ها در User Mode در ویندوز از هم کپسوله هستند و هیچ پروسه ای نمیتونه در User Mode به صورت عادی به Address Space پروسه دیگه دسترسی پیدا کنه ، بنابراین هر سناریویی مبنی بر خوندن یک قسمت از حافظه / جستجو به دنبال آیتمی خا در حافظه برنامه دیگه و ... در حالت عادی باطل هست ؛

چند راه برای انجام سناریو مورد نظر دارید :

* اگر سورس برنامه مقصد که میخواین حافظش رو بخونید دارید ، راه درست به اشتراک گذاری قسمتی از حافظه هست ، البته نه به روشی که دوستمون در پست قبل گفت ، راه درست Map کردن قسمتی از حافظه به وسیله توابع مربوطه ( Memory Mapped Files ) هست ، که در این صورت با رجیستر کردن پیغامی بین تو برنامه میتونید از تغییر مقدار این قسمت از حافظه مطلع بشید .

* راه دیگه ، نوشتن یک دیباگر ( البته در حد بسیار ابتدایی هست ) ، در این مورد توابعی مثل DebugActiveProcess میتونه کمکتون کنه ، البته کار با این توابع اصول و مبانی خاص خودش رو داره .

* راه دیگه استفاده از توابعی مثل ReadProcessMemory و WriteProcessMemory هست ، که این ها هم اما و اگرهایی دارن ، مثلا داشتن دسترسی PROCESS_VM_READ .

* راه دیگه تزریق کد به پروسه مقصد جهت خوندن و نوشتن از / در حافظه است .

* راه آخر هم نوشتن درایور Kernel Mode هست .

موفق باشید :)

UfnCod3r
دوشنبه 11 شهریور 1392, 20:10 عصر
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551%28v=vs.85%29.aspx
:لبخندساده:

sara Afshar
چهارشنبه 13 شهریور 1392, 22:23 عصر
دوستان شرمنده بابت توضيح نامفهومم، فك كنم بد متوجه شدين
من میخوام به جای اینکه موقع کد نوشتن مقدار یک متغیر رو معلوم کنم بعد از build شدن کد و درست شدن exe با استفاده از تابع هایی در زبان C++‎‎ اینکار و انجام بدم.
با دستورات زير فايل exe رو ميخونم
std::ifstream in(sStubPath, std::ios::in | std::ios::binary);
in.read(bStub, s);
در دستور زير كه ميخواهم مقادير bInfos را به مقادير bstub اضافه كنم بايد به جاي size عددي رو بنويسم كه مشخص مي كند كه مقادير bInfos به كجاي bStub اضافه بشه، يعني متغيري كه ميخواهم مقدار دهي كنم در كدام بايت از برنامه قرار دارد.
memcpy( bStub + size, bInfos, sParameters.length());

هر جاش نامفهومه بگين بيشتر توضيح بدم، كل برنامه ام به خاطر اين خوابيده! براي مثال با IDA PRO يا هر نرم افزار مهندسي معكوس ديگه ميشه مكان متغير رو پيدا كرد و در تابع به جاي size گذاشت؟ يا هر كار ديگه...؟

UfnCod3r
چهارشنبه 13 شهریور 1392, 23:38 عصر
من که نفهمیدم چی می گی . می خوی فایل بخونی یا متغیر تو حافظه رو :متفکر: