MSN Plus script di lettura / scrittura della memoria
-
30-09-2019 - |
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.
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:
-
lpBaseAddress
dovrebbe essere l'indirizzo in un altro processo che si sta scrivendo per. Dal momento che i puntihandle
al processo in corso, io non so nemmeno perché ci si chiama questa funzione per cominciare. Si può solo utilizzareStructP.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 ottenereWriteProcessMemory()
di lavoro a tutti -
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 specificaStructP
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 essereStructP
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.