سؤال

أنا أكتب على نص MSN Plus ، وهو في الواقع JavaScript.
بالنسبة إلى interop مع Windows ، يوجد فئة تسمى Interop.
مع وظيفتها الثابتة Call يمكن للمرء استدعاء وظيفة محددة في DLL محدد مع ما يصل إلى 12 وسيط.
هدفي هو كتابة برنامج نصي يحصل على اسم العملية من PID.
لقد فعلت كل شيء بشكل صحيح ، لكنه لا يزال لا يعمل.

function GetProcNameFromPID(pid)  
{
    var hnd = Interop.Call("kernel32", "CreateToolhelp32Snapshot", 2, 0);
    var handle = Interop.Call("kernel32", "GetCurrentProcess");
    var StructP = Interop.Allocate(4+4+4+4+4+4+4+4+4+260);//*Allocate space for the ProcessEntry32 struct*
    var hnd_ptr = Interop.Allocate(4);
    var ress = Interop.Call("kernel32", "WriteProcessMemory", handle, StructP, StructP.size.DataPtr, 4, hnd_ptr);
    Debug.Trace(ReadInt(hnd_ptr, 0));
    var res = Interop.Call("kernel32", "Process32FirstW", hnd, StructP.DataPtr);
    if(!res)
    {
        Debug.Trace("FAAAAIIIILLLLL / " + Interop.Call("kernel32", "GetLastError") + " / " + ress);
    }
    else
    {
        do
        {
            var pos = 0;
            ReadInt(StructP, pos);
            ReadInt(StructP, pos);
            var owpid = ReadInt(StructP, pos);
            ReadInt(StructP, pos);
            ReadInt(StructP, pos);
            ReadInt(StructP, pos);
            var parpid = ReadInt(StructP, pos);
            ReadInt(StructP, pos);
            ReadInt(StructP, pos);
            ReadInt(StructP, pos);
            var name = ReadString(pos, 50);
            if(pid == owpid)
                return name;
            StructP = Interop.Allocate(4+4+4+4+4+4+4+8+4+50);
            Interop.Call("kernel32", "WriteProcessMemory", handle, StructP.DataPtr, StructP.size.DataPtr, 4, null);
        }
            while(Interop.Call("kernel32", "Process32NextW", hnd, StructP.DataPtr) == true)
    }
}
function ReadInt(buffer, pos)
{
var res = 0; 
    for(var i = 0; i >> 24;  
    var b2 = addr >> 24;  
    var b3 = addr >> 24;  
    var b4 = addr >> 24;  
    return b4 + b3*256 + b2*256*256 + b1*256*256*256;  
}  

ال Process32FirstW تعمل الوظيفة دائمًا ، لكن البنية فارغة.
ال WriteProcessMemory وظيفة succed ، أيضا. لكن عدد البايتات المكتوبة هو دائمًا 0.

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

المحلول

ليس لدي جهاز لاختبار الأشياء ، لكن مشكلتك الأولى هي أنك لا يبدو أنك تمر المعلمات المناسبة ل WriteProcessMemory:

BOOL WINAPI WriteProcessMemory(
  __in   HANDLE hProcess,
  __in   LPVOID lpBaseAddress,
  __in   LPCVOID lpBuffer,
  __in   SIZE_T nSize,
  __out  SIZE_T *lpNumberOfBytesWritten
);

أنت تمر ...

handle => hProcess,
StructP => lpBaseAddress, // ???
StructP.size.DataPtr => lpBuffer, // ???
4 => nSize,
hnd_ptr => lpNumberOfBytesWritten

لنبدأ بنظرة عامة عن WriteProcessMemory: من المفترض أن تأخذ جزءًا كبيرًا من البيانات في عملية Curent ، التي أشار إليها Lpbuffer ، بايت طويل. يقوم بنسخ هذه البيانات إلى مساحة ذاكرة العملية المشار إليها بواسطة HProcess والأماكن التي تضع البيانات الموجودة على العنوان LPBaseadDress في هذه العملية المستهدفة.

المشكلات التي أراها مع الكود الخاص بك هي:

  1. lpBaseAddress يجب أن يكون العنوان في عملية أخرى تكتب إليها. منذ الخاص بك handle يشير إلى العملية الحالية ، حتى أنني لا أعرف سبب استدعاء هذه الوظيفة لتبدأ. يمكنك فقط استخدام StructP.WriteWORD(Offset, Data) لكتابة البيانات إلى الهيكل الخاص بك. لكنني سأفترض الآن أنك تفعل ذلك لأغراض الدسمة الدنيا العارية - لمعرفة ما إذا كان يمكنك الحصول على WriteProcessMemory() للعمل على الإطلاق.

  2. لا أعتقد أن هذا رمز صالح. StructP.size موجود ، لكنه int ، وليس كائن. ليس لديه عضو في DataPtr. StructP.DataPtr موجود أيضا. في الواقع، StructP.DataPtr هو ما يتم إرساله إذا حددت للتو StructP وفقا لملف المساعدة. لذا هل تحاول الكتابة من الهيكل الأيمن مرة أخرى إلى الهيكل ، مرة أخرى ، كحد أدنى اختبار؟ إذا كان الأمر كذلك ، فيجب أن تكون كلا المؤشرتين StructP

بعد ذلك ، لا أعرف أين ReadInt() الوظيفة التي تستخدمها تأتي من. يبدو لي أن Databloc لديه العديد من وظائف الأعضاء لقراءة القيم ، لكنك ستسميها مثل: hnd_ptr.ReadWORD(0)

أنا غير مندهش لأن الهيكل فارغ بعد الاتصال Process32FirstW(), ، كما يتحقق من قيمة dwSize عضو في الهيكل. نظرًا لأنك لا تكتب بنجاح ، أتوقع أن تكون القيمة عادة 0 ، وبالتالي لا توجد بيانات مكتوبة.

لم أكن أبداً مع Messger Plus ، لذلك عليك أن تسامحني قليلاً لكوني أشعر بالضيق من خلال الكثير من هذا. اسمحوا لي أن أعرف إذا كان أي من هذا مفيدًا.

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