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

War es hilfreich?

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:

  1. lpBaseAddress sollte die Adresse in einem anderen Prozess sein, den Sie schreiben. Da Ihre handle Punkte auf den aktuellen Prozess, ich weiß nicht einmal, warum Sie diese Funktion beginnen nennen würden. Sie können nur StructP.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 Sie WriteProcessMemory() zur Arbeit überhaupt bekommen

  2. 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 nur StructP 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 Zeiger StructP

  3. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top