سؤال

قرأت بعض البيانات من عملية (العنوان:0 * 58 * 03 درجة مئوية) باستخدام وظيفة وينابي ReadProcessMemory:

DWORD proc_id;
GetWindowThreadProcessId(hwnd, &proc_id);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
int value=0;

while (1)
{
    ReadProcessMemory(hProcess, (LPVOID)0x58F03C, &value, sizeof(value), 0);
    cout << "val: " << value << endl;
}

نظرا لأن العنوان يتغير في كل مرة أعيد فيها تشغيل العملية ، تساءلت عما إذا كانت هناك طريقة للحصول دائما على نفس العنوان?يجب أن يكون هناك واحد لأنني أرى الكثير من" برامج المدرب " القادرة على القيام بذلك.كيف يحصلون على قيمة العنوان الصحيح للقراءة من / الكتابة إلى?

حاليا أحصل عليه عن طريق المسح الضوئي لقيمة مع CheatEngine وإجراء فحص المقبل للقيمة التي تم تغييرها.

شكرا.

هل كانت مفيدة؟

المحلول

كنت تواجه تخصيص الذاكرة الديناميكية.في عالم تشيتنجين ، وتسمى هذه 'مؤشرات'.

النظر في بعض البيانات (على سبيل المثال uint32_t/DWORD) داخل الذاكرة التي كانت malloc'د.إذا وجدت عنوان البيانات، فليس هناك ما يضمن أنه في المرة التالية التي تقوم فيها بتشغيل العملية ، سيكون العنوان هو نفسه.وذلك لأن الذاكرة التي تم إرجاعها بواسطة malloc يمكن أن تستند إلى نقطة مختلفة في الذاكرة.

الحيلة المستخدمة لهزيمة تخصيص الذاكرة الديناميكية هي العثور على عنوان كومة ثابت يمكن أن يقودك إلى عنوان القيمة التي تهتم بها.البرنامج التعليمي تشيتنجين يظهر لك كيف يتم ذلك.الأمر نفسه ينطبق على المؤشرات متعددة المستويات.على مستوى أعلى ، وهذا يتوافق مع الذاكرة المخصصة ديناميكيا الذي يحمل مؤشر إلى بعض الذاكرة المخصصة ديناميكيا الأخرى ، وهلم جرا.

الطريقة المستخدمة في تشيتنجين للحصول على مؤشرات يعمل تقريبا مثل هذا:

  • قم بتعيين نقطة توقف أجهزة الوصول على عنوان قيمة البيانات التي تهتم بها
  • عندما يصل رمز ذلك ، فإن نقطة توقف الأجهزة تظهر لك ما يبدو رمز مثل

سوف رمز تبدو عادة شيء من هذا القبيل:

mov eax, 0x1234ABCD 
dec dword ptr ds:[eax+0x85]

هذا قد يتوافق مع بعض التعليمات البرمجية التي تقلل من حصان الخاص بك عندما ضرب من قبل العدو.0 * 1234البوكسيت هو المؤشر في هذه الحالة و 0 * 85 الإزاحة.في كود ج ، ربما حدث هذا:

struct some_struct* blah = malloc(...);
...
blah->HP--;

0 * 1234 سيكون الدودي الدودي عنوان blah.قيمة هب يعيش في مكان ما داخل كتلة أشار إليها blah.الإزاحة في كتلة الذاكرة هي 0 * 85.ثم إذا كنت تكتب مدربا ، فستقرأ DWORD (QWORD إذا كان 64 بت) عند 0 * 1234 ، أضف 0 * 85 إلى القيمة.هذا من شأنه أن يعطيك عنوان قيمة هب.

نصائح أخرى

سيعمل ذلك إذا كان العنوان في الجزء القابل للتنفيذ من قسم البيانات حيث لا يعيش المتغيرات Preallocated (غير مناسب لكومة الكومة والمكدسة) ...

إلقاء نظرة على "تعداد جميع الوحدات النمطية لعملية" مثال على MSDN .

يستخدم enumprocessModules () للحصول على مقابض وحدة.تلك هي عناوين قاعدة الصورة.

يمكنك الحصول على عنوان قاعدة الصورة للتنفيذ وضبط عنوانك عن طريق ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top