Domanda

Sto scrivendo su una sceneggiatura Inoltre MSN, che è in realtà javascript.
Per interoperabilità con Windows esiste una classe chiamata Interop.
Con la sua sola funzione statica Call può chiamare s funzione specificata in una DLL specificato con un massimo di 12 argomenti.
Il mio obiettivo è quello di scrivere uno script che ottiene un nome di processo fuori del PID.
Ho fatto tutto per bene, ma ancora non lo fa il lavoro.

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;  
}  

La funzione Process32FirstW suceeds sempre, ma la struct è vuota.
La funzione WriteProcessMemory suceeds, anche. Ma il numero di byte scritti è sempre 0.

È stato utile?

Soluzione

Non ho una macchina per le cose di prova, ma il vostro primo problema è che non sembra che si stia passando i parametri corretti per WriteProcessMemory :

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

Si sta passando

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

La partenza di Let con una panoramica dei WriteProcessMemory: Si suppone di prendere un pezzo di dati nel processo curent, puntata da lpBuffer, nSize byte. Si copia i dati nello spazio di memoria del processo indicato dal hProcess e luoghi che i dati all'indirizzo lpBaseAddress in quel processo di destinazione.

I problemi che vedo con il tuo codice sono:

  1. lpBaseAddress dovrebbe essere l'indirizzo in un altro processo che si sta scrivendo per. Dal momento che i punti handle al processo in corso, io non so nemmeno perché ci si chiama questa funzione per cominciare. Si può solo utilizzare StructP.WriteWORD(Offset, Data) ai dati di scrittura per la vostra struttura. Ma io presumo per ora si sta facendo questo per scopi minima demonstraction nude -. Per vedere se è possibile ottenere WriteProcessMemory() di lavoro a tutti

  2. Non credo che questo è ancora un codice valido. StructP.size esiste, ma è un int, non un oggetto . Non ha membro DataPtr. StructP.DataPtr esiste anche. In realtà, StructP.DataPtr è ciò che viene inviato solo se si specifica StructP base al file di help . Quindi stai cercando di scrivere da la struttura posteriore destra a la struttura, ancora una volta, come un test minimo? In tal caso, entrambi i puntatori dovrebbero essere StructP

A seguito di questo, non so dove la funzione ReadInt() si utilizza proviene. Sembra a me come Databloc ha diverse funzioni membro per leggere i valori, ma li avrebbe chiamati come: hnd_ptr.ReadWORD(0)

Io sono sorpreso che la struttura è vuota dopo aver chiamato Process32FirstW(), come controlla il valore del membro dwSize della struttura . Dal momento che non si sta scrivendo con successo ad esso, mi aspetto che il valore è normalmente 0, e quindi non dati vengono scritti.

Non ho mai giocherellava con Messger Inoltre, quindi dovrete perdonare me un po 'per essere confuso da un sacco di questo. Fatemi sapere se tutto questo è stato utile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top