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.

Était-ce utile?

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:

  1. lpBaseAddress doit être l'adresse dans un autre processus que vous écrivez. Étant donné que vos points de handle au processus actuel, je ne sais même pas pourquoi vous appelez cette fonction pour commencer. Vous pouvez simplement utiliser StructP.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 obtenir WriteProcessMemory() au travail du tout

  2. 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 simplement StructP 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 être StructP

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top