Pregunta

Estoy escribiendo sobre un guión Plus MSN, que es de hecho el javascript.
Para interoperabilidad con Windows hay una clase llamada Interop.
Con su sola función Call estática puede llamar s función especificada en una DLL especificada con hasta 12 argumentos.
Mi objetivo es escribir un script que recibe un nombre de proceso del PID.
He hecho todo bien, pero todavía no funciona.

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 función Process32FirstW siempre suceeds, pero la estructura está vacía.
La función WriteProcessMemory suceeds, también. Pero el número de bytes escritos es siempre 0.

¿Fue útil?

Solución

No tengo una máquina para probar cosas, pero su primera cuestión es que no parece estar pasando los parámetros adecuados a WriteProcessMemory :

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

Usted está pasando ...

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

Empecemos con una visión general de WriteProcessMemory: Se supone que tomar un fragmento de datos en el proceso curent, apuntado por lpBuffer, nTamaño bytes de longitud. Se copia a esos datos en el espacio de memoria del proceso indicado por hProcess y lugares que los datos en la dirección de lpBaseAddress en ese proceso objetivo.

Los problemas que veo con su código son:

  1. lpBaseAddress debe ser la dirección en otro proceso que se está escribiendo. Desde sus puntos handle al proceso actual, ni siquiera sé por qué te llama a esta función, para empezar. Usted sólo puede usar StructP.WriteWORD(Offset, Data) de datos de escritura a su estructura. Pero voy a presumir por ahora se está haciendo esto para fines mínimo demonstraction desnudos -. Para ver si puede obtener WriteProcessMemory() de trabajo en absoluto

  2. No creo que esto es aún un código válido. StructP.size existe, pero es un entero, no un objeto . No tiene ningún miembro de DataPtr. StructP.DataPtr también existe. De hecho, StructP.DataPtr es lo que se envía si sólo especifica StructP de acuerdo con el archivo de ayuda . Así que estás tratando de escribir de la estructura trasera derecha a de la estructura, una vez más, como una prueba mínima? Si es así, ambos punteros deben ser StructP

Después de eso, no sé donde la función ReadInt() está utilizando viene. A mi me parece como Databloc tiene varias funciones miembro para los valores de la lectura, pero los llamaría como: hnd_ptr.ReadWORD(0)

Estoy sorprendido de que la estructura está vacía después de llamar Process32FirstW(), como comprueba el valor del miembro dwSize de la estructura . Puesto que usted no está escribiendo con éxito a ella, espero que el valor es normalmente 0, y por lo tanto no se escriben datos.

nunca he tocado el violín con Messger Plus, por lo que tendrá que perdonarme un poco para ser confundido por una gran cantidad de este. Déjame saber si algo de esto era útil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top