MSN Plus Script Read/Write Memory
-
30-09-2019 - |
سؤال
أنا أكتب على نص 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 في هذه العملية المستهدفة.
المشكلات التي أراها مع الكود الخاص بك هي:
lpBaseAddress
يجب أن يكون العنوان في عملية أخرى تكتب إليها. منذ الخاص بكhandle
يشير إلى العملية الحالية ، حتى أنني لا أعرف سبب استدعاء هذه الوظيفة لتبدأ. يمكنك فقط استخدامStructP.WriteWORD(Offset, Data)
لكتابة البيانات إلى الهيكل الخاص بك. لكنني سأفترض الآن أنك تفعل ذلك لأغراض الدسمة الدنيا العارية - لمعرفة ما إذا كان يمكنك الحصول علىWriteProcessMemory()
للعمل على الإطلاق.لا أعتقد أن هذا رمز صالح.
StructP.size
موجود ، لكنه int ، وليس كائن. ليس لديه عضو في DataPtr.StructP.DataPtr
موجود أيضا. في الواقع،StructP.DataPtr
هو ما يتم إرساله إذا حددت للتوStructP
وفقا لملف المساعدة. لذا هل تحاول الكتابة من الهيكل الأيمن مرة أخرى إلى الهيكل ، مرة أخرى ، كحد أدنى اختبار؟ إذا كان الأمر كذلك ، فيجب أن تكون كلا المؤشرتينStructP
بعد ذلك ، لا أعرف أين ReadInt()
الوظيفة التي تستخدمها تأتي من. يبدو لي أن Databloc لديه العديد من وظائف الأعضاء لقراءة القيم ، لكنك ستسميها مثل: hnd_ptr.ReadWORD(0)
أنا غير مندهش لأن الهيكل فارغ بعد الاتصال Process32FirstW()
, ، كما يتحقق من قيمة dwSize
عضو في الهيكل. نظرًا لأنك لا تكتب بنجاح ، أتوقع أن تكون القيمة عادة 0 ، وبالتالي لا توجد بيانات مكتوبة.
لم أكن أبداً مع Messger Plus ، لذلك عليك أن تسامحني قليلاً لكوني أشعر بالضيق من خلال الكثير من هذا. اسمحوا لي أن أعرف إذا كان أي من هذا مفيدًا.