msn Plus Skript Schreib- / Lesespeicher
-
30-09-2019 - |
Frage
Ich schreibe auf einem MSN Plus-Skript, das in der Tat Javascript ist.
Für Interop mit Windows-gibt es eine Klasse namens Interop
.
Mit ihrer statischen Funktion Call
man kann s angegebene Funktion in einer bestimmten DLL mit bis zu 12 Argumente nennen.
Mein Ziel ist es, ein Skript zu schreiben, die einen Namen aus der PID-Prozess erhält.
Ich habe alles richtig gemacht, aber es funktioniert immer noch nicht.
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; }
Die Process32FirstW
Funktion immer suceeds, aber die Struktur ist leer.
Die WriteProcessMemory
Funktion suceeds auch. Aber die Anzahl der geschriebenen Bytes ist immer 0
Lösung
Ich weiß nicht, eine Maschine zu Test Dinge haben, aber Ihre erste Frage ist, Sie scheinen nicht vorbei zu sein die richtigen Parameter zu WriteProcessMemory
:
BOOL WINAPI WriteProcessMemory(
__in HANDLE hProcess,
__in LPVOID lpBaseAddress,
__in LPCVOID lpBuffer,
__in SIZE_T nSize,
__out SIZE_T *lpNumberOfBytesWritten
);
Sie vorbei ...
handle => hProcess,
StructP => lpBaseAddress, // ???
StructP.size.DataPtr => lpBuffer, // ???
4 => nSize,
hnd_ptr => lpNumberOfBytesWritten
Beginnen wir mit einem Überblick über Write: es angenommen hat, einen Teil der Daten in dem curent Prozess zu nehmen, auf die durch lpBuffer Bytes nSize lang. Es kopiert die Daten in den Speicherbereich des Prozesses durch hProcess angegeben und Orte, die Daten an der Adresse lpBaseAddress in diesem Zielprozess.
Die Probleme, die ich mit Ihrem Code zu sehen sind:
-
lpBaseAddress
sollte die Adresse in einem anderen Prozess sein, den Sie schreiben. Da Ihrehandle
Punkte auf den aktuellen Prozess, ich weiß nicht einmal, warum Sie diese Funktion beginnen nennen würden. Sie können nurStructP.WriteWORD(Offset, Data)
zu Schreibdaten zu Ihrer Struktur verwenden. Aber ich werde jetzt nehme an, Sie sind diese demonstraction Zwecke für Nötigste tun -., Um zu sehen, ob SieWriteProcessMemory()
zur Arbeit überhaupt bekommen -
Ich glaube nicht, dies auch gültige Code ist.
StructP.size
existiert, aber es ist ein int, kein Objekt . Es hat kein DataPtr Mitglied.StructP.DataPtr
existiert auch. In der Tat,StructP.DataPtr
ist was passiert, wenn Sie nurStructP
nach der Hilfe-Datei . Also versuchen Sie zu schreiben von die Struktur rechts zurück die Struktur wieder als Mindest Test? Wenn ja, sollten beiden ZeigerStructP
sein
Im Anschluss daran, ich weiß nicht, wo die ReadInt()
Funktion Sie verwenden herkommt. Es scheint mir, wie Databloc mehrere Member-Funktionen zum Lesen von Werten hat, aber man würde sich wie nennen: hnd_ptr.ReadWORD(0)
Ich bin nicht überrascht, dass die Struktur nach dem Aufruf Process32FirstW()
leer ist, wie überprüft er den Wert des dwSize
Mitglied der Struktur . Da Sie es nicht erfolgreich schreiben, erwarte ich, dass dieser Wert normalerweise 0 ist und somit keine Daten geschrieben werden.
Ich habe noch nie mit Messger Plus-nestle, so dass Sie mir ein wenig verzeihen müssen würden für eine Menge von diesem benebelt werden. Lassen Sie mich wissen, ob irgendetwas davon war nützlich.