msn plus de scripts en lecture / écriture mémoire
-
30-09-2019 - |
Question
J'écris sur un script pour MSN Plus, qui est en fait javascript.
Pour Interop avec Windows, il y a une classe appelée Interop
.
Avec sa une fonction statique Call
peut appeler s fonction spécifiée dans une dll spécifiée avec jusqu'à 12 arguments.
Mon but est d'écrire un script qui obtient un nom de processus de PID.
J'ai tout bien fait, mais il ne fonctionne toujours pas.
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 fonction Process32FirstW
toujours proprement déroulée, mais le struct est vide.
La fonction WriteProcessMemory
proprement déroulée aussi. Mais le nombre d'octets écrits est toujours 0.
La solution
Je n'ai pas une machine à des choses de test, mais votre première question est que vous ne semblez pas passer les paramètres propres à WriteProcessMemory
:
BOOL WINAPI WriteProcessMemory(
__in HANDLE hProcess,
__in LPVOID lpBaseAddress,
__in LPCVOID lpBuffer,
__in SIZE_T nSize,
__out SIZE_T *lpNumberOfBytesWritten
);
Vous qui passe ...
handle => hProcess,
StructP => lpBaseAddress, // ???
StructP.size.DataPtr => lpBuffer, // ???
4 => nSize,
hnd_ptr => lpNumberOfBytesWritten
Soit Commençons avec une vue d'ensemble WriteProcessMemory: Il est censé prendre un morceau de données dans le processus curent, pointé par lpBuffer, nTaille octets. Il copie que les données dans l'espace mémoire du processus indiqué par hProcess et lieux que les données à l'lpBaseAddress d'adresse dans ce processus cible.
Les problèmes que je vois avec votre code sont:
-
lpBaseAddress
doit être l'adresse dans un autre processus que vous écrivez. Étant donné que vos points dehandle
au processus actuel, je ne sais même pas pourquoi vous appelez cette fonction pour commencer. Vous pouvez simplement utiliserStructP.WriteWORD(Offset, Data)
aux données d'écriture à votre structure. Mais je suppose que pour l'instant que vous faites cela à des fins de demonstraction strict minimum -. Pour voir si vous pouvez obtenirWriteProcessMemory()
au travail du tout -
Je ne pense pas que ce soit même code valide.
StructP.size
existe, mais il est un entier, pas un objet. Il n'a pas membre DataPtr.StructP.DataPtr
existe aussi. En fait,StructP.DataPtr
est ce qui est envoyé si vous spécifiez simplementStructP
selon le fichier d'aide . Donc, vous essayez d'écrire de la structure arrière droit la structure, encore une fois, comme un test minimum? Dans ce cas, les deux pointeurs doivent êtreStructP
Par la suite, je ne sais pas où la fonction ReadInt()
que vous utilisez vient. Il me semble que Databloc a plusieurs fonctions membres pour la lecture des valeurs, mais vous les appeler comme: hnd_ptr.ReadWORD(0)
Je suis unsurprised que la structure est vide après avoir appelé Process32FirstW()
, comme il vérifie la valeur de l'élément dwSize
de la structure . Puisque vous n'êtes pas en train d'écrire avec succès, je pense que la valeur est normalement 0, et donc pas des données écrites.
Je ne l'ai jamais tripoté Messger De plus, vous aurez à me pardonner un peu d'être stupéfié par beaucoup de cela. Permettez-moi de savoir si tout cela était utile.