سؤال

أحاول قراءة ذاكرة عملية باستخدام التعليمات البرمجية التالية:

void readdata(HANDLE phandle, LPCVOID paddress, SIZE_T datasize)
{
    char *buff;
    SIZE_T dataread;
    BOOL b = FALSE;

    buff = (char *) malloc (datasize);

    b = ReadProcessMemory(phandle, paddress, (LPVOID)buff, datasize, &dataread); 
    if(!b)
    {
        printf("error reading memory, err = %d\n", GetLastError());
        return;
    }

    printf("Data Read             = %d\n", dataread);
    printf("Len of actual buffer  = %d\n", strlen(buff));
    printf("Data = %s\n", buff);

    free(buff);
    return;
}

الآن، من المعروف أن الفتات والبلد بيكويز اعتدت على إعادة الكتابة لدي القيم من هناك. DataSize معروف أيضا.

تعمل الوظيفة موافق، باستثناء ما يلي. ReadProcessMemory () إرجاع DataRead = 41 (وهو صحيح، مررت 41 إلى DataSize) ولكن الطول الفعلي للوفيق هو 49. عندما أطبع برتقالي أحصل على سلسلة + بعض القمامة.

ما الخطأ الذي افعله؟

رمز موضع تقدير.

شكرًا!

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

المحلول

من المحتمل أن لا يتم نسخ " 0" في نهاية السلسلة، إما خارج المخزن المؤقت الخاص بك عند الكتابة، أو في المخزن المؤقت الخاص بك عند القراءة. نتيجة لذلك، تتم طباعة Printf () فقط من بداية السلسلة الخاصة بك حتى يرى " 0"، والتي قد تكون بعد عدد من أحرف القمامة.

نصائح أخرى

هل تعرف أن البيانات التي تقرأها هي سلسلة؟ بمعنى آخر. أنه قد تم إنهاء null؟ إذا لم يكن الأمر كذلك باستخدام Strlen () مضمونة لتكون غير موثوق بها.

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